10 апреля 2017 года в дистрибутиве Raspbian для Raspberry PI 3 появилась возможность загрузки операционной системы не только с microSD карты, а и через другие интерфейсы, такие как USB, Ethernet и т.д. Такой способ загрузки дает больше возможностей по использованию Raspberry Pi (далее RPI) в качестве сервера. Дело в том, что надежность microSD карточек под большим вопросом, одни работают больше, другие меньше. Учитывая, что Linux регулярно производит операции чтения\записи на системный диск во время журналирования файловой системы, для возможности восстановления данных при сбоях электропитания, а также логирование системных событий, то операции записи\чтения происходят даже во время простоя системы. Отключить демоны журналирования ФС и логирования не очень хочется, про причине их полезности, так что будем использовать более надежное хранилище в качестве корневого накопителя. Из доступных вариантов можно рассмотреть USB Flash накопитель, HDD и SSD.
Перед тем, как появилась возможность использовать внешний накопитель в качестве корневого диска, у меня уже была полностью настроена система, с настроенным application и web сервером, по этому будем переносить уже готовую систему.
И так, начнем. Первым делом обновляем дистрибутив и прошивку:
sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade && sudo apt-get install rpi-update
Далее нужно включить возможность загрузки через USB, для этого дописываем в файл /boot/config.txt
параметр program_usb_boot_mode=1
. После перезагрузки необходимо убедиться, что данный параметр успешно был сохранен в прошивке. Результатом выполнения команды vcgencmd otp_dump | grep 17
должно быть 17:3020000a
. Теперь можно приступить к подготовке нашего накопителя.
В качестве накопителя я использовал mSata SSD Samsung на 32 ГБ и карман mSata - USB Orico MSA-UC3.
Перенос установленной на microSD карту операционной системы Raspbian заключается в следующих этапах:
/boot/cmdline.txt
и /etc/fstab
Список команд будет указан в конце статьи. Касательно последнего пункта, стоит отметить, что путь к SD карте /dev/mmcblk0
, а USB mass storage /dev/sda
После создания таблицы разделов, переноса данных и изменения путей в файлах cmdline.txt и fstab можно выключить RPI и извлечь microSD карту.
Теперь самое интересное. После подключения питания происходит первичная инициализация SOC, за тем USB hub и только после этого на чип AP255x подается сигнал на включение питания на портах USB. С момента подачи питания до начала загрузки диск может не успеть прийти в состояние готовности, в таком случае RPI просто не запустится. Выходом из этой ситуации может стать использование специального кабеля, который позволяет питать внешний накопитель независимо от RPI, а с самим компьютером только обмениваться данными. В таком случае и RPI и внешний накопитель получают питание одновременно, и до момента попытки загрузиться через USB, накопитель уже будет готов. Но такой подход мне не очень нравится, так как нужно использовать еще один USB порт для питания накопителя. По этому слегка переделаем шину питания USB портов в Raspberry PI. Схему на Raspberry PI 3 мне найти не удалось, но определить как устроена шина питания. Все просто. Перед USB портами стоит AP255x, в качестве силового ключа с лимитом по току и индикацией перегрузки. Один из портов я просто отключил от данного контроллера питания USB портов путем откусывания вывода питания, и подключения его к шине питания самого RPI. Это оставляет возможность защиты от короткого замыкания самовосстанавливающимся предохранителем, но пропадает возможность мониторинга перегрузки USB порта к которому подключен диск. Такой вариант меня устроит, так как теперь мой “мини сервер” запускается каждый раз, и нет необходимости использовать соплей в виде отдельного кабеля для питания внешнего диска.
Опытные малиноводы могут заметить, что в разделе bootflow на официальном сайте raspberrypi.org описана ситуация, в которой PRI не загружается через USB по причине того, что накопитель не успевает прийти в состояние готовности поднять D+ в состояние высокого логического уровня, нужно добавить в /boot/config.txt
строку program_usb_timeout=1
, то время ожидания инициализации USB mass storage device будет увеличено с 2 до 5 сек, но в моем случае это не помогло.
Ниже представлены все необходимые команды.
sudo apt-get update && sudo apt-get install rpi-update
sudo BRANCH=next rpi-update
echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
vcgencmd otp_dump | grep 17:
Должно быть 17:3020000a
sudo parted /dev/sda mktable msdos mkpart primary fat32 0% 100M mkpart primary ext4 100M 100% print quit sudo mkfs.vfat -n BOOT -F 32 /dev/sda1 sudo mkfs.ext4 /dev/sda2 sudo mkdir /mnt/target sudo mount /dev/sda2 /mnt/target/ sudo mkdir /mnt/target/boot sudo mount /dev/sda1 /mnt/target/boot/ sudo apt-get update && sudo apt-get install rsync sudo rsync -ax --progress / /boot /mnt/target cd /mnt/target sudo mount --bind /dev dev sudo mount --bind /sys sys sudo mount --bind /proc proc chroot /mnt/target rm /etc/ssh/ssh_host* dpkg-reconfigure openssh-server exit sudo umount dev sudo umount sys sudo umount proc sudo sed -i "s,root=/dev/mmcblk0p2,root=/dev/sda2," /mnt/target/boot/cmdline.txt sudo sed -i "s,/dev/mmcblk0p,/dev/sda," /mnt/target/etc/fstab cd ~ sudo umount /mnt/target/boot sudo umount /mnt/target sudo poweroff
Коментариев пока нет, будьте первым!