LINUX.ORG.RU
ФорумAdmin

initrd отвязать squashfs от носителя (USB Flash)

 


0

2

Здравствуйте, коллеги!

В данном случае речь идет о минисистеме, типа rescue на флешке. В squashfs собран образ, который в упакованном виде весит около 300 Мб.

Я полностью подменил /init в initrd и там все прекрасно собирается в overlay где rw слоем может выступать ОЗУ или раздел диска.

Все работает, но есть не приятный момент: если при загруженной с флешки системе эту флешку выдрать, то… Спасает лишь hard reset.

Ну и иногда случаются артефакты с самой флешкой. Т.е. флешку не дергали, тем не менее изредка начинается какая-то непонятная фигня, типа не все нормально считалось и вообще появляются какие-то фантомные неисправности диска. Именно фантомные, т.к. все проверялось и ни каких ашыпок нет.

Вот и появилась мысль чекать в initrd размер squashfs файла и если его размер ниже некоего разумного значения, например до 500 Мб, то сначала загнать его в ОЗУ и лишь потом собирать overlay.

Вроде все просто, но просто было на бумаге. Почему-то в initrd вылетают ашыпки input-output в процессе записи образа в tmpfs.

mount -t tmpfs tmpfs /tmp
mkdir /tmp/mnt
mount /dev/sdc1 /tmp/mnt # монтирование раздела, 
                         #на котором лежит squashfs файл.
mkdir /tmp/sfs
cp /tmp/mnt/sys.squashfs /tmp/sfs # вот тут и происходит ошибка
umount /tmp/mnt

Я привел максимально упрощенный отрывок кода без проверок и прочего. Но предположим, что sys.squashfs действительно лежит на /dev/sdc1, он смонтировался, а размер ОЗУ 4Gb и более.

Тем не менее, именно в процессе банального копирования очень часто происходит ошибка с руганью на input-output.

Что я делаю не так?

Может, вообще идея с записью образа в ОЗУ, нежнеспособная?


где rw слоем может выступать ОЗУ

Все работает, но есть не приятный момент: если при загруженной с флешки системе эту флешку выдрать, то… Спасает лишь hard reset.

А ты содержимое флешки копируешь в ram? Вроде только так можно вынимать физический носитель и продолжать пользоваться системой.

krasnh ★★★★
()
Ответ на: комментарий от krasnh

А ты содержимое флешки копируешь в ram? Вроде только так можно вынимать физический носитель и продолжать пользоваться системой.

Так я выше и написал, что не понятные проблемы возникают в процессе копирования squashfs образа в ОЗУ.

HighMan
() автор топика
Последнее исправление: HighMan (всего исправлений: 1)

Может, вообще идея с записью образа в ОЗУ, нежнеспособная?

Жизнеспособна. Более того, куча дистрибутивов, а-ля Puppy Linux, ее используют на практике уже давно.

krasnh ★★★★
()
Ответ на: комментарий от HighMan

Надо подробнее смотреть на ошибку. Может флешка умирает, может памяти ПК нехватило

mount -t tmpfs tmpfs /tmp
Я в своё время городил такое и грузился по сети.

cat << EOF > "$DEST/etc/initcpio/hooks/getrootfs"
run_hook ()
{
  network=\$(ipconfig eth0)
  dns=\$(echo \$network | tr ':' '\n' | grep 'dns1' | awk '{print \$1}')
  echo "nameserver \${dns}" > /etc/resolv.conf

  mem_total_kb=\$(grep "MemTotal" /proc/meminfo | awk '{print \$2}')

  mem_total=\$((mem_total_kb * 1024))

  modprobe zram num_devices=2
  echo zstd > /sys/block/zram0/comp_algorithm
  echo zstd > /sys/block/zram1/comp_algorithm
  echo \$mem_total > /sys/block/zram0/disksize
  echo \$mem_total > /sys/block/zram1/disksize
  mkswap /dev/zram0
  mkswap /dev/zram1
  swapon -p 100 /dev/zram0
  swapon -p 100 /dev/zram1

  mount -t tmpfs -o size=300% tmpfs /new_root/
  cd /new_root
  curl ${BOOT_PATH}/${VERSION}/rootfs.tar.zstd | zstdcat | tar -x

}
Flotsky ★★
()
Ответ на: комментарий от Flotsky

Надо подробнее смотреть на ошибку. Может флешка умирает, может памяти ПК нехватило

Памяти 4Gb на терзаемой машине и она почти вся свободна!

Флеха тормознутая, но надежная и ни каких проблем не доставляла.

Кроме того, я только перед этим загонял на нее новый squashfs образ и грузился без записи его в ОЗУ. Все работает нормально.

zram мне нет смысла использовать, т.к. в память должен загружаться и так максимально утоптанный squashfs.

cp /tmp/mnt/sys.squashfs /tmp/sfs
cp: read error: input/output error

Т.е. он считать, почему-то не может, хотя в полноценной системе все пишется/читается без вопросов. Даже md5sum делал с squashfs образа на одной машине, потом md5sum на другой машине с файла на флешке - хеш одинаковый

HighMan
() автор топика
Последнее исправление: HighMan (всего исправлений: 1)
Ответ на: комментарий от HighMan

Ключевые слова у меня были «может» и «Надо подробнее смотреть на ошибку».

Т.е. точную ошибку сюда прикрепить. Или в init скрипте вместо cp вывалиться в консоль, осмотреться, руками повыполнять комманды.

без записи его в ОЗУ. Все работает нормально.

Вдруг там какая одна проблемная область и на моменте загрузки она не нужна, а при копировании в память копируется всё и вылезает ошибка. Можно там md5 squashfs файла на флешке и ПК сравнить…
Но это уже гадание на кофейной гуще.

cp: read error: input/output error

Явно же проблема флешки. Может если из initrd консоли повторить ошибку и потом посмотреть dmesg что-то станет понятнее

Flotsky ★★
()
Последнее исправление: Flotsky (всего исправлений: 1)
Ответ на: комментарий от Flotsky

Явно же проблема флешки. Может если из initrd консоли повторить ошибку и потом посмотреть dmesg что-то станет понятнее

Посыпаю голову пеплом!

Хотя, какой смысл? Бошка и так седая.

Действительно! Проблема во флешке. Причем проблема странная. На одних машинах все читается нормально, а на других выбивает input/output error.

А я столько времени из-за этой флешки потерял…

HighMan
() автор топика