mirror of
https://github.com/systemd/systemd
synced 2026-04-03 13:44:55 +02:00
Compare commits
10 Commits
d874a13efc
...
84f261853c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
84f261853c | ||
|
|
a0ac3652fc | ||
|
|
0cfb0971f0 | ||
|
|
788a0ef179 | ||
|
|
ad102dd09a | ||
|
|
874cbf675d | ||
|
|
7cdd5c0d4c | ||
|
|
30df35869c | ||
|
|
67302b38b4 | ||
|
|
005daeed2b |
@ -401,3 +401,35 @@ and `homectl`:
|
|||||||
current and a future password are required, for example if the password is to
|
current and a future password are required, for example if the password is to
|
||||||
be changed. In that case `$PASSWORD` shall carry the current (i.e. old)
|
be changed. In that case `$PASSWORD` shall carry the current (i.e. old)
|
||||||
password and `$NEWPASSWORD` the new.
|
password and `$NEWPASSWORD` the new.
|
||||||
|
|
||||||
|
`systemd-homed`:
|
||||||
|
|
||||||
|
* `$SYSTEMD_HOME_ROOT` – defines an absolute path where to look for home
|
||||||
|
directories/images. When unspecified defaults to `/home/`. This is useful for
|
||||||
|
debugging purposes in order to run a secondary `systemd-homed` instance that
|
||||||
|
operates on a different directory where home directories/images are placed.
|
||||||
|
|
||||||
|
* `$SYSTEMD_HOME_RECORD_DIR` – defines an absolute path where to look for
|
||||||
|
fixated home records kept on the host. When unspecified defaults to
|
||||||
|
`/var/lib/systemd/home/`. Similar to `$SYSTEMD_HOME_ROOT` this is useful for
|
||||||
|
debugging purposes, in order to run a secondary `systemd-homed` instance that
|
||||||
|
operates on a record database entirely separate from the host's.
|
||||||
|
|
||||||
|
* `$SYSTEMD_HOME_DEBUG_SUFFIX` – takes a short string that is suffixed to
|
||||||
|
`systemd-homed`'s D-Bus and Varlink service names/sockets. This is also
|
||||||
|
understood by `homectl`. This too is useful for running an additiona copy of
|
||||||
|
`systemd-homed` that doesn't interfere with the host's main one.
|
||||||
|
|
||||||
|
* `$SYSTEMD_HOMEWORK_PATH` – configures the path to the `systemd-homework`
|
||||||
|
binary to invoke. If not specified defaults to
|
||||||
|
`/usr/lib/systemd/systemd-homework`.
|
||||||
|
|
||||||
|
Combining these four environment variables is pretty useful when
|
||||||
|
debugging/developing `systemd-homed`:
|
||||||
|
```sh
|
||||||
|
SYSTEMD_HOME_DEBUG_SUFFIX=foo \
|
||||||
|
SYSTEMD_HOMEWORK_PATH=/home/lennart/projects/systemd/build/systemd-homework \
|
||||||
|
SYSTEMD_HOME_ROOT=/home.foo/ \
|
||||||
|
SYSTEMD_HOME_RECORD_DIR=/var/lib/systemd/home.foo/ \
|
||||||
|
/home/lennart/projects/systemd/build/systemd-homed
|
||||||
|
```
|
||||||
|
|||||||
@ -31,6 +31,12 @@
|
|||||||
/* magic string to find in the binary image */
|
/* magic string to find in the binary image */
|
||||||
_used_ _section_(".sdmagic") static const char magic[] = "#### LoaderInfo: systemd-boot " GIT_VERSION " ####";
|
_used_ _section_(".sdmagic") static const char magic[] = "#### LoaderInfo: systemd-boot " GIT_VERSION " ####";
|
||||||
|
|
||||||
|
/* Makes systemd-boot available from \EFI\Linux\ for testing purposes. */
|
||||||
|
_used_ _section_(".osrel") static const char osrel[] =
|
||||||
|
"ID=systemd-boot\n"
|
||||||
|
"VERSION=\"" GIT_VERSION "\"\n"
|
||||||
|
"NAME=\"systemd-boot " GIT_VERSION "\"\n";
|
||||||
|
|
||||||
enum loader_type {
|
enum loader_type {
|
||||||
LOADER_UNDEFINED,
|
LOADER_UNDEFINED,
|
||||||
LOADER_EFI,
|
LOADER_EFI,
|
||||||
|
|||||||
@ -323,14 +323,15 @@ if have_gnu_efi
|
|||||||
input : so,
|
input : so,
|
||||||
output : tuple[1],
|
output : tuple[1],
|
||||||
command : [objcopy,
|
command : [objcopy,
|
||||||
'-j', '.text',
|
|
||||||
'-j', '.sdata',
|
|
||||||
'-j', '.sbat',
|
|
||||||
'-j', '.sdmagic',
|
|
||||||
'-j', '.data',
|
'-j', '.data',
|
||||||
'-j', '.dynamic',
|
'-j', '.dynamic',
|
||||||
'-j', '.dynsym',
|
'-j', '.dynsym',
|
||||||
|
'-j', '.osrel',
|
||||||
'-j', '.rel*',
|
'-j', '.rel*',
|
||||||
|
'-j', '.sbat',
|
||||||
|
'-j', '.sdata',
|
||||||
|
'-j', '.sdmagic',
|
||||||
|
'-j', '.text',
|
||||||
efi_format,
|
efi_format,
|
||||||
'@INPUT@', '@OUTPUT@'],
|
'@INPUT@', '@OUTPUT@'],
|
||||||
install : true,
|
install : true,
|
||||||
|
|||||||
@ -525,6 +525,7 @@ static int save_external_coredump(
|
|||||||
if (lseek(fd, 0, SEEK_SET) == (off_t) -1)
|
if (lseek(fd, 0, SEEK_SET) == (off_t) -1)
|
||||||
return log_error_errno(errno, "Failed to seek on coredump %s: %m", fn);
|
return log_error_errno(errno, "Failed to seek on coredump %s: %m", fn);
|
||||||
|
|
||||||
|
*ret_filename = TAKE_PTR(fn);
|
||||||
*ret_data_fd = TAKE_FD(fd);
|
*ret_data_fd = TAKE_FD(fd);
|
||||||
*ret_size = (uint64_t) st.st_size;
|
*ret_size = (uint64_t) st.st_size;
|
||||||
*ret_truncated = truncated;
|
*ret_truncated = truncated;
|
||||||
|
|||||||
@ -133,3 +133,7 @@ int bus_message_append_secret(sd_bus_message *m, UserRecord *secret) {
|
|||||||
|
|
||||||
return sd_bus_message_append(m, "s", formatted);
|
return sd_bus_message_append(m, "s", formatted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *home_record_dir(void) {
|
||||||
|
return secure_getenv("SYSTEMD_HOME_RECORD_DIR") ?: "/var/lib/systemd/home/";
|
||||||
|
}
|
||||||
|
|||||||
@ -25,3 +25,5 @@ int bus_message_append_secret(sd_bus_message *m, UserRecord *secret);
|
|||||||
/* Many of our operations might be slow due to crypto, fsck, recursive chown() and so on. For these
|
/* Many of our operations might be slow due to crypto, fsck, recursive chown() and so on. For these
|
||||||
* operations permit a *very* long timeout */
|
* operations permit a *very* long timeout */
|
||||||
#define HOME_SLOW_BUS_CALL_TIMEOUT_USEC (2*USEC_PER_MINUTE)
|
#define HOME_SLOW_BUS_CALL_TIMEOUT_USEC (2*USEC_PER_MINUTE)
|
||||||
|
|
||||||
|
const char *home_record_dir(void);
|
||||||
|
|||||||
@ -300,9 +300,9 @@ int home_save_record(Home *h) {
|
|||||||
return r;
|
return r;
|
||||||
|
|
||||||
(void) mkdir("/var/lib/systemd/", 0755);
|
(void) mkdir("/var/lib/systemd/", 0755);
|
||||||
(void) mkdir("/var/lib/systemd/home/", 0700);
|
(void) mkdir(home_record_dir(), 0700);
|
||||||
|
|
||||||
fn = strjoina("/var/lib/systemd/home/", h->user_name, ".identity");
|
fn = strjoina(home_record_dir(), "/", h->user_name, ".identity");
|
||||||
|
|
||||||
r = write_string_file(fn, text, WRITE_STRING_FILE_ATOMIC|WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_MODE_0600|WRITE_STRING_FILE_SYNC);
|
r = write_string_file(fn, text, WRITE_STRING_FILE_ATOMIC|WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_MODE_0600|WRITE_STRING_FILE_SYNC);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
@ -316,7 +316,7 @@ int home_unlink_record(Home *h) {
|
|||||||
|
|
||||||
assert(h);
|
assert(h);
|
||||||
|
|
||||||
fn = strjoina("/var/lib/systemd/home/", h->user_name, ".identity");
|
fn = strjoina(home_record_dir(), "/", h->user_name, ".identity");
|
||||||
if (unlink(fn) < 0 && errno != ENOENT)
|
if (unlink(fn) < 0 && errno != ENOENT)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
|
|||||||
@ -436,7 +436,7 @@ unlink_this_file:
|
|||||||
if (unlinkat(dir_fd, fname, 0) < 0)
|
if (unlinkat(dir_fd, fname, 0) < 0)
|
||||||
return log_error_errno(errno, "Failed to remove empty user record file %s: %m", fname);
|
return log_error_errno(errno, "Failed to remove empty user record file %s: %m", fname);
|
||||||
|
|
||||||
log_notice("Discovered empty user record file /var/lib/systemd/home/%s, removed automatically.", fname);
|
log_notice("Discovered empty user record file %s/%s, removed automatically.", home_record_dir(), fname);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -446,10 +446,10 @@ static int manager_enumerate_records(Manager *m) {
|
|||||||
|
|
||||||
assert(m);
|
assert(m);
|
||||||
|
|
||||||
d = opendir("/var/lib/systemd/home/");
|
d = opendir(home_record_dir());
|
||||||
if (!d)
|
if (!d)
|
||||||
return log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_ERR, errno,
|
return log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_ERR, errno,
|
||||||
"Failed to open /var/lib/systemd/home/: %m");
|
"Failed to open %s: %m", home_record_dir());
|
||||||
|
|
||||||
FOREACH_DIRENT(de, d, return log_error_errno(errno, "Failed to read record directory: %m")) {
|
FOREACH_DIRENT(de, d, return log_error_errno(errno, "Failed to read record directory: %m")) {
|
||||||
_cleanup_free_ char *n = NULL;
|
_cleanup_free_ char *n = NULL;
|
||||||
|
|||||||
@ -269,17 +269,17 @@ void user_record_show(UserRecord *hr, bool show_full_group_info) {
|
|||||||
printf(" IO Weight: %" PRIu64 "\n", hr->io_weight);
|
printf(" IO Weight: %" PRIu64 "\n", hr->io_weight);
|
||||||
|
|
||||||
if (hr->access_mode != MODE_INVALID)
|
if (hr->access_mode != MODE_INVALID)
|
||||||
printf(" Access Mode: 0%03oo\n", user_record_access_mode(hr));
|
printf(" Access Mode: 0%03o\n", user_record_access_mode(hr));
|
||||||
|
|
||||||
if (storage == USER_LUKS) {
|
if (storage == USER_LUKS) {
|
||||||
printf("LUKS Discard: online=%s offline=%s\n", yes_no(user_record_luks_discard(hr)), yes_no(user_record_luks_offline_discard(hr)));
|
printf("LUKS Discard: online=%s offline=%s\n", yes_no(user_record_luks_discard(hr)), yes_no(user_record_luks_offline_discard(hr)));
|
||||||
|
|
||||||
if (!sd_id128_is_null(hr->luks_uuid))
|
if (!sd_id128_is_null(hr->luks_uuid))
|
||||||
printf(" LUKS UUID: " SD_ID128_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(hr->luks_uuid));
|
printf(" LUKS UUID: " SD_ID128_UUID_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(hr->luks_uuid));
|
||||||
if (!sd_id128_is_null(hr->partition_uuid))
|
if (!sd_id128_is_null(hr->partition_uuid))
|
||||||
printf(" Part UUID: " SD_ID128_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(hr->partition_uuid));
|
printf(" Part UUID: " SD_ID128_UUID_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(hr->partition_uuid));
|
||||||
if (!sd_id128_is_null(hr->file_system_uuid))
|
if (!sd_id128_is_null(hr->file_system_uuid))
|
||||||
printf(" FS UUID: " SD_ID128_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(hr->file_system_uuid));
|
printf(" FS UUID: " SD_ID128_UUID_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(hr->file_system_uuid));
|
||||||
|
|
||||||
if (hr->file_system_type)
|
if (hr->file_system_type)
|
||||||
printf(" File System: %s\n", user_record_file_system_type(hr));
|
printf(" File System: %s\n", user_record_file_system_type(hr));
|
||||||
@ -307,6 +307,9 @@ void user_record_show(UserRecord *hr, bool show_full_group_info) {
|
|||||||
|
|
||||||
if (hr->cifs_service)
|
if (hr->cifs_service)
|
||||||
printf("CIFS Service: %s\n", hr->cifs_service);
|
printf("CIFS Service: %s\n", hr->cifs_service);
|
||||||
|
|
||||||
|
if (hr->cifs_extra_mount_options)
|
||||||
|
printf("CIFS MntOpts: %s\n", hr->cifs_extra_mount_options);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hr->cifs_user_name)
|
if (hr->cifs_user_name)
|
||||||
|
|||||||
1
test/TEST-67-INTEGRITY/Makefile
Symbolic link
1
test/TEST-67-INTEGRITY/Makefile
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../TEST-01-BASIC/Makefile
|
||||||
27
test/TEST-67-INTEGRITY/test.sh
Executable file
27
test/TEST-67-INTEGRITY/test.sh
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
set -e
|
||||||
|
|
||||||
|
TEST_DESCRIPTION="dm-integrity test"
|
||||||
|
|
||||||
|
TEST_NO_NSPAWN=1
|
||||||
|
QEMU_TIMEOUT=300
|
||||||
|
|
||||||
|
# shellcheck source=test/test-functions
|
||||||
|
. "${TEST_BASE_DIR:?}/test-functions"
|
||||||
|
|
||||||
|
test_append_files() {(
|
||||||
|
|
||||||
|
instmods loop =block
|
||||||
|
instmods dm_integrity =md
|
||||||
|
|
||||||
|
inst_binary losetup
|
||||||
|
inst_binary integritysetup
|
||||||
|
inst_binary blkid
|
||||||
|
install_dmevent
|
||||||
|
|
||||||
|
generate_module_dependencies
|
||||||
|
|
||||||
|
)}
|
||||||
|
|
||||||
|
do_test "$@"
|
||||||
@ -85,10 +85,19 @@ helper_wait_for_vgroup() {
|
|||||||
helper_wait_for_lvm_activate() {
|
helper_wait_for_lvm_activate() {
|
||||||
local vgroup="${1:?}"
|
local vgroup="${1:?}"
|
||||||
local ntries="${2:-10}"
|
local ntries="${2:-10}"
|
||||||
local i
|
local i lvm_activate_svc
|
||||||
|
|
||||||
|
lvm_activate_svc="lvm-activate-$vgroup.service"
|
||||||
for ((i = 0; i < ntries; i++)); do
|
for ((i = 0; i < ntries; i++)); do
|
||||||
! systemctl -q is-active "lvm-activate-$vgroup.service" || return 0
|
if systemctl -q is-active "$lvm_activate_svc"; then
|
||||||
|
# Since the service is started via `systemd-run --no-block`, we need
|
||||||
|
# to wait until it finishes, otherwise we might continue while
|
||||||
|
# `vgchange` is still running
|
||||||
|
if [[ "$(systemctl show -P SubState "$lvm_activate_svc")" == exited ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
sleep .5
|
sleep .5
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|||||||
9
test/units/testsuite-67.service
Normal file
9
test/units/testsuite-67.service
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
[Unit]
|
||||||
|
Description=TEST-67-INTEGRITY
|
||||||
|
After=multi-user.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStartPre=rm -f /failed /testok
|
||||||
|
ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh
|
||||||
|
Type=oneshot
|
||||||
98
test/units/testsuite-67.sh
Executable file
98
test/units/testsuite-67.sh
Executable file
@ -0,0 +1,98 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
export DM_NAME="integrity_test"
|
||||||
|
export FULL_DM_DEV_NAME="/dev/mapper/${DM_NAME}"
|
||||||
|
export FS_UUID="01234567-ffff-eeee-eeee-0123456789ab"
|
||||||
|
export GEN="/var/run/systemd/generator"
|
||||||
|
|
||||||
|
image_dir=""
|
||||||
|
|
||||||
|
cleanup()
|
||||||
|
{
|
||||||
|
if [ -z "${image_dir}" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "${image_dir}/image" ]; then
|
||||||
|
if [ -e "${FULL_DM_DEV_NAME}" ]; then
|
||||||
|
integritysetup close "${DM_NAME}"
|
||||||
|
fi
|
||||||
|
losetup -d "${loop}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf "${image_dir}"
|
||||||
|
}
|
||||||
|
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
build_integrity_tab()
|
||||||
|
{
|
||||||
|
cat << _EOL > "/etc/integritytab"
|
||||||
|
${DM_NAME} ${loop} - integrity-algorithm=$1
|
||||||
|
_EOL
|
||||||
|
}
|
||||||
|
|
||||||
|
image_dir="$(mktemp -d -t -p / integrity.tmp.XXXXXX)"
|
||||||
|
if [ -z "${image_dir}" ] || [ ! -d "${image_dir}" ]; then
|
||||||
|
echo "mktemp under / failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
dd if=/dev/zero of="${image_dir}/image" bs=1048576 count=64 || exit 1
|
||||||
|
loop="$(losetup --show -f "${image_dir}/image")"
|
||||||
|
|
||||||
|
if [[ ! -e ${loop} ]]; then
|
||||||
|
echo "Loopback device created not found!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
for algorithm in crc32c crc32 sha1 sha256
|
||||||
|
do
|
||||||
|
integritysetup format "${loop}" --batch-mode -I "${algorithm}" || exit 1
|
||||||
|
integritysetup open -I "${algorithm}" "${loop}" "${DM_NAME}" || exit 1
|
||||||
|
mkfs.ext4 -U "${FS_UUID}" "${FULL_DM_DEV_NAME}" || exit 1
|
||||||
|
|
||||||
|
# Give userspace time to handle udev events for new FS showing up ...
|
||||||
|
udevadm settle
|
||||||
|
|
||||||
|
integritysetup close "${DM_NAME}" || exit 1
|
||||||
|
|
||||||
|
# create integritytab, generate units, start service
|
||||||
|
build_integrity_tab ${algorithm}
|
||||||
|
|
||||||
|
# Cause the generator to re-run
|
||||||
|
systemctl daemon-reload || exit 1
|
||||||
|
|
||||||
|
# Check for existance of unit files...
|
||||||
|
if [[ ! -e "/run/systemd/generator/systemd-integritysetup@${DM_NAME}.service" ]]; then
|
||||||
|
echo "Service file does not exist!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make sure we are in a consistent state, e.g. not already active before we start
|
||||||
|
systemctl stop systemd-integritysetup@"${DM_NAME}".service || exit 1
|
||||||
|
systemctl start systemd-integritysetup@"${DM_NAME}".service || exit 1
|
||||||
|
|
||||||
|
# Check the signature on the FS to ensure we can retrieve it and that is matches
|
||||||
|
if [ -e "${FULL_DM_DEV_NAME}" ]; then
|
||||||
|
if [ "${FULL_DM_DEV_NAME}" != "$(blkid -U "${FS_UUID}")" ]; then
|
||||||
|
echo "Failed to locate FS with matching UUID!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Failed to bring up integrity device!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
systemctl stop systemd-integritysetup@"${DM_NAME}".service || exit 1
|
||||||
|
|
||||||
|
if [ -e "${FULL_DM_DEV_NAME}" ]; then
|
||||||
|
echo "Expecting ${FULL_DM_DEV_NAME} to not exist after stoping unit!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
echo OK >/testok
|
||||||
Loading…
x
Reference in New Issue
Block a user