Wie verwende ich OverlayFS richtig, um mein Root-Dateisystem zu schützen?
Ich habe ein eingebettetes System, das von einer SD-Karte startet und ausgeführt wird. Da es zu einem plötzlichen Stromausfall kommt, möchte ich das Root-Dateisystem schützen. OverlayFS scheint die einfachste Lösung zu sein, aber die Beispiele, die ich finde, betreffen normalerweise nicht das Root-Dateisystem und / oder verwenden ein tmpfs, was für mich nicht gut ist, da ich sehr wenig Speicher habe.
Ich verwende Linux Kernel 4.4.0 mit CONFIG_OVERLAY_FS=y
aktiviert. Mein Dateisystem ist xenial-base-armhf.tar.gz
und ich habe getan apt install -y overlayroot
.
Meine SD-Karte sieht aus wie:
# fdisk -l /dev/mmcblk1
Disk /dev/mmcblk1: 29 GiB, 31104958464 bytes, 60751872 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: 0x7f56a0ab
Device Boot Start End Sectors Size Id Type
/dev/mmcblk1p1 * 2048 1050623 1048576 512M c W95 FAT32 (LBA)
/dev/mmcblk1p2 1050624 1052671 2048 1M da Non-FS data
/dev/mmcblk1p3 1052672 7344127 6291456 3G 83 Linux
/dev/mmcblk1p4 7344128 60751871 53407744 25.5G 5 Extended
/dev/mmcblk1p5 7346176 13637631 6291456 3G 83 Linux
/dev/mmcblk1p6 13639680 60751871 47112192 22.5G 83 Linux
Vor dem Erstellen des OverlayFS wird alles wie folgt bereitgestellt:
# mount
/dev/mmcblk1p3 on / type ext4 (rw,noatime,data=ordered)
devtmpfs on /dev type devtmpfs (rw,relatime,size=170440k,nr_inodes=42610,mode=755)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd- cgroups-agent,name=systemd)
configfs on /sys/kernel/config type configfs (rw,relatime)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=35752k,mode=700)
/dev/mmcblk1p6 on /opt type ext4 (rw,noatime,data=ordered)
/dev/mmcblk1p5 on /overlay type ext4 (rw,noatime,data=ordered)
Mein Plan war es, /dev/mmcblk1p5
als Overlay-Dateisystem zu verwenden, das bei gemountet ist /overlay
.
# tree /overlay
/overlay
├── lost+found
├── root-fs
└── work
Entweder mache ich etwas falsch oder ich habe ein Konfigurationsproblem, weil:
# mount -t overlay overlay -o lowerdir=/,upperdir=/overlay/root-fs,workdir=/overlay/work /
# mount
/dev/mmcblk1p3 on / type ext4 (rw,noatime,data=ordered)
devtmpfs on /dev type devtmpfs (rw,relatime,size=170440k,nr_inodes=42610,mode=755)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
configfs on /sys/kernel/config type configfs (rw,relatime)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=35752k,mode=700)
/dev/mmcblk1p6 on /opt type ext4 (rw,noatime,data=ordered)
/dev/mmcblk1p5 on /overlay type ext4 (rw,noatime,data=ordered)
overlay on / type overlay (rw,relatime,lowerdir=/,upperdir=/overlay/root-fs,workdir=/overlay/work)
Sieht so aus, als hätte es funktioniert, aber wenn ich eine Datei erstelle, wie:
# touch /root/test_file_write
Dann ausschalten und auf die SD-Karte in meinem Desktop schauen, sehe ich /dev/mmcblk1p3/root/test_file_write
nicht, was ich erwartet hatte /dev/mmcblk1p5/root-fs/root/test_file_write
.
Sollte das funktionieren?
touch /root/test_file_write
kehrt zurück touch: cannot touch '/root/test_file_write': Read-only file system
, also funktioniert das Overlay eindeutig nicht ... aber warum?
mkdir /tmp/{root,overlay,work}; touch /tmp/root/lowerfile; mount -t overlay overlay -o lowerdir=/tmp/root,upperdir=/tmp/overlay,workdir=/tmp/work /tmp/root/; touch /tmp/root/upperfile; umount /tmp/root
/tmp/overlay/upperfile
und /tmp/overlay/root/lowerfile
.
mount -o remount,ro /
kehrt zurückmount: / is busy
, und der Versuch, das System schreibgeschützt zu starten, führt zu vielen Fehlern. Es ist mir noch nicht gelungen, aber ich werde es weiter versuchen.