Raspberry pi защита флешки

Материал из rrv-wiki
Перейти к навигации Перейти к поиску
======!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!==========

Возможно более актуально здесь.

==============================================

Временные методы

Уменьшение логирования

В файле /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