Перенос Raspbian на mSata SSD

12.09.2017 23:08:46

10 апреля 2017 года в дистрибутиве Raspbian для Raspberry PI 3 появилась возможность загрузки операционной системы не только с microSD карты, а и через другие интерфейсы, такие как USB, Ethernet и т.д. Такой способ загрузки дает больше возможностей по использованию Raspberry Pi (далее RPI) в качестве сервера. Дело в том, что надежность microSD карточек под большим вопросом, одни работают больше, другие меньше. Учитывая, что Linux регулярно производит операции чтения\записи на системный диск во время журналирования файловой системы, для возможности восстановления данных при сбоях электропитания, а также логирование системных событий, то операции записи\чтения происходят даже во время простоя системы. Отключить демоны журналирования ФС и логирования не очень хочется, про причине их полезности, так что будем использовать более надежное хранилище в качестве корневого накопителя. Из доступных вариантов можно рассмотреть USB Flash накопитель, HDD и SSD.

  • 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 заключается в следующих этапах:

  1. Создание таблицы разделов на новом накопителе
  2. Копирование всех файлов на новый накопитель
  3. Изменение путей в файлах /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 

Коментариев пока нет, будьте первым!