У меня есть встроенная система, чья RootFS - это OverlayFS, состоящая из SquashFS и доступной для записи файловой системы ext4.
Чтобы (немного) усложнить ситуацию, у меня есть две копии r / o SquashFS для возможности обновления это безопасно.
Во время загрузки я монтирую любую копию SquashFS (либо /dev/mmcblk0p6
, либо /dev/mmcblk0p7
) как root. Вскоре после этого я создаю OverlayFS, добавляя доступный для записи /dev/mmcblk0p5
поверх rootfs.
Сценарий, выполняющий это:
check_system() {
if grep -q /dev/mmcblk0p6 /proc/mounts ; then sys=A; upd=B
elif grep -q /dev/mmcblk0p7 /proc/mounts ; then sys=B; upd=A
else echo "Unknown system: bailing out"; return 1
fi
}
check_root_ro() {
grep /dev/root /proc/mounts | grep -q '[[:space:]]ro[[:space:],]'
}
overlay="/overlay"
overlay_lower="/"
overlay_nroot="${overlay}/n_dir"
overlay_upper="${overlay}/upper"
overlay_workd="${overlay}/workd"
check_overlay_dirs() {
[ -d "${overlay}" ] || return 1
grep -q '[[:space:]]/overlay[[:space:]]' /proc/mounts || mount /dev/mmcblk0p5 ${overlay} || return 1
[ -d "${overlay_nroot}" ] || mkdir "${overlay_nroot}"
[ -d "${overlay_upper}" ] || mkdir "${overlay_upper}"
[ -d "${overlay_workd}" ] || mkdir "${overlay_workd}"
}
check_overlay() {
grep '^overlay[[:space:]]/[[:space:]]' /proc/mounts
}
overlay_start() {
if check_overlay
then
# overlay already active, bail out
echo "OverlayFS already active: nothing done"
return 0
else
# no overlay, start it
check_overlay_dirs
mount -t overlay overlay \
-o lowerdir="${overlay_lower}",upperdir="${overlay_upper}",workdir="${overlay_workd}" \
"${overlay_nroot}" \
|| { echo "FAILED! "; return 1; }
cd "${overlay_nroot}" || { echo "Unable to cd ${overlay_nroot}"; return 1; }
[ -d old ] || mkdir old
pivot_root . old
mount --move old/dev /dev
mount --move old/sys /sys
mount --move old/proc /proc
cd / && echo "OK"
fi
}
Ядром процедуры, очевидно, является mount -t overlay...
, за которым следует a pivot_root ...
.
Это работает, как и ожидалось.
Вопрос: в более позднее время (после mount / pivot_ root) как я могу проверить, какой был оригинал "root "?
Функция check_system
работает как ожидалось только до перемонтирования. После выполнения описанной выше процедуры мой / proc / mounts выглядит следующим образом:
# cat /proc/mounts
/dev/root /old squashfs ro,relatime 0 0
devtmpfs /dev devtmpfs rw,relatime,size=62164k,nr_inodes=15541,mode=755 0 0
proc /proc proc rw,relatime 0 0
devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=666 0 0
tmpfs /dev/shm tmpfs rw,relatime,mode=777 0 0
tmpfs /old/tmp tmpfs rw,relatime 0 0
tmpfs /old/run tmpfs rw,nosuid,nodev,relatime,mode=755 0 0
sysfs /sys sysfs rw,relatime 0 0
/dev/mmcblk0p5 /old/overlay ext4 rw,relatime 0 0
overlay / overlay rw,relatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/workd 0 0
/dev/mmcblk0p10 /usr/local/var ext4 rw,relatime 0 0
Любая ссылка на мой исходный каталог root (в данном случае /dev/mmmcblk0p7
) пропала, но он вернется, если / когда я возвращаю процесс с помощью:
cd /old || { echo "Unable to cd /old"; return 1; }
pivot_root . mnt
mount --move /mnt/proc /proc
mount --move /mnt/sys /sys
mount --move /mnt/dev /dev
Есть ли способ восстановить информацию из пространства пользователя? Эта информация мне нужна для процесса обновления (между прочим).
Примечание: я знаю, что мог бы где-то написать информацию, но у него есть другие проблемы, и, если возможно, я хотел бы полагаться на информацию, уже присутствующую в ядро (в конце концов имеет , чтобы знать, что на самом деле куда монтируется).