Аннотация
Запуск Raspberry Pi с полной поддержкой графики на microSD, навсегда остающейся в режиме read-only после установки системы. Отсутствие какой-либо записи данных на флэш-память повышает надёжность устройства, приближая его к промышленному классу изделий. Пошаговая инструкция. Небольшой театр инженерного абсурда для развлечения аудитории.
/etc/lightdm/lightdm.conf
:...
xserver-command=X -s 0 -dpms -nocursor
...
-nocursor
убирает долой из центра экрана неподвижную стрелку курсора. А вместо нейтрализации скринсейвера можно просто закомментировать его запуск в файле ~/.config/lxsession/LXDE/autostart
. Если это не помогает, можно повесить по cron(8)
с интервалом 718 минут команду xscreensaver-command -deactivate
(это уже стёб, дорогие читатели ;-)~/.config/lxsession/LXDE/autostart
лишь вызов feh с префиксом '@' для перезапуска в случае аварии и соотв. параметрами. Т.е. как бы обычная графика, но без lxpanel
, без pcmanfm
, без xscreensaver
, с отключённым DPMS и скрытым курсором несуществующей мыши.apt-get
и правкой файла autostart
, причём в системе будет всё необходимое для жизнедеятельности стандартных приложений, включая X-сервер, менеджер окон, менеджер сеансов и менеджер дисплея с автовходом пользователя. Но пока это ещё не Вещь, а всего лишь одноплатный десктоп.UPD
Пользователь Jaromir предлагает вообще отказаться от менеджера дисплея и использовать unclutter в тех случаях, когда мышь изредка требуется. Эта утилита скрывает курсор, если мышь находится в покое достаточно долго.
Пользователь Spider55 рекомендует вместо LightDM использовать noDM. Считаю весьма разумным, но тогда пошаговая инструкция чуть меняется.
noatime
не поможет, нужен аппаратный ключ на microSD. Иначе как объяснить тот факт, что по /sys/block/mmcblk0/stat
у меня оказалось считано 282612 секторов, а записано аж 96, и это в режиме read-only? Ладно, хоть соотношение почти 3000:1, на обычной системе оно 5:1.UPD:
Пользователь gattopazzo83 указал мне на промышленную память Flash Media Kit производства известной фирмы Харлампий-Панкрат (теперь уже Эдуардович). Раз у неё 100,000 циклов записи, это точно SLC-память в формате microSD. Даже если уважаемый читатель использует файловую систему в read-only, для серьёзных проектов я настоятельно рекомендую потратиться на промышленную память, это практика крепсондо («до» по-японски означает «путь» ;-)
UPD:
В комментариях достаточно длинная дискуссия вышла у меня с пользователем doga, в результате которой я «открыл» для себя простой способ получать внутреннюю информацию об используемой SD-карточке прямо из командной строки RPi. Пользователь doga в долгу не остался и указал на пакет mmc-utils, который тоже читает внутренности SD-карточки, но готового порта для Raspbian я не увидел. Что-то помещаю в спойлер, который, видимо, будет пополняться и раздуваться.
SD-внутренностиКоманда:udevadm info -a -n /dev/mmcblk0
Можно увидеть «сырые» регистрыCID
иCSD
, из них код изделия (name
), серийный номер (serial
), дату производства (date
), идентификаторы производителя (hwrev, fwrev, oemid, manfid
). Расшифровку можно найти на сайте www.sdcard.org в разделе загрузок «упрощённых» спецификаций (Simplified Specifications), см. Part 1 Simplified, Physical Layer Simplified Specification.
Очень интересный объектstat
, структура которого описана прямо на kernel.org. Эта информация сбрасывается при перезагрузке, но по ней можно оценить среднесуточную нагрузку на чтение и запись.
Коды производителей где-то точно лежат, но я их нашёл только в исходниках lsmmc.c.
«Пробить по базе» карточку можно хотя бы в разделе RPi SD cards на сайте Embedded Linux, это просто отзывы пользователей.
Самое интересное — данных износа — пока не увидел, хотя утилиту mmc-utils собрал, но пока запустить её не удалось.
UPD: часы реального времени
Пользователь st1373 в комментариях напомнил о наличии I2C-совместимых часов реального времени DS3231 (стоимостью примерно в полтора рулона туалетной бумаги). Есть и нехитрая инструкция на русском: Подключение RTC (часов реального времени) к Raspberry Pi.
Извините за переносы строк. Все команды запускаются с правамиroot
, но аккуратный читатель может использовать каждый разsudo
. Честно говоря, я не понимаю, зачем каждую команду запускать черезsudo
, будто это защитит от чего-то. Вот скажите, когда вы в последний раз *не были* уверены, что хотите удалить данный файл в корзину? Это как выпить пять бокалов пива по пол-литра, но на дорожку ещё налейте один 0.33, пожалуйста, а то мне уже хватит… Я дам неправильный совет: если уж взялись за эти игрушки, выходите наroot
командойsudo bash
, не занимайтесь самообманом.
raspi-config
задайте региональные настройки и пароль пользователя pi
. Подключите сеть, Debian — дитя широкополосного доступа. Загрузку в графику пока не включайте.apt-key update
apt-get update
apt-get install --no-install-recommends tightvncserver xtightvncviewer xserver-xorg xinit lxde-core lxappearance lightdm feh xprintidle policykit-1 busybox-syslogd ntpdate watchdog unionfs-fuse
dpkg --purge rsyslog
apt-get remove --purge wolfram-engine triggerhappy cron anacron logrotate dphys-swapfile fake-hwclock
apt-get autoremove --purge
tightvncserver, xtightvncviewer, xprintidle и feh
понадобились мне для частной задачи, можете обойтись без них.xserver-xorg xinit lxde-core lxappearance lightdm policykit-1
.raspi-config
можно включить автозапуск в графическом режиме с автовходом, который будет с правами пользователя pi
. Чем зацикливаться на sudo
, лучше поставить сильный пароль пользователю pi
, и не использовать pi
для автоматического входа в графический интерфейс. Вместо этого создать пользователя pu
и запускать «иксы» с его правами. Причём командный интерпретатор (default shell) этого пользователя лучше либо отключить совсем (поставив /usr/sbin/nologin
), либо подменить специальным скриптом типа /usr/local/bin/pu
. Об этом я намерен рассказать в другой публикации, посвящённой видеотабло с удалённым управлением по SSH, ради чего и создаётся отдельная учётная запись с пониженными правами. Ещё раз благодарю Sauron et al.adduser --home /home/pu --shell /usr/local/bin/pu --uid 990 --gecos "RPi p-u" --gid 1000 pu
mkdir -p /home/pu/.config/lxsession/LXDE
cp -p /etc/xdg/lxsession/LXDE/desktop.conf /home/pu/.config/lxsession/LXDE/desktop.conf
touch /home/pu/.config/lxsession/LXDE/autostart
chown -R pu:pi /home/pu
sed -i 's/^#\?xserver-command=.*$/xserver-command=X -s 0 -dpms -nocursor/' /etc/lightdm/lightdm.conf
sed -i 's/^#\?autologin-user=.*$/autologin-user=pu/' /etc/lightdm/lightdm.conf
/etc/lightdm/lightdm.conf
и задать значения двух параметров, первый я уже упоминал выше, второй говорит сам за себя:...
xserver-command=X -s 0 -dpms -nocursor
...
autologin-user=pu
...
modprobe bcm2835_wdt
echo "bcm2835_wdt " | sudo tee -a /etc/modules
[Install]
в конце файла /lib/systemd/system/watchdog.service
:[Install]
WantedBy=multi-user.target
systemctl enable watchdog.service
watchdog(8)
и watchdog.conf(5)
/boot/cmdline.txt
буквально три слова logo.nologo fastboot noswap
. У меня в итоге получилось так:logo.nologo dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait fastboot noswap
mount_unionfs
где-нибудь в /usr/local/bin
. Не забудьте включить биты выполнимости +x (chmod
755 или 555). Обратите внимание на суффиксы .orig
и .rw
, они должны совпадать с подготовкой (далее):#!/bin/sh
DIR=$1
ROOT_MOUNT=$(awk '$2=="/" {print substr($4,1,2)}' < /etc/fstab)
if [ $ROOT_MOUNT = "rw" ]; then
/bin/mount --bind ${DIR}.orig ${DIR}
else
/bin/mount -t tmpfs ramdisk ${DIR}.rw
/usr/bin/unionfs-fuse -o cow,allow_other,suid,dev,nonempty ${DIR}.rw=RW:${DIR}.orig=RO ${DIR}
fi
insserv -r bootlogs
insserv -r alsa-utils
rm -rf /var/lib/dhcp/
ln -s /tmp /var/lib/dhcp
/home
что-нибудь ненужное, поэтому в дополнение к /etc
и /var
я включил ещё и /home
. Подготовим разделы к переключению в режим UnionFS (внимание на суффиксы .orig
и .rw
):
cp -al /etc /etc.orig
mv /var /var.orig
mv /home /home.orig
mkdir /etc.rw /var /var.rw /home /home.rw
fstab(5)
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat ro 0 2
/dev/mmcblk0p2 / ext4 ro 0 1
mount_unionfs /etc fuse defaults 0 0
mount_unionfs /var fuse defaults 0 0
mount_unionfs /home fuse defaults 0 0
none /tmp tmpfs defaults 0 0
.bash_history
, всякие лог-файлы и т.д. Учтите, что они сейчас могут находиться не там, где обычно (например, в /var.orig
вместо var
).root
. Если файловая система цела, перемонтировать её из read-only в read-write довольно просто:mount -o rw,remount /
fstab(5)
строки, начинающиеся со слова mount_unionfs
, после чего *обязательно* верните на место каталог /var.orig
со всем содержимым (и желательно /home.orig
тоже). Если не восстановить /var
, потеряете базу установленных пакетов, но ведь именно ради установки обновлений безопасности командой apt-get
вы только что распечатали систему, не так ли? Перед apt-get
перезагрузите систему и убедитесь в её адекватности. Как запечатывать обратно, знаете;)UPD: OverlayFS
Уважаемый ValdikSS упомянул проект OverlayFS, который вошёл в ядро Linux в 2014г, уже после оригинального немецкого поста, а такжеinitramfs
. Проект Domoticz, у которого есть и готовый образ для Малинового Прога, может использовать OverlayFS. И заодно ещё раз поблагодарю Sauron за комментарий про Domoticz.
UPD: SquashFS
Пользователи Vooon, Vcoderlab, av_in et al справедливо упомянули в комментариях SquashFS. И даже википедия отмечает, что данная система удачно ложится «под»union mount
, также аккумулируя энтропию записи исключительно в ОЗУ для последующего уничтожения. Однако не стоит забывать, что SquashFS by-design всегда остаётся read-only, т.е. речь идёт скорее о серийном изготовлении firmware-прошивки, с соответствующим (длинным) циклом тестирования, но это не главное. Обновление критических уязвимостей, особенно на раздутых системах, очень сильно удорожает подобные проекты. И не только я считаю, что именно критические уязвимости в IoT будут определять ландшафт информационной безопасности в ближайшие лет десять. Нет ничего невозможного, но даже если уважаемый читатель настолько подкован, что может изготовить стабильный образ системы на SquashFS, стоит ли он двух-трёх Малиновых Прогов? Впрочем, это всего лишь вопрос времени, и мы с вами скоро увидим больше удачных community-проектов для Интернета Вещей на базе SquashFS, в т.ч. и для Raspberry Pi. Например, OpenELEC.
UPD: F2FS
Пользователь nlykl упомянул F2FS aka «Flash-Friendly File System», и на тему МалинПрога есть даже HOWTO: Replace the micro SD card's ext4 root partition by f2fs on the Raspberry PI. DISCLAIMER: мною не проверялось. См. также обзор F2FS в одном онлайн-журнале.
UPD:
Находится ли моя система в зоне риска?
Именно этот вопрос и задаёт себе рациональный читатель. К сожалению, индустрия флэш-памяти для Интернета Вещей только начинает вырабатывать аппаратные механизмы, аналогичные S.M.A.R.T для HDD и SSD. SanDisk, кстати, уже пошёл по этому пути, встроив метрики износа в структуры EXTCSD. И когда нужные стандарты более-менее устаканятся, появится поддержка в ядре Linux и утилиты командной строки. А там, глядишь, и аналогsmartd(8)
для встраиваемых систем появится.
Но получить ответ на вопрос «сколько моя Linux-система записывает на SD-карточку в сутки/неделю» можно уже сейчас, нужно только продержать систему включённой достаточно долго, чтобы статистика получилась точнее (т.е. желателен uptime порядка месяца, или хотя бы 10 дней). Итак, заходим в систему и делаем две команды (без sudo и root):
uptime -p cat /sys/block/mmcblk0/stat | awk '{printf "Uptime read: %.3fMiB (%.1f%% I/Os merged) written: %.3f MiB (%.1f%% I/Os merged)\n", $3*512/1048576, $2/$1*100, $7*512/1048576, $6/$5*100}'
Первая в комментариях не нуждается, а вторая напишет объёмы считанных и записанных данных с момента старта системы, в мегабайтах, а также «кучность» запросов. Например, пользователь Meklon в комментариях весьма любезно поделился цифрами медиа-центра, работающего на базе openELEC / KODI. Примерно за 6 дней система считала порядка 72Мб и записала менее 66Мб. Примечательно соотношение чтение/запись близкое к 1:1, что я связываю с использованием SquashFS (она распаковывает файловую систему в ОЗУ и потому SD-карточку почти не трогает даже на чтение). Классические же системы имеют показатель чтение/запись от 5:1 до 10:1, но он может сильно варьироваться. Однако главное в том, что 10Мб в сутки — это существенно меньше автомобильного регистратора, система с такими параметрами весьма долговечна.
Но помимо статистического подвоха, в такой методике есть ещё один чисто технологический изъян: запись на флэшку производится не блоками по 512 байт, а страницами неизвестного размера. В докладе Optimizations for Cheap Flash Media автора Arnd Bergmann (ссылка, англ.) сказано довольно много интересного по поводу внутренней «кухни» флэшек, в т.ч. упомянут размер страницы 32кБайт. И если принять самый неудачный сценарий «кучности» записи, то каждый блок 512 байт вынудит записать одну страницу, т.е. объём фактически записанных данных получится в 64 раза больше, чем говоритstat
.
Как только автор наберёт достаточно материала, будет продолжение в отдельной публикации.
Make Raspbian System Read-Only
blog.pi3g.com/2014/04/make-raspbian-system-read-only
(источник)
How to make RaspberryPi truly read-only, reliable and trouble-free
k3a.me/how-to-make-raspberrypi-truly-read-only-reliable-and-trouble-free
(без графики)
Protect your Raspberry PI SD card, use Read-Only filesystem
hallard.me/raspberry-pi-read-only
(прислал sisaenkov, улучшенная версия, но тоже без графики)
Stopping SD Card Corruption on Raspberry Pi’s Raspbian
ideaheap.com/2013/07/stopping-sd-card-corruption-on-a-raspberry-pi
(без графики)
Raspberry Pi как информационное табло — с помощью VNC на localhost
habrahabr.ru/post/212661
Подключение RTC (часы реального времени) к Raspberry Pi
raspberrypi.ru/blog/598.html
(использует I2C-совместимые часы DS3231)
ECIO(TM), a powerful USB programmable single chip computer based on PICmicro microcontroller technology
www.matrixtsl.com/product.php?Prod=ECIO28P
Easy Raspberry Pi Based Screensaver/Slideshow for Exhibitions/Store Front
www.instructables.com/id/Easy-Raspberry-Pi-Based-ScreensaverSlideshow-for-E
(у меня вызвал искреннее недоумение шаг 6)
Flash memory card design (2013)
wiki.linaro.org/WorkingGroups/KernelArchived/Projects/FlashCardSurvey
(почему флэшка накрывается гораздо раньше, чем мы ожидаем? польза и вред от оптимизации внутренней логики под FAT; классификация контрафактных продуктов; каталог флэшек 2013г)
Optimizing Linux with cheap flash drives, Arnd Bergmann, 2011
lwn.net/Articles/428584
(иллюстрированная статья)
Optimizations for Cheap Flash Media, Arnd Bergmann, 2011
free-electrons.com/blog/elce-2011-videos
(видео выступления на английском, запись любительская, но интересная)
SD Association, Simplified Specifications, Part 1 Simplified: Physical Layer Simplified Specification
www.sdcard.org/downloads/pls/index.html
Block layer statistics in /sys/block/<dev>/stat
www.kernel.org/doc/Documentation/block/stat.txt
(как оценить износ SD-карточки с момента запуска системы: запуститеcat /sys/block/mmcblk0/stat
и потом сразуuptime -p
)
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
К сожалению, не доступен сервер mySQL