Загрузка Raspberry Pi 4 с USB
Поразительное рядом, но если третья версия Raspberry Pi прекрасно сама умеет загружаться с USB, то с Raspberry Pi 4 до сих пор (на момент написания этого текста) еще приходится колдовать и шаманить. Относительно недавно появилась возможность перейти на beta версию загрузчика, которая вроде как позволит грузиться с USB, но бета – это всегда бета. А если хочется стабильности – прийдется немного пошаманить в консоли.
UPD: Прошло совсем не много времени после публикации этой статьи, как четвертую малину все таки научили загружаться с USB без всего этого шаманства. Как – вот так.
Для чего это нужно? Ну если в нее воткнуть обычную флешку, по рупь двадцать за кило, то наверное не нужно – это однозначно не даст прироста, ни по скорости работы, ни по надежности. Наоборот, с обычной флешкой скорость работы упадет в разы. Поэтому сразу принимаем как факт, что втыкать в нее мы будем что-нибудь из SSD семейства. Самолично проверено на SanDisk Extreme PRO USB 3.1(https://market.yandex.ru/product–fleshka-sandisk-extreme-pro-usb-3-1/1721072297), в планах реализовать это же на m2. Правда решения эти далеко не бюджетные и если флешка просто сопоставима по цене с Raspberry, то m2 решения уже превосходят малину по цене в разы. Но мы получаем а) скорость, б) объем, в) выше уровень надежности.
Итак, вся необходимая преамбула вроде бы озвучена, так что – взлетаем. Ах, да, и как обычно – автор не несет ответственности за порчу своего/чужого имущества/падение астероидов/падеж скота и тд и тп.
Необходимо и достаточно:
- Raspberry Pi 4 с блоком питания 5V 3A
- MicroSD Card (16 Gb вполне достаточно, можно и 8, если жалко)
- SSD USB накопитель
- Компьютер (в примерах будет использоваться Mac, под Windows нужно будет подбирать аналоги)
Поехали:
- Запускаем balenaEtcher (если ее еще нет, скачиваем тут – https://www.balena.io/etcher/ версии и под Mac и под Win)
- Скачиваем последнюю версию Raspbian – https://www.raspberrypi.org/downloads/raspbian/ – Raspbian Buster Lite
- Записываем при помощи Balena скаченный образ на MicroSD и на USB накопитель
- На оба (да, это важно) носителя, после окончания записи образа, кладем в папку boot пустой файлик ssh (под MacOS из терминала делаем $ touch /Volumes/boot/ssh)
- Вставляем в Raspberry MicroSD, включаем, ждем пока загрузится и только потом вставляем USB
- Подключаемся к ней по ssh (пользователь pi, пароль raspberry)
- Хотя в дальнейшем эта версия ОС использоваться не будет, лучше все равно поменять пароль на свой. На всякий случай. И вообще хорошая привычка нигде не оставлять паролей по умолчанию, так спится крепче.
- UPD: Как оказалось, если заливать образы по крайней мере родной утилитой, то PARTUUID у них будет разный, поэтому можно переходить сразу к пункту “sudo blkid”
Скачиваем set-ptuuid.zip отсюда – https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=253562 - Проверяем что файл исполняемый и запускаем его
$ sudo set-ptuuid /dev/sda random
(пояснение для чего это: последние версии raspbian записанные с одного образа имеют одинаковый PARTUUID для дисков, а нам нужно что бы они отличались для microSD и для USB. Этот скрипт именно это и делает) - Теперь находим наши диски. Для этого выполняем
$ sudo blkid
Копируем себе куда-нибудь вывод команды, он нам скоро пригодится. Устройство /dev/mmcblk0p1 и /dev/mmcblk0p2 это наша microSD карта, /dev/sda1 и /dev/sda2 – USB накопитель.
pi@raspberrypi:~/script $ sudo blkid
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="5203-DB74" TYPE="vfat" PARTUUID="6c586e13-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="2ab3f8e1-7dc6-43f5-b0db-dd5759d51d4e" TYPE="ext4" PARTUUID="6c586e13-02"
/dev/mmcblk0: PTUUID="6c586e13" PTTYPE="dos"
/dev/sda1: LABEL_FATBOOT="boot" LABEL="boot" UUID="5203-DB74" TYPE="vfat" PARTUUID="9da3e60e-01"
/dev/sda2: LABEL="rootfs" UUID="2ab3f8e1-7dc6-43f5-b0db-dd5759d51d4e" TYPE="ext4" PARTUUID="9da3e60e-02"
- Делаем бекап файла /boot/cmdline.txt
$ sudo cp /boot/cmdline.txt /boot/cmdline.txt.bak
- И открываем оригинал в редакторе
$ sudo nano /boot/cmdline.txt
- Редактируем, заменяя значение PARTUUID= на полученное на прошлых шагах значение PARTUUID для USB устройства
- Перезагружаем наш Raspberry
- Если устройство успешно загрузилось, заходим на него используя снова пароль raspberry, поскольку сейчас мы уже в другой версии ОС, которую еще не настраивали. Если вдруг загрузка не удалась и через 3-5 минут устройство все еще недоступно, то выключаем его, вытаскиваем microSD и на своем компьютере возвращаем оригинальный файл cmdline.txt
- Теперь нам нужно отредактировать файл fstab для того, что бы вернуть использование boot партиции с microSD. Это позволит быть уверенными, что при обновлении системы у нас будет корректно обновляться загрузчик и использоваться будет загрузчик с MicroSD.
$ sudo nano /etc/fstab
proc /proc proc defaults 0 0
PARTUUID=6c586e13-01 /boot vfat defaults 0 2
PARTUUID=9da3e60e-02 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
- Снова перезагружаемся
- Расширяем файловую систему на весь объем флешки. Поскольку raspi-config не умеет работать с флешками, делаем все вручную. Очень внимательно, что бы не запороть файловую систему. Для начала переразметим наш диск
$ sudo fdisk /dev/sda
pi@raspberrypi:~ $ sudo fdisk /dev/sda
Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/sda: 119.3 GiB, 128043712512 bytes, 250085376 sectors
Disk model: Extreme Pro
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9da3e60e
Device Boot Start End Sectors Size Id Type
/dev/sda1 8192 532479 524288 256M c W95 FAT32 (LBA)
/dev/sda2 532480 4390911 3858432 1.9G 83 Linux
Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 has been deleted.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (2048-250085375, default 2048): 532480
Last sector, +/-sectors or +/-size{K,M,G,T,P} (532480-250085375, default 250085375):
Created a new partition 2 of type 'Linux' and of size 119 GiB.
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: n
Command (m for help): w
The partition table has been altered.
Syncing disks.
pi@raspberrypi:~ $
Последовательность букв, которые надо нажать:
p – Показать разделы диска. Отсюда надо запомнить, с какого сектора начинается раздел /dev/sda2 – с 532480 в моем случае
d – Удалить раздел диска
2 – Номер раздела диска, который удаляем
n – Создать новый раздел диска
p – Тип раздела – первичный
2 – Номер раздела, который создаем. На вопрос “First sector” пишем число, которое видели в начале – 532480 в моем случае. Last sector – принимаем значение по умолчанию, то есть до конца диска.
n – Не будем удалять ext4 signature
w – Записать изменения.
- Опять перезагружаем Raspberry
- Проверяем разделы и их размеры
$ df -h
- Теперь осталось сказать, что мы хотим использовать все доступное место на диске
$ sudo resize2fs /dev/sda2
- Снова проверяем разделы и их размеры, что бы убедиться, что расширение прошло успешно
$ df -h
На этом все, загрузчик остался на MicroSD, а вся операционная система работает с USB SSD. Прирост скорости зависит от такого какой SSD и контроллер используются, но чаще всего он становится заметен даже невооружённым глазом.
2 ответа к «Загрузка Raspberry Pi 4 с USB»