как получить компоненты смонтированной OverlayFS?
У меня есть встроенная система, в которой RootFS представляет собой OverlayFS, состоящую из SquashFS и доступной для записи ext4 FS.
Чтобы (немного) усложнить ситуацию, у меня есть две копии 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...
за которым следует pivot_root ...
.
Это работает, как ожидалось.
Вопрос: как можно позже (после mount/pivot_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
Любая ссылка на мой исходный корневой каталог (/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
Есть ли способ восстановить информацию из пользовательского пространства? Эта информация нужна мне для процесса обновления (помимо прочего).
Примечание: Я знаю, что я мог бы написать информацию о где - то, но есть и другие проблемы, и, если это возможно, я хотел бы опираться на информацию, уже присутствует в ядре (в конце концов он должен знать, что на самом деле установлен где).