xfce4-terminal и rm -Rf

Мы тут чуть-чуть ембедедом увлеклись и слабали изделие а-ля веб-камера. А работает оно под управлением Debian GNU/Linux. Всё бы ничего, но там нынче systemd, который точно будет насиловать флешку. К гадалке не ходи… По-этому было решено, что root живёт в памяти. Подумал я сначала об aufs, но её тут, оказывается, выпилили из upstream. Не безосновательно, отмечу: её автор всегда любил быдлокод и комментарии на родной японской мове (все японцы редкостные националисты, с их точки зрения тот, кто не умеет в японский язык, — не достоин их код разбирать). Похоже это наконец то надоело тем, кто отвечал за данный сегмент ядра. Тем более, что коммиты от создателя кончились давно, а поддерживать это надо было… Проще оказалось убрать нафиг.

Глянул я на пропиаренную OverlayFS. Слабал скриптики для отбработки. Скажем так: танцев с бубном вокруг монтирования OverlayFS немерено! Да, я знаю, что есть в Ubuntu пакет overlayroot. Но, во-первых, это — вещь в себе. С зависимостями от cryptsetup. Что? Зачем это? Ну и внутри там комбайн на много функций, построенный поверх скриптового велосипеда. Ну вот не надо таких усложнений.

Хотелось бы, чтобы из ОС это выглядело как обычный раздел ext2, запись в который просто не приводила бы к изменению данных на носителе, оставаясь в памяти. device-mapper же! И это у нас уже было в статье об защите флешек от перезаписи.

Короче, нужно просто добавить новый скрипт к набору скриптов в initrd и указать необходимые модули. Конечно должен стоять пакет dmsetup! Листинг с тестовой машины:

root@debian:~# cat /etc/initramfs-tools/scripts/local-premount/brd_root 
#!/bin/sh

case $1 in
prereqs)
	exit 0
	;;
esac

BRD_ROOT_REAL=`grep -o -E '(^|\s)brd_root_real=\S+(\s|^)' /proc/cmdline | grep -o -E '\S+' | sed -E 's/brd_root_real=//'`
BRD_ROOT_SIZE=`grep -o -E '(^|\s)brd_root_size=[0-9]+(\s|^)' /proc/cmdline | grep -o -E '[0-9]+'`

grep -q -E '(^|\s)root=/dev/mapper/brd_root(\s|$)' /proc/cmdline || exit 0
test -n "${BRD_ROOT_REAL}" || exit 0
test -n "${BRD_ROOT_SIZE}" || exit 0

modprobe brd rd_nr=1 rd_size=${BRD_ROOT_SIZE} max_part=0

ROOT_BLK_SIZE=`blockdev --getsz ${BRD_ROOT_REAL}`
echo 0 ${ROOT_BLK_SIZE} snapshot ${BRD_ROOT_REAL} /dev/ram0 N 64 | dmsetup create brd_root

exit 0
root@debian:~# cat /etc/initramfs-tools/modules                         
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax:  module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
rbd
dm_snapshot
dm_bufio
dm_mod
root@debian:~# 

После обновления initrd (ну чтобы туда попали скрипты и модули), необходимо убедится, что ядро будет грузится с тремя необходимыми параметрами:

  1. root=/dev/mapper/brd_root, где значение параметра — константа, которую не стоит менять;
  2. brd_root_real=/dev/mmcblk0p2, где значение параметра — путь к реальному блочному устройству содержащему ФС
  3. brd_root_size=308224, где значение — размер блочного снапшота в памяти, доступного к записи, в КБ

Если первый параметр будет указан не с эталонным значением, то хук не отработает!

PS: да, ембедед с полноценным Дебианом внутри. Нет, не стоило собрать велосипед из кучи make’ов. В этом есть смысл, когда у тебя всё надо в 16МБ флешку запихать. И для работы будет доступно ещё 32МБ оперативки. Там ещё и ядро 2.4 будет, так как новей не влезет. Это всё про экономию каждого цента в бросовых устройствах. Конечно же, всё в ущерб здравому смыслу. А когда размеры позволяют, — можно полноценный дистрибутив ставить.

Одна мысль о “Как защитить флешку от износа через dm_snapshot/rbd, embeded Debian ёптыть!

  1. pavel:

    Если что, то идея оказалась не очень. Всех спасло (как и ожидалось) внедрение aufs.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

90 ÷ 9 =