<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-ligatures:standardcontextual;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="NL" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Hi,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am unable to get mknod working in a systemd nspawn container. I alwyas get EPERM, even though everything seems to be in place:<o:p></o:p></p>
<p class="MsoNormal">root@bookworm:/# mknod /mnt/null c 1 3<o:p></o:p></p>
<p class="MsoNormal">mknod: /mnt/null: Operation not permitted<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Nspawn file for the container contains capability and systemcallfilter:<o:p></o:p></p>
<p class="MsoNormal">[Exec]<o:p></o:p></p>
<p class="MsoNormal">Hostname=debtest<o:p></o:p></p>
<p class="MsoNormal">Boot=yes<o:p></o:p></p>
<p class="MsoNormal">Capability=CAP_SYS_ADMIN CAP_SYS_MKNOD CAP_MKNOD CAP_SYSADMIN<o:p></o:p></p>
<p class="MsoNormal">SystemCallFilter=mknod keyctl add_key<o:p></o:p></p>
<p class="MsoNormal">Hostname=debtest<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">[Network]<o:p></o:p></p>
<p class="MsoNormal">VirtualEthernet=yes<o:p></o:p></p>
<p class="MsoNormal">Bridge=brdsan01<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The systemcallfilter is ok, as I am able to use keyctl:<o:p></o:p></p>
<p class="MsoNormal">root@bookworm:/# keyctl list @u<o:p></o:p></p>
<p class="MsoNormal">keyring is empty<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am using the default <a href="mailto:systemd-nspawn@.service">
systemd-nspawn@.service</a>:<o:p></o:p></p>
<p class="MsoNormal">Explicitely adding DeviceAllow=/dev/null makes no difference<o:p></o:p></p>
<p class="MsoNormal">[Unit]<o:p></o:p></p>
<p class="MsoNormal">Description=Container %i<o:p></o:p></p>
<p class="MsoNormal">Documentation=man:systemd-nspawn(1)<o:p></o:p></p>
<p class="MsoNormal">PartOf=machines.target<o:p></o:p></p>
<p class="MsoNormal">Before=machines.target<o:p></o:p></p>
<p class="MsoNormal">After=network.target<o:p></o:p></p>
<p class="MsoNormal">RequiresMountsFor=/var/lib/machines/%i<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">[Service]<o:p></o:p></p>
<p class="MsoNormal"># Make sure the DeviceAllow= lines below can properly resolve the 'block-loop' expression (and others)<o:p></o:p></p>
<p class="MsoNormal">ExecStart=systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --network-veth -U --settings=override --machine=%i<o:p></o:p></p>
<p class="MsoNormal">KillMode=mixed<o:p></o:p></p>
<p class="MsoNormal">Type=notify<o:p></o:p></p>
<p class="MsoNormal">RestartForceExitStatus=133<o:p></o:p></p>
<p class="MsoNormal">SuccessExitStatus=133<o:p></o:p></p>
<p class="MsoNormal">Slice=machine.slice<o:p></o:p></p>
<p class="MsoNormal">Delegate=yes<o:p></o:p></p>
<p class="MsoNormal">DelegateSubgroup=supervisor<o:p></o:p></p>
<p class="MsoNormal">CoredumpReceive=yes<o:p></o:p></p>
<p class="MsoNormal">TasksMax=16384<o:p></o:p></p>
<p class="MsoNormal">WatchdogSec=3min<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">DevicePolicy=closed<o:p></o:p></p>
<p class="MsoNormal">DeviceAllow=/dev/net/tun rwm<o:p></o:p></p>
<p class="MsoNormal">DeviceAllow=char-pts rw<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># nspawn itself needs access to /dev/loop-control and /dev/loop, to implement<o:p></o:p></p>
<p class="MsoNormal"># the --image= option. Add these here, too.<o:p></o:p></p>
<p class="MsoNormal">DeviceAllow=/dev/loop-control rw<o:p></o:p></p>
<p class="MsoNormal">DeviceAllow=block-loop rw<o:p></o:p></p>
<p class="MsoNormal">DeviceAllow=block-blkext rw<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"># nspawn can set up LUKS encrypted loopback files, in which case it needs<o:p></o:p></p>
<p class="MsoNormal"># access to /dev/mapper/control and the block devices /dev/mapper/*.<o:p></o:p></p>
<p class="MsoNormal">DeviceAllow=/dev/mapper/control rw<o:p></o:p></p>
<p class="MsoNormal">DeviceAllow=block-device-mapper rw<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">[Install]<o:p></o:p></p>
<p class="MsoNormal">WantedBy=machines.target<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Mknod capability is present:<o:p></o:p></p>
<p class="MsoNormal">root@bookworm:/# capsh --print |grep mknod<o:p></o:p></p>
<p class="MsoNormal">Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_owner,cap_sys_chroot,cap_sys_ptrace,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The sd_devices BPF program is attached to the cgroup:<o:p></o:p></p>
<p class="MsoNormal">sudo bpftool cgroup show /sys/fs/cgroup/machine.slice/systemd-nspawn@debtest.service/<o:p></o:p></p>
<p class="MsoNormal">ID       AttachType      AttachFlags     Name<o:p></o:p></p>
<p class="MsoNormal">68       cgroup_device   multi           sd_devices<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">/mnt is not mounted with restrictions:<o:p></o:p></p>
<p class="MsoNormal">tmpfs on /mnt type tmpfs (rw,relatime,uid=1189085184,gid=1189085184)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">But still:<o:p></o:p></p>
<p class="MsoNormal">root@bookworm:/# mknod /mnt/null c 1 3<o:p></o:p></p>
<p class="MsoNormal">mknod: /mnt/null: Operation not permitted<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">So what am I missing here?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-Sietse<o:p></o:p></p>
</div>
</body>
</html>