Чи корисна використання файлової системи, що використовується лише для читання, для вбудованої установки?


15

Мені доручено запустити Linux як операційну систему на вбудованому пристрої.

Ціль має процесор x86 і має 8 Гб CompactFlash пристрій для зберігання.

Мені вдалося використовувати buildroot для створення зображення ядра та інструментів перехресної компіляції. Я розділив пристрій CF на невеликий розділ FAT, де розміщується зображення ядра, а також syslinuxконфігурація завантаження та ext3файлова система, де я розпакував кореневу файлову систему, сформовану програмою buildroot.

Система завантажується успішно syslinux, встановивши кореневий каталог на розділ CF ext3, де знаходиться моя файлова система buildroot.

Моє запитання зосереджене на необхідності надійності в умовах негайних (і частих) втрат електроенергії, оскільки це має вирішальне значення для успішного завантаження пристрою після відключення електроенергії. Я читав, що встановлення кореневої файлової системи як лише читання - це спосіб забезпечення цілісності даних. Це розумний спосіб для мене?

Я також читав про можливість завантаження кореневої файлової системи в оперативну пам’ять, щоб досягти того самого, але поки не знаю, як це зробити.

Чи є кращий спосіб досягнення цієї мети і якщо так, то який для мене найкращий шлях?

Відповіді:


11

Нова відповідь (22.03.2015)

( Примітка. Ця відповідь простіша за попередню, але не більш безпечна. Перша моя відповідь сильніша, тому що ви можете тримати файли, доступні лише для читання, за допомогою параметрів монтажу fs перед прапорцями дозволу. Тому змушувати писати файли без дозволу на запис не вийде. зовсім.)

Так, під Debian є пакет: fsprotect ( домашня сторінка ).

Він використовує aufs(за замовчуванням, але може використовувати інший unionfsінструмент) для дозволу змін в прямому сеансі, але в оперативній пам’яті за замовчуванням, тому все забувається при перезавантаженні.

Ви можете встановити їх, запустивши просто:

apt-get install fsprotect

Після закінчення роботи з веб-документа:

Після того:

  • Відредагуйте /boot/grub/menu.lstабо /etc/default/grub2або /etc/lilo.confдодайте " fsprotect=1G" параметри ядра.
  • Змініть 1G за потребою.
  • Застосувати зміни (тобто виконати update-grub)
  • Відредагуйте, /etc/default/fsprotectякщо ви хочете захистити інші файлові системи /.
  • перезавантажити

Ви також можете захистити паролем завантажувач завантаження паролем або заборонити будь-які його зміни.

Звідти, якщо якийсь файл захищений від змін, зразок від

chmod ugo-w myfile

якщо ви використовуєте для зразка vi myfileі намагаєтеся написати на ньому команду :w!, це буде працювати, і ваш myfileзмінився. Ви можете перезавантажити, щоб отримати немодифіковані myfile.

Це неможливо навіть із моїм наступним рішенням:

Стара (перша) відповідь:

Так, це сильне рішення, але потужне!

Робимо корисність

Ви повинні монтувати деякі каталоги в rw , як /var, /etcа може , і /home. Це можна зробити за допомогою aufs або unionfs . Мені подобається інший спосіб , використовуючи /dev/shmта mount --bind:

cp -a /var /dev/shm/
mount --bind /dev/shm/var /var

Ви могли раніше перенести всі каталоги, які не повинні змінювати нормальну роботу в a static-var, ніж створювати посилання в / var:

mkdir /static-var
mkdir /static-var/cache
mkdir /static-var/lib
mv /var/lib/dpkg /static-var/lib/dpkg
ln -s /static-var/lib/dpkg /var/lib/dpkg
mv /var/cache/apt /static-var/cache/apt
ln -s /static-var/cache/apt /var/cache/apt
... # an so on

Таким чином, при повторному перезавантаженні в ро, копіювання /varв /dev/shmне займе занадто багато місця, оскільки більшість файлів переміщені, /static-varа в оперативні пам’яті потрібно копіювати лише символьні посилання.

Кращий спосіб зробити це тонко - це зробити повний цикл живлення, один день повного робочого дня і тонко виконати команду на зразок:

find / -type f -o -type f -mtime -1

Так ви побачите, які файли потрібно розмістити на розділі для читання-запису.

Ведення журналів

Оскільки в цьому хості немає статичної пам’яті, що записується, для того, щоб зберігати історію та інші журнали, ви повинні налаштувати віддалений syslogсервер.

echo >/etc/syslog.conf '*.* @mySyslogServer.localdomain'

Таким чином, якщо ваша система зламається з будь-якої причини, все раніше реєструється.

Модернізація

Під час запуску тих, хто mount --bindвикористовується, для такого оновлення під час використання системи (без необхідності запуску init 1, скорочення часу роботи), більш простим способом є відновлення чистого кореня , здатного здійснити оновлення:

Після повторної перестановки "/" у режимі читання-запису :

mount -o remount,rw /

for mpnt in /{,proc,sys,dev{,/pts}};do
    mount --bind $mnpt /$mnt$mpnt;
    done

chroot /mnt

apt-get update && apt-get dist-upgrade

exit

umount /mnt/{dev{/pts,},proc,sys,}

sync
mount -o remount,ro /

І зараз:

shutdown -r now

Дякую за вашу відповідь. Я не повністю розумію це, оскільки мої навички Linux на сьогодні не великі. Це все ще дуже корисно, але дає мені ще кілька напрямків для дослідження.
математик1975

Відповідь відредаговано! Нове рішення та пояснене відрізняється!
Ф. Хаурі

Це не дає відповіді на запитання, це чудова відповідь для системи на основі debian, але Buildroot не заснована на debian.
Любить

@LovesTha Подивіться на стару (першу) відповідь ! Це менше на основі Debian, і U може зрозуміти принцип і реалізувати той самий механізм для будь-якого типу розподілу / установки. (Навіть якщо Оновлення розділу показують команди Debian, U може зробити те ж саме для ручної модернізації або будь-якого іншого DISTRIB на основі оновлення.)
Ф. Hauri

Ваша стара відповідь буде чудовою відповіддю на загальне запитання щодо налаштування лише систем зчитування Linux. Після того, як я закінчив своє дослідження, щоб зробити наш «buildroot» лише читанням, я сподіваюсь повернутися і дати чудову детальну відповідь на конкретне питання тут. У Buildroot вже є тимчасові біти / var, які посилаються на / tmp, що є tempfs. / і т.д. не слід використовувати в якості місця для подряпин для програм, тому з ним не потрібно обробляти спеціально.
Любить,

3

У мене є лише досвід використання новітньої програми buildroot (2014-02). У цій версії ви можете відключити "перезавантажити кореневу файлову систему для завантаження чи запису завантаження" у конфігураційному файлі за допомогою:

BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW не встановлено

Мені вдалося створити зображення, яке просто використовує його ext4 / розділ як лише читання, тому відключення живлення системи зовсім не шкодить. Це чудово працює, тому якщо вам не потрібно писати у вашу файлову систему, можливо, це набагато простіше рішення, ніж вищезгадане (яке здається більш-менш застосовно до системи Debian, як це стосується apt-get).


Дякую за відповідь - проте врешті-решт я вибрав налаштування initramfs із встановленням лише декількох каталогів з опцією синхронізації на приводі CF для збереження даних. Наразі це мені досить добре послужило.
математик1975

Щоб додати до цього: використовуючи старіші версії buildroot, перевірте, /etc/inittabчи не /відбувається повторне перепланування . Якщо так, то змініть його на свої потреби.
evnu

Ця відповідь є важливим елементом "способу нарощування", щоб це зробити. Значна частина порад у прийнятій відповіді знадобиться для більш складних систем. Однак є ймовірність, що все, що потрібно зробити, - це встановити кілька додаткових посилань на / tmp (tempfs) і все працює.
Любить,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.