LINUX.ORG.RU

Как запустить fsck во время загрузки системы, если используется systemd?

 , , , ,


1

1

ArchWiki:

Note: For those accustomed to use other GNU/Linux distributions, the old tricks consisting in writing a file with the name forcefsck to the root of each filesystem or using the command shutdown with the -F flag were only working for the old SysVinit and early versions of Upstart and are not working with systemd. The aforementioned solution is thus the only one working for Arch Linux.

Соответственно старые методы не работают.

ArchWiki:

You can also force fsck at boot time by passing fsck.mode=force, as a kernel parameter. This will check every filesystem you have on the machine.

Но у меня система на ARM-платформе и используется U-Boot.

а при чём тут собственно uboot? я просто меняю /etc/default/grub, генерирую новый конфиг и после ребута он юзает опции

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

Смотри в initrd

Но у меня система на ARM-платформе и используется U-Boot.

Ну, расковыривай initrd, смотри есть ли там обработка какого-нибудь параметра вроде fsck, попробуй создать файл forcefsck.

а при чём тут собственно uboot? я просто меняю /etc/default/grub, генерирую новый конфиг и после ребута он юзает опции

ЭТАПЯТЬ!

Camel ★★★★★
()

По делу: ну добавь этот параметр посредством U-Boot, я че-то не понимаю, почему ты во все мразобрался и в последний момент остановился.

t184256 ★★★★★
()

You can also force fsck at boot time by passing fsck.mode=force, as a kernel parameter

This.

Но у меня система на ARM-платформе и используется U-Boot.

И в чём проблема? Перегенерируй загрузочный скрипт и впиши туда этот параметр. Потом перегенерируй обратно.

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

И в чём проблема?

А если загрузчик сменить по какой-то причине нельзя, а конфиг вшит намертво? Такой вариант впринципе не рассматривается? Для embedded такой зашквар - это не то чтобы редкость

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

Тогда никак, насколько мне известно.

Господа из systemd, по-моему, уже всем давали понять, что они не собираются костылировать только для того, чтобы обеспечить совместимость с другими костылями или какими-то неправильными решениями.

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

Насчёт конкретно этой ситуации: а какие ещё способы передачи ядру параметров (не затрагивающих ФС, поскольку она по сценарию сломана) есть в природе?

Специальный сигнальный раздел, который нужно подмонтировать до rootfs и считать с него сигнальный файлик? Будь я апстрим, я бы такое в проект тоже не принял никогда. :]

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: Смотри в initrd от Camel

ЭТАПЯТЬ!

А ещё можно руками выставить счётчик кол-ва монтирований у диска, чтобы заставить систему выполнить fsck после следующей загрузки.

anonymous
()

ну нажми в u-boot setenv bootargs ...

а если консоли в юбут нет, то fw_setenv из uboot-tools и ребут

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

Монтировать ФС, которая потенциально требует проверки, на запись — это совершенно некомильфо.

Кстати говоря, ТС, systemd умеет /forcefsck, если оно собрано в режиме совместимости с sysvinit! Это именно в арче режим совместимости не используется, поэтому там так нельзя. А как в федоре — не знаю.

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

Монтировать ФС, которая потенциально требует проверки, на запись — это совершенно некомильфо.

Если mount -o ro деструктивно для монтируемой ФС - грош цена такому R/O. Про флаг ro у ядра рассказывать надеюсь не надо? :-)

Кстати говоря, ТС, systemd умеет /forcefsck, если оно собрано в режиме совместимости с sysvinit! Это именно в арче режим совместимости не используется, поэтому там так нельзя. А как в федоре — не знаю.

Ну вот. Значит претензии к systemd снимаются - и пинать стоит мэйнтэйнеров конкретного дистрибутива.

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

Чтобы поставить /forcefsck, нужно примонтировать ФС на запись.

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

Пинать нужно за каргокульт шовместимости там где она не нужна.

anonymous
()

Решение

В /boot должен быть конфигурационный файл boot.cmd. Открываем его на редактирование и ищем строку вида

setenv bootargs 'ro rootwait root=UUID=5c99cba3-b2ea-4b65-a39a-58b09cae5edf console=ttyS0,115200n8'
, это и есть параметры ядра. Добавляем к этой строке два параметра:
fsck.mode=force fsck.repair=yes
, первый параметр включает принудительную проверку файловых систем из /etc/fstab во время загрузки системы, второй — отвечает «да» на все вопросы fsck. В итоге строка должна приобрести следующий вид:
setenv bootargs 'ro rootwait root=UUID=5c99cba3-b2ea-4b65-a39a-58b09cae5edf console=ttyS0,115200n8 fsck.mode=force fsck.repair=yes'
. Теперь нужно запаковать команды загрузки в образ:
mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "a-b-c" -d boot.cmd boot.scr
, и перепаковать initrd:
mkimage -n initramfs -A arm -O linux -T ramdisk -C none -d initramfs-4.1.6-200.fc22.armv7hl.img uInitrd
. Вышеописанные действия приведут к тому, что fsck будет запускаться во время каждой загрузки системы. Нужды в таком поведении нет, поэтому после того, как ФС будет отремонтирована, добавленные параметры можно убрать и заново перепаковать boot.cmd и initrd.

Проверить текущие параметры ядра можно так:

$ cat /proc/cmdline 
ro rootwait root=UUID=5c99cba3-b2ea-4b65-a39a-58b09cae5edf console=ttyS0,115200n8 fsck.mode=force fsck.repair=yes

Подводные камни:

На моём устройстве во время загрузки на экран ничего не выводилось (хотя параметры rhgb и quiet отсутствуют) и замедления загрузки системы не наблюдалось (возможно из-за того, что система на 8 ГБ MMC-карте), из-за чего я подумал, что fsck не сработал. Однако дальнейшие наблюдения показали, что ФС была успешно отремонтирована.

Полезные ресурсы:

DedMoroz
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.