9

Мне нужен дистрибутив Linux, который даст мне следующее:

  • Запустить на малины пи
  • Может надежно пережить потерю мощности (как через файловую систему только для чтения)

Мне удалось найти некоторую документацию о том, как перевести обычный дистрибутив Linux в режим только для чтения. Я надеялся, что уже будет создан дистрибутив, предназначенный для работы во встроенной среде.

Мне не нужно много пакетов или драйверов, достаточно, чтобы Pi работал с USB/Ethernet. Мне не нужен какой-либо графический интерфейс или что-то еще, это будет просто запуск специального сервиса, встроенного в C.

Кто-нибудь знает дистрибутив, который подойдет?

7 ответов7

3

Большинство встроенных систем используют собственное ядро. Одним из инструментов, облегчающих эту задачу, является Buildroot, набор скриптов для сборки цепочки инструментов GNU gcc, библиотеки uClibc вместо (огромного) libc GNU, ядра Linux, BusyBox и других утилит / пакетов для корневой файловой системы встроенной платы. RaspberryPi является относительно новой платой, поэтому его поддержка в Buildroot все еще находится в стадии разработки, но, очевидно, есть проект, другой проект и работа отдельного человека. Вероятно, будет больше по мере наращивания производства RP и улучшения распределения.

Используя Buildroot, вы можете собрать ядро Linux и корневую файловую систему точно так, как вы описали в своем вопросе. В зависимости от скорости вашего интернет-соединения и возможностей вашего ПК для разработки у вас могут быть двоичные файлы от 1 до 4+ часов. Недостатком является то, что полученные двоичные файлы не тестируются и не гарантируют успешную загрузку и выполнение. Системная консоль обязательна для отладки последовательности загрузки. См. Мой ответ для Как получить доступ к моему мини-ПК (RaspberryPi / MK802 / Mele A1000 / VIA APC) через Ethernet / Wi-Fi без монитора? Но, учитывая, что RaspberryPi был спроектирован так, чтобы его нельзя было разложить на кирпичи, этот недостаток не должен быть сдерживающим фактором при создании собственного ядра и RFS.

Относительно "выживания при потере мощности". Правильный выбор файловой системы обычно может облегчить эту проблему. Уровень устройства MTD плюс файловая система журналирования (например, jffs2) показали себя достаточно устойчивыми из опыта. Для почти абсолютной защиты есть initramfs, который использует ramfs (не ramdisk фиксированного размера) без переключения на файловую систему R/W.

добавление

30 слайдов об особенностях Buildroot здесь
В конце (# 27) есть упоминание о нескольких похожих и альтернативных инструментах для построения встроенных систем.

2

TinyCoreLinux по умолчанию доступен только для чтения (постоянство не обязательно):http://www.tinycorelinux.net/ports.html

1

Если я правильно помню, файловая система только для чтения не будет «защищать» SD-карту. У меня есть 10 Пи, работающих на клиента (текущее время бесперебойной работы более чем на 80 дней для половины из них), где мощность не так стабильна, как вы ожидаете / хотите. Мне потребовалось некоторое время, чтобы найти источники питания (дешевые зарядные устройства с номиналом 3 А и «дорогие» зарядные устройства для iPad с номиналом 2,3 А), которые фактически могли поддерживать работу Pi более двух дней, а до этого у меня возникали всевозможные проблемы с повреждением SD. , в том числе с тем, который был использован только для чтения IIRC.

Моя проблема в основном решена сейчас (из-за новых поставок), но для будущих проектов я смотрю на создание корневой файловой системы NFS. Об этом уже есть много учебных пособий, в основном, разрешающих обычные образы Pi-fs, но довольно просто сделать минимальный debootstrap и превратить его в корневую файловую систему только для чтения поверх NFS. Соедините это с uboot для Pi и умным сценарием uboot, и ваша SD-карта будет содержать всего несколько мегабайт прошивки RPi, образа uboot и сценария uboot.

1

Имея Seagate Dockstar с консольным доступом, я установил на нее Debian squeeze. В качестве отправной точки, чтобы заставить его работать на root только для чтения, я использовал эту прекрасную статью 1 Джеффа Дузана. Основная стратегия включает в себя создание сценария, который при каждой загрузке монтирует необходимые директории для записи в виде tmpfs. Я цитирую сценарий Джеффа 2 здесь (слава Джеффу!)

#!/bin/bash
DIRS="/tmp /var/log /var/run /var/lock /var/tmp /var/lib/urandom /var/lib/dhcp /etc/network/run"
for DIR in $DIRS; do
  echo "Mounting $DIR as tmpfs"
  mount -n -t tmpfs tmpfs $DIR
  if [ -d "$DIR-saved" ]; then
    echo "Restoring $DIR-saved to $DIR"
    tar -C "$DIR-saved" -cf - ./ | tar -C "$DIR" -xpf -
  fi
done

echo "nameserver 4.2.2.1" > /var/tmp/resolv.conf
touch /var/lib/dhcp/dhcpd.leases

exec /sbin/init

Сохраните строки выше как скрипт с именем /sbin/init-ro на целевых rootfs и сделайте его исполняемым.

chmod 755 /sbin/init-ro

Чтобы использовать этот сценарий во время загрузки, вам нужно немного подготовить системные rootfs (все цитируются из сценария Джеффа 2 (адаптировать $ROOT к фактическому расположению ваших смонтированных rootfs).

# Configure dhcp-client to write resolv.conf to /tmp instead of /etc
sed -i 's/\/etc\/resolv.conf/\/var\/tmp\/resolv.conf/' $ROOT/sbin/dhclient-script > /dev/null 2>&1
rm $ROOT/etc/resolv.conf
ln -s /var/tmp/resolv.conf $ROOT/etc/resolv.conf


# make /etc/network/run/ a symlink to /tmp/network/
rm -rf $ROOT/etc/network/run
ln -s /var/tmp/network $ROOT/etc/network/run


# Fixes from http://wiki.debian.org/ReadonlyRoot

rm $ROOT/etc/blkid.tab  > /dev/null 2>&1
ln -s /dev/null $ROOT/etc/blkid.tab

rm $ROOT/etc/mtab  > /dev/null 2>&1
ln -s /proc/mounts $ROOT/etc/mtab

rm $ROOT/etc/rcS.d/S12udev-mtab

rm -rf $ROOT/var/log/*

После того, как rootfs подготовлены, как описано выше, вы можете смонтировать rootfs только для чтения в /etc /fstab (замените ext2 той файловой системой, которую вы используете, или просто используйте вместо нее rootfs ).

/dev/root  /                 ext2  noatime,ro   0 1

Наконец, вы должны добавить следующее к параметрам вашего ядра (то есть в /boot/cmdline.txt в Raspi), чтобы запустить скрипт до фактического /sbin/init. (Ниже приведен только пример параметров root и rootdelay. Важная часть, которую необходимо добавить к строке в cmdline.txt, - это init=/sbin/init-ro .)

root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro

Но имейте в виду, что для любого программного обеспечения, требующего доступа для записи в rootfs, вы должны смонтировать соответствующие местоположения tmpfs или выполнить запись во внешнее хранилище.

1

Мои 2 цента, гораздо проще (и, в конце концов, лучше) сделать надежную резервную батарею для Pi, чем жить с ОС только для чтения. Конечно, это означает, что вам понадобятся некоторые базовые знания в области электроники (и я имею в виду BASIC; мы говорим о 3-4 компонентах). Этот парень сделал модный с несколькими другими: https://raspberrypi.stackexchange.com/questions/1360/how-do-i-build-a-ups-like-battery-backup-system

Если вы сделаете это, НЕ используйте LiPo; NiCad - это то, что вы хотите. LiPo не может постоянно заряжаться; Вы были предупреждены.

Кроме того, вы, кажется, очень беспокоитесь о чем-то, что, по моему опыту, является очень незначительной проблемой. Я постоянно перебиваю свои Linux-боксы, и внезапное незапланированное отключение - это само собой разумеющееся, когда меня это не беспокоит. Если вы отключите логи, то вы редко будете получать жалобы на это.

Чтобы отключить все журналы, вы можете добавить следующую строку в качестве первого правила в /etc/rsyslog.conf:

*.* ~

Даже когда есть проблема, 99,9999% времени (под этим я имею в виду почти каждый раз в моем личном опыте) эта проблема решается при следующем сканировании диска. Когда это происходит, в основном зависит от погоды, ОС заметила, что вы сделали (как ни странно, обычно это не так). Поскольку Pi использует SD-карты, я представляю, что на Pi это происходит даже реже, чем на моем ПК.

0

Я слышал хорошие вещи о Puppy Linux для этого. Хотя должен признать, что не пробовал.

Может быть установлено, что запись на SD-карту невозможна.

-1

На странице загрузки raspberrypi.org доступны четыре изображения:

  • Debian "Wheezy"
  • Мягкий поплавок Debian "Wheezy"
  • Arch Linux ARM
  • QtonPi

А вот единственный, который по умолчанию доступен только для чтения (но его можно изменить при необходимости):

Надеюсь, один из них удовлетворит ваши потребности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .