[systemd-devel] Requirements for successful mounting of RootImage?
Lennart Poettering
lennart at poettering.net
Mon Jul 31 13:50:26 UTC 2017
On So, 30.07.17 13:58, Topi Miettinen (toiwoton at gmail.com) wrote:
> Hey,
>
> I have this test.service unit:
> [Unit]
>
> [Install]
> WantedBy=multi-user.target
>
> [Service]
> Type=oneshot
> ExecStart=/bin/ls -lR
> RootImage=/fs
> MountAPIVFS=no
Any reason you turn this off? This is likely to break sooner or later,
so it would make a ton of sense to test things first with it left on,
before checking anything else.
>
> The file /fs has a MBR partition table:
> Disk /dev/loop0: 1.1 MiB, 1192960 bytes, 2330 sectors
> Units: sectors of 1 * 512 = 512 bytes
> Sector size (logical/physical): 512 bytes / 512 bytes
> I/O size (minimum/optimal): 512 bytes / 512 bytes
> Disklabel type: dos
> Disk identifier: 0x3990f3e6
>
> Device Boot Start End Sectors Size Id Type
> /dev/loop0p1 * 34 2329 2296 1.1M 83 Linux
That should work. See if "systemd-nspawn -i" can get a shell in it. If
so, RootImage= should work too, it uses the same code.
Also, consider invoking /usr/lib/systemd/systemd-dissect on the image
file, it will tell you whether it can make sense of the image, and how
it would mount it.
> In the only partition a squashfs file system containing:
> bin
> bin/ls
> boot
> dev
> etc
> etc/group
> etc/nsswitch.conf
> etc/passwd
> home
> lib
> lib64
> lib64/ld-linux-x86-64.so.2
> lib/libc.so.6
> lib/libdl.so.2
> lib/libpcre.so.3
> lib/libpthread.so.0
> lib/libselinux.so.1
> media
> opt
> proc
> root
> run
> sbin
> srv
> sys
> tmp
> usr
> usr/bin
> usr/lib
> usr/lib64
> usr/lib/x86_64-linux-gnu
> usr/sbin
> var
> var/tmp
>
> However, starting the service fails with abort:
> Jul 30 13:25:42 machine systemd[1]: Starting test.service...
> Jul 30 13:25:42 machine kernel: loop0: p1
> Jul 30 13:25:42 machine systemd[1]: test.service: Main process exited,
> code=killed, status=6/ABRT
> Jul 30 13:25:42 machine systemd[1]: Failed to start test.service.
> Jul 30 13:25:42 machine systemd[1]: test.service: Unit entered failed state.
> Jul 30 13:25:42 machine systemd[1]: test.service: Failed with result
> 'signal'.
>
> It looks like systemd successfully mounts the file system, but then
> suddenly aborts before even looking inside the file system:
>
> 2761 mount("/dev/loop1p1", "/run/systemd/unit-root", "squashfs",
> MS_NODEV, NULL <unfinished ...>
> 2761 <... mount resumed> ) = 0
> 2761 rt_sigprocmask(SIG_UNBLOCK, [ABRT], <unfinished ...>
> 2761 <... rt_sigprocmask resumed> NULL, 8) = 0
> 2761 rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [], 8) = 0
> 2761 getpid( <unfinished ...>
> 2761 <... getpid resumed> ) = 2761
> 2761 gettid( <unfinished ...>
> 2761 <... gettid resumed> ) = 2761
> 2761 tgkill(2761, 2761, SIGABRT <unfinished ...>
> 2761 <... tgkill resumed> ) = 0
> 2761 rt_sigprocmask(SIG_SETMASK, [], <unfinished ...>
> 2761 <... rt_sigprocmask resumed> NULL, 8) = 0
> 2761 --- SIGABRT {si_signo=SIGABRT, si_code=SI_TKILL, si_pid=2761,
> si_uid=0} ---
> 2761 +++ killed by SIGABRT +++
>
> The file system can be mounted by hand with losetup and mount, and
> /bin/ls can be run from chroot. So I think everything should be OK but
> RootImage still does not work and the error messages are useless.
> Perhaps I miss some RootImage requirements? What exactly they are?
They are documented briefly in "systemd-nspawn's" --image= setting.
That said, if systemd actually mounted something, then the image is
fine. Most likely something is simply borked in the namespacing code,
and that is kind hard to debug, because logging is already turned off
at that point. It should be relatively easy to patch that in
temporarily though, i.e. find apply_mount_namespace() in
src/core/execute.c and place a log_open() before the setup_namespace()
invocation, and check if this improves logging for you.
Lennart
--
Lennart Poettering, Red Hat
More information about the systemd-devel
mailing list