Raspberry pi защита флешки
======!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!==========
Возможно более актуально здесь.
==============================================
Содержание
Временные методы
Уменьшение логирования
В файле /etc/rsyslog.conf комментируем (знаком # в начале строки) строки:
$ModLoad imuxsock # provides support for local system logging $ModLoad imklog # provides kernel logging support
Можно так же поиграться и дальше для отключения требуемых логов системы
Отключить swap
# dphys-swapfile swapoff # dphys-swapfile uninstall # update-rc.d dphys-swapfile disable
Монтирование корневой файловой системы в режиме ReadOnly
Взято здесь.
Все изменения будут записываться в файловую систему хранимую в ОЗУ (может не хватить памяти, следите за логами).
Для данных которые требуется сохранять между перезагрузками можно воспользоватся внешними хранилищами, например: внешняя флешка, сетевой диск и т.п.
Добавляем в файл /usr/share/initramfs-tools/hook-functions в строку 528 "overlay" (у вас может отличатся, ищите подобное):
for arg in "$@" ; do case "$arg" in base) modules="$modules ehci-pci ehci-orion ehci-hcd ohci-hcd ohci-pci uhci-hcd usbhid overlay " modules="$modules xhci xhci-pci xhci-hcd" modules="$modules btrfs ext2 ext3 ext4 ext4dev "
Создадим новые сценарии загрузки "overlay" для этого выполним:
# cd /usr/share/initramfs-tools/scripts # cp local overlay # cp -rp local-premount overlay-premount
Дальше у меня это не получилось, так как нет local-bottom и я пропустил этот шаг:
# cp -rp local-bottom overlay-bottom
Теперь в файле /usr/share/initramfs-tools/scripts/overlay заменим процедуру local_mount_root():
local_mount_root() { local_top local_device_setup "${ROOT}" root # Get the root filesystem type if not set if [ -z "${ROOTFSTYPE}" ]; then FSTYPE=$(get_fstype "${ROOT}") else FSTYPE=${ROOTFSTYPE} fi local_premount ROOT=$(resolve_device "$ROOT") # if [ "${readonly}" = "y" ]; then roflag=-r # else # roflag=-w # fi # FIXME This has no error checking modprobe ${FSTYPE} checkfs ${ROOT} root # FIXME This has no error checking # Mount root mkdir /upper /lower if [ "${FSTYPE}" != "unknown" ]; then mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /lower else mount ${roflag} ${ROOTFLAGS} ${ROOT} /lower fi modprobe overlay mount -t tmpfs tmpfs /upper mkdir /upper/data /upper/work mount -t overlay \ -olowerdir=/lower,upperdir=/upper/data,workdir=/upper/work \ overlay ${rootmnt} }
Теперь создадим подходящие initramfs:
# uname -a Linux raspberrypi 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux # update-initramfs -c -k 4.9.24-v7+ update-initramfs: Generating /boot/initrd.img-4.9.24-v7+ # cd /boot # mv initrd.img-4.9.24-v7+ initrd7.img
Обратите внимание, у вас будет свое ядро!
Теперь, чтобы включить initramfs добавить строки в /boot/config.txt:
kernel=kernel7.img initramfs initrd7.img
Затем отредактируйте файл /boot/cmdline.txt, чтобы добавить опцию boot=overlay в начало:
boot=overlay dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
Для того, что бы вернуть все в исходное состояние, требуется вернуть изменения в файлах /boot/config.txt и /boot/cmdline.txt.
Если после перезагрузки Raspberry Pi не загрузится, то подключите флешку из Raspberry Pi и верните в исходное состояние файлы /boot/config.txt и /boot/cmdline.txt.
Если все понятно, то перезагружаемся :)
Защита от переполнения файловой системы в памяти (опционально)
Возможно еще нужен сторожевой таймер (Watchdog) для зашиты от зависания.
Так как память на raspberry ограниченна, на overlay отводится по умолчанию 430M, то есть когда изменения корневой файловой системы достигнут предела, то отчистить ее можно простой перезагрузкой системы, для этого в /etc/crontab добавляем строку:
# Когда место в корневой файловой системе закончится (100%) перезагрузить систему. * * * * * root /bin/df -h | /bin/grep /$ | /usr/bin/awk '{if ($5=="100%") system ("/sbin/shutdown -r now")}'
и перезапускаем cron
# service cron restart
это позволит отреагировать на проблему в течении одной минуты.
Монтирование /boot в режиме ReadOnly
Не забудем временно отключить предыдущий пункт с корневой файловой системой.
Затем в файле /etc/fstab в строке с /boot добавляем ,ro
proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults,ro 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1
После перезагрузки все ок. Делаем корневую файловую систему в readonly (см. выше). И перезагружаемся, все теперь устройство можно обесточивать не боясь за флешку.
Перемонтирование /boot в режим rw
Если нам требуются внести изменения в /boot то можно перемонтировать так:
# mount -o remount,rw /boot