Raspberry pi 4 загрузка по сети (без карты памяти)
Не секрет, что карты памяти долго не живут при использовании на Raspberry pi (без оптимизаций операционной системы, уменьшающих запись на карту памяти до 0). Подумав, как увеличить срок службы карты памяти, пришел к выводу, что лучше вообще без неё, а раз без неё, то либо загрузка с жесткого диска либо сетевая загрузка.
Поиск решений привел на сайт https://www.stephenwagner.com/2020/04/12/nfs-root-raspberry-pi-4/ и там загрузка по сети выполнялась с помощью карты памяти, на которой был загрузчик. На последних прошивках Raspberry pi 4 может загружаться по сети самостоятельно, но для этого нужно обновить загрузчик до последней версии. Обновляем загрузчик через утилиту raspi-config:
sudo raspi-config
Далее в утилите выбираем “advanced options”-“bootloader version”-“latest” и после этого “advanced options”-“boot order”-“network boot” затем нажимем “finish” и программка попросит нас перезагрузиться – отвечаем положительно и перезагружаемся. Теперь при загрузке сначала опрашивается карта памяти, а при её отсутствии происходит поиск tftp сервера и попытка загрузиться с него.
С tftp сервера наша raspberry pi берет загрузчик, а сам корневой раздел будем получать через NFS.
Рассказ про настройку tftp сервера не входит в мои планы, поэтому пропускаю. От себя добавлю, что у меня tftp крутится под линуксом, поэтому работспособность инструкции для варианта с tftp сервером на windows не могу гарантировать.
В папку, расшаренную по NFS (пусть для нашего случая это NFS-SERVER-IP:/nfs-export/PI-Raspbian) копируем содержимое корневого раздела с карты памяти на которой установлен Raspbian (обычно это второй раздел на карте памяти), а содержимое загрузочного раздела этой карты памяти копируем в папку NFS-SERVER-IP:/nfs-export/PI-Raspbian/boot .
Осуществить это возможно таким путем:
Монтируем нашу карту памяти в папку /mnt/old :
mount /dev/sdb2 /mnt/old/
,
где /dev/sdb2 – раздел карты памяти с raspbian
монтируем папку в которой будет корневой раздел на NFS в папку /mnt/nfs:
mount NFS-SERVER-IP:/nfs-export/PI-Raspbian /mnt/nfs
,
где NFS-SERVER-IP – ip адрес сервера NFS.
Далее используем rsync для переноса инсталяции raspbian на NFS сервер:
rsync -avxHAXS --numeric-ids --info=progress2 --progress /mnt/old/ /mnt/nfs/
таким же образом копируем содержимое раздела загрузчика в папку NFS-SERVER-IP:/nfs-export/PI-Raspbian/boot/.
Открываем для редактирования файл NFS-SERVER-IP:/nfs-export/PI-Raspbian/etc/fstab и в нем нужно создать примерно такое:
proc /proc proc defaults 0 0
NFS-SERVER-IP:/nfs-export/PI-Raspbian / nfs defaults 0 0
И сохраням его.
Теперь открываем для редактирования файл NFS-SERVER-IP:/nfs-export/PI-Raspbian/boot/cmdline.txt – его содержимое выглядит примерно так:
console=serial0,115200 console=tty1 root=PARTUUID=97709164-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
Изменям его, не забывая подставить свои IPADDRESS и паку:
console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=IPADDRESS:/nfs-export/PI-Raspbian,tcp rw vers=3 ip=dhcp rootfstype=nfs elevator=deadline rootwait
Далее в корневом разделе tftp сервера нужно создать папку с названием идентичным серийному номеру процессора нашего raspberry pi. Узнать серийный номер процессора можно введя команду cat /proc/cpuinfo
и в строке Serial будет 16ти значное число – наш серийный номер это последние 8 цифр. В эту папку копируем содержимое папки NFS-SERVER-IP:/nfs-export/PI-Raspbian/boot.
Для загрузки по сети извлекаем карту памяти из нашего raspberry pi и наблюдаем за процессом.
Теперь нет нужды беспокоиться о карте памяти – всё работает без неё.
Данным методом можно организовать загрузку нескольких raspberry pi по сети и у каждой будут свои настройки, программы и т.д и т.п.