Скрипт Initramfs-tools для монтирования сжатых папок на tmpfs

Скрипт Initramfs-tools для монтирования сжатых папок на tmpfs

Я пытаюсь создать небольшой раздел восстановления (~800 МБ свободного места после всех других разделов системы и хранилища) для ноутбука со специализированным оборудованием, которому требуются специальные ядра и модули ядра, поэтому стандартные инструменты восстановления, такие как Clonezilla Live и GParted Live, работают не очень хорошо. Раздел слишком мал, чтобы включить модули и программное обеспечение, необходимые для того, что я хочу собрать, поэтому большую часть системы нужно сжать и загрузить в оперативную память во время выполнения. Кроме того, я предпочитаю полностью извлекать систему, а не полагаться на squashfs, и я хотел бы иметь возможность сохранять изменения, внесенные в систему, насколько позволяет раздел. Используя Ubuntu 20.04 в качестве базовой системы, я разработал следующую схему для этой цели:

  1. После сборки исходной системы в chrootсоздайте пустую папку /ramв качестве точки монтирования для tmpfsразмещения распакованных системных и пользовательских файлов во время выполнения, переместите все системные и пользовательские папки с файлами ( home, usr, var, opt, etc,и т. д.) в /ramи замените каждый символической ссылкой на /ram/$dir. Сожмите /ramкак /ram.tar.gzи оставьте специальные точки монтирования ( dev, sys, run, tmp, и proc), а также bootв покое на rootfs. Удалите /ram/*и запишите rootfsна раздел.
  2. initrdПри загрузке, после загрузки ядра и , предварительно монтируйте rootfs, монтируйте tmpfsв /ram, затем извлекайте содержимое /ram.tar.gzв /ram. Это должно произойти до rootfsзамены initramfsс правами root, поскольку в противном случае rootfsне будет доступа к утилитам, необходимым для монтирования /ramи извлечения из сжатого архива.
  3. Смонтируйте rootfsи продолжите загрузку.
  4. При выключении сделайте резервную копию, /ram.tar.gzа /ram.tar.gz.bakзатем сожмите измененное /ramв /ram.tar.gz. Это можно сделать с помощью systemd.

Очевидно, что на шаге 4 могут возникнуть проблемы, поэтому на шаге 2 необходимо включить проверку целостности /ram.tar.gzи загрузку резервной копии, если это не удастся, но это должно быть всего лишь несколько дополнительных команд для включения в initramfs-toolsсценарий, и это выходит за рамки моего вопроса, который заключается в следующем:

Не изменяя /usr/share/initramfs-tools/init, как мне создать скрипт /etc/initramfs-tools/scriptsдля выполнения шага 2? Команды должны быть достаточно простыми, как

mount -t tmpfs -o $OPTIONS none /ram
tar xvzf ram.tar.gz

Но я немного не понимаю, в какую папку включить скрипт (init? local? top? bottom? premount?) и как работать с заголовком PREREQв самом скрипте.

решение1

Оказалось, что это довольно просто. Создать:

/etc/initramfs-tools/scripts/local-bottom/ramfiles
#!/bin/sh

set -e

PREREQ=""

prereqs()
{
        echo "${PREREQ}"
}

case "${1}" in
        prereqs)
                prereqs
                exit 0
                ;;
esac

mount -t tmpfs -o size=100% none ${rootmnt}/ram
tar xvzf ${rootmnt}/ram.tar.gz -C ${rootmnt}


затем

sudo chmod +x /etc/initramfs-tools/scripts/local-bottom/ramfiles
sudo update-initramfs -u

Связанный контент