Перенос rootfs banana pi на HDD

banana

Banana pi — это одноплатный компьютер, очень похожий на raspberry pi, но не являющийся ее клоном. Я использую банану для файлового хранилища, потому что плата сильно выигрывает по производительности у raspberry в задачах обмена данными между диском и сетью, а еще банана оборудована sata разъемом и позволяет подключить жесткий диск. Ну а подключив hdd возникает соблазн перенести образ корневого раздела на диск и загружаться с него. В статье расскажу, как перенести корневой раздел на жесткий диск и почему все другие инструкции устарели и не работают. Купить Banana pi у проверенного мной продавца вы можете здесь.

Все действия выполняю прямо на banana pi из-под ОС bananian с подключенным жестким диском. Так что для повторения моих шагов вам потребуется раскатать образ ОС по официальной инструкции на SD карту и загрузиться с нее.

0) Обнаружение диска

Поскольку sata порт всего один, диск определится как /dev/sda. Но не лишним будет убедиться в этом командой ls /dev/sda:

Проверяем наличие устройства

Проверяем наличие устройства

Если такого устройства нет, ищите диск командой dmesg | grep ‘scsi’ -n1. В выводе ищите имя устройства после строки scsi 0:0:0:0: Direct-Access:

Альтернативный способ обнаружить имя устройства диска

Альтернативный способ обнаружить имя устройства диска

Если и теперь его нет, проверьте, подключение и всякое такое. Когда, наконец, нашли диск, запомните имя устройства и далее в инструкции заменяйте sda на правильное имя.

1) Подготовить диск

Сделаем это из консоли. Это не страшно. Запускаем команду:

sudo fdisk /dev/sda

Я создал виртуальный диск на 15Гб для того, что бы сделать скриншоты. Пусть вас не смущает маленький объём разделов.

Смотрим существующие разделы командой p (print).
Если диск новый, то разделов быть не должно. Можете переходить к пункту 2. У меня БУ диск и я предпочитаю удалить разделы и создать все заново. Для удаления служит команда d (delete). После ввода команды нужно указать номер раздела для удаления. Повторите это для всех разделов. После завершения дайте команду w для сохранения изменений.

Удаление разделов на диске с помощью fdisk

Удаление разделов на диске с помощью fdisk

2) Создаем разделы

Снова запустите команду:

sudo fdisk /dev/sda

Раздел создаётся командой n (new). После ввода команды нужно ответить на вопросы программы разметки. Можно оставить по умолчанию и просто нажать Enter на первые 3 вопроса: раздел будет основным (primary) или расширенным (extended), какой желаете номер раздела и где будет начальный сектор.

Последний, четвёртый, вопрос важен, там вас спросят, какого размера раздел вы хотите. Если просто нажать Enter, оставив значение по умолчанию, раздел займет весь доступный объем. Я рекомендую создать 3 раздела: корневой для ОС, раздел подкачки и все остальное для хранения данных. Так что я на последний вопрос отвечаю: +10G. Таким образом, прошу создать раздел размером 10 гигабайт. Повторяем последовательность еще 2 раза: создаем swap на 1 гигабайт и третий раздел на все оставшееся пространство. То есть, просто жмакаем Enter на четвертый вопрос.

Создание разделов на диске с помощью fdisk

Создание разделов на диске с помощью fdisk

Теперь нужно изменить тип раздела подкачки на «Linux swap». Для изменения типа раздела служит команда t. Далее указываете номер раздела (в нашем случае 2) и наконец, вводите код типа раздела. Полный список типов можно узнать командой L, но в данной ситуации можете просто ввести 82. Код 82— это и есть Linux swap:

Изменение типа раздела разделов на диске с помощью fdisk

Изменение типа раздела на диске с помощью fdisk

После всех процедур записываем изменения командой w (write).

Сохранение изменений fdisk

Сохранение изменений fdisk

3) Создаем файловые системы

Для хранения данных можно использовать любую, какая вам нравится. Для корневого раздела обязательно ext4. Я рекомендую данные тоже хранить на ext4. Создаем:

sudo mkfs.ext4 /dev/sda1
sudo mkswp /dev/sda2
sudo mkfs.ext4 /dev/sda3

4) Готовим образ для переноса на жесткий диск

Если у вас нет оригинального образа (того, что вы записывали на sd карту), то можете перейти сразу к шагу 5. Но для избежания ряда проблем лучше заморочится с оригинальным образом. Образ нужно передать на банану. Для этого я примонтировал раздел hdd для данных:

mkdir /tmp/data
mount /dev/sda3 /tmp/data

Далее скопировал с другого компьютера файл с образом:

scp ~/Загрузки/bananian-1508.img root@<BANANA IP>:/tmp/data

Вместо <BANANA IP> укажите IP адрес бананы, который можно узнать командой ifconfig eth0. Пароль по умолчанию pi (тот самый, с которым вы залогинились в ОС). Для передачи файла с компьютера под управлением Windows поищите программку winscp.

Итак, нужно скопировать содержимое второго раздела из образа на жесткий диск. Поскольку ОС bananian поставляется в образе устройства, а не разделов, мы не можем просто так примонтировать один раздел из файла образа. Нужно сначала заглянуть внутрь и вычислить смещение в байтах от начала файла. Это опять же, не сложно. Запускаем команду:

sudo parted /tmp/data/bananian-1508.img

Видим:

GNU Parted 3.2
Используется /tmp/data/bananian-1508.img
Добро пожаловать в GNU Parted! Наберите ‘help’ для просмотра списка команд.

Набираем команду unit B для отображения размерностей в байтах:

(parted) unit B

Командой p смотрим разделы в образе:

(parted) p
Модель: (file)
Диск /tmp/data/bananian-1508.img: 1899999744B
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: msdos
Флаги диска:

Номер Начало Конец Размер Тип Файловая система Флаги
1 1048576B 22020095B 20971520B primary fat16
2 22020096B 1899999743B 1877979648B primary ext2

(parted)

Здесь нас интересует второй раздел. Число 22020096B указывает на начало раздела в байтах. Запомните его. Обратите внимание, что ФС раздела указана как ext2. Но если вы перенесете файлы на диск, отформатированный в ext2, плата не загрузится. Там ext4. Такие дела.

5) Переносим файлы ОС

Монтируем диски для переноса файлов. Сначала создадим каталоги:

sudo mkdir /mnt/{from,to}

Монтируем жесткий диск:

sudo mount /dev/sda3 /mnt/to

Монтируем образ, указав смещение (если у вас нет образа, пропускайте этот шаг):

mount -o loop,offset=22020096 /tmp/data/bananian-1508.img /tmp/from

Число 22020096 — это смещение, которое мы вычислили на шаге 4.

6) Копируем данные

rsync -avz —progress /mnt/from/* /mnt/to/

Если вы не монтировали образ, команда такая:

rsync -avz —progress / /mnt/to/

Процесс копирования займет около 10 минут. Выпейте чаю.

7) Меняем параметры загрузки. Узнаем, почему другие статьи устарели

Раньше для указания параметров загрузки служил текстовый файл /boot/uEnv.txt. В последнем релизе все не так. Во-первых, файл с параметрами стал бинарным, во-вторых лежит на первом разделе SD карточки, который не примонтирован.
Поэтому…опять ничего сложного.
Для компиляции бинарного файла понадобится установить дополнительный пакет:

sudo apt-get install u-boot-tools

Монтируем раздел:

sudo mount /dev/mmcblk0p1 /boot

Открываем на редактирование файлик:

sudo nano /boot/boot.cmd

Здесь находим все упоминания /dev/mmcblk0p2 и заменяем их на /dev/sda1

Сохраняем командой Ctrl+O , и выходим: Ctrl+X

Теперь компилируем текст в бинарник:

sudo mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr

Это все! Теперь команда reboot и ОС загрузится уже с жесткого диска.

8) После перезагрузки

В принципе, на этом можно бы и закончить инструкцию, но для завершённости покажу, как примонтировать разделы автоматически после загрузки. Создадим каталог для хранения данных:

mkdir /data

Далее, узнаем UUID наших разделов. Нас интересует /dev/sda2 и /dev/sda3 (swap и data соответственно). Команда blkid /dev/sda2 /dev/sda3 покажет всё, что нам нужно:

Выясняем UUID разделов на жёстком диске

Выясняем UUID разделов на жёстком диске

Теперь открываем на редактирование файл /etc/fstab командой sudo nano /etc/fstab и приводим его к такому виду:

UUID=e4ad0147-4648-48dc-91a0-07dc52fcb955 swap swap defaults 0 0
UUID=e29dd58b-9ab6-483b-8e95-e37e56f808f9 /data ext4 defaults 0 0

Здесь после UUID= указывается идентификатор раздела, который мы выяснили на прошлом шаге, далее точка монтирования. тип файловой системы и параметры монтирования. Можете просто скопировать мой пример, заменив в нём идентификаторы на свои.

Снова Ctrl+O для сохранения и Ctrl+X для выхода из редактора.

После перезагрузки можно проверить, что /dev/sda3 примонтирован командой mount (обратите внимание на выделенную строку):

Вывод команды mount

Вывод команды mount

Напомню, купить Banana pi у проверенного мной продавца вы можете здесь. Набор комплектующих (корпус, блок питания, радиатор процессора, спецальный SATA кабель) по адекватной цене по этой ссылке ссылке.

А ещё я собираю целую кучу ссылок на товары продавцов, которые заказаны и проверены лично мной: Где всё это купить.