как получить компоненты смонтированного OverlayFS? - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть встроенная система, чья 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

Есть ли способ восстановить информацию из пространства пользователя? Эта информация мне нужна для процесса обновления (между прочим).

Примечание: я знаю, что мог бы где-то написать информацию, но у него есть другие проблемы, и, если возможно, я хотел бы полагаться на информацию, уже присутствующую в ядро (в конце концов имеет , чтобы знать, что на самом деле куда монтируется).

...