Загрузка 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 решения уже превосходят малину по цене в разы. Но мы получаем а) скорость, б) объем, в) выше уровень надежности.

Итак, вся необходимая преамбула вроде бы озвучена, так что – взлетаем. Ах, да, и как обычно – автор не несет ответственности за порчу своего/чужого имущества/падение астероидов/падеж скота и тд и тп.

Необходимо и достаточно:

  1. Raspberry Pi 4 с блоком питания 5V 3A
  2. MicroSD Card (16 Gb вполне достаточно, можно и 8, если жалко)
  3. SSD USB накопитель
  4. Компьютер (в примерах будет использоваться 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»

Добавить комментарий

Ваш адрес email не будет опубликован.