樹莓派4可以不用SD卡啟動?
1.說明
2.什么是PXE啟動
3.樹莓派4設置PXE啟動
4.關鍵配置參數說明
5.配置TFTP服務器
6.網絡文件系統
6.1 主機上設置NFS文件系統
6.2 樹莓派上設置啟動NFS的rootfs腳本
1.說明
Raspberry Pi 4具有一個SPI連接的EEPROM(4MBits / 512KB),其中包含用於啟動系統的代碼,並替換了先前在SD卡的啟動分區中找到的bootcode.bin。請注意,如果Pi 4的SD卡的啟動分區中存在bootcode.bin,則將其忽略。
也就是說,樹莓派4的啟動方式可以從SPI的EEPROM啟動了。關於為什么需要這個EEPROM官方的說法是:
1.與以前的Raspberry Pi型號相比,Raspberry Pi 4的啟動過程和SDRAM的設置要復雜得多,因此,永久包含在SoC ROM中的代碼固有的風險更大。
2.USB已移至PCIe總線,千兆位以太網驅動程序與以前的型號完全不同,因此,再次將其永久固定在SoC的ROM中是不可行的。
3.小容量SPI EEPROM允許在現場修復錯誤並在啟動后添加功能。
4.本地可修改狀態意味着Raspberry Pi 4上的網絡或USB大容量存儲啟動不需要OTP引導模式設置。Pi4上沒有用戶可修改的OTP引導模式位。
本文就講述一下如何設置樹莓派啟動,而改為網絡啟動的方式(TFTP),目前樹莓派U盤啟動方式還不完善。雖然不用SD卡啟動,但是操作EEPROM的時候,還是要借助SD卡進行啟動Linux,然后將啟動固件寫入到eeprom中。下面來詳細說明一下這個過程。
2.什么是PXE啟動
PXE是用來通過網絡引導系統的。也就是系統通過網絡進行啟動,這樣就不用硬盤,從服務器中獲取系統鏡像。
當安裝大量設備系統的時候,如果有了PXE啟動,那么就可以大大加快系統的安裝的速度。
上面就是基本的一個PXE啟動的流程。
3.樹莓派4設置PXE啟動
樹莓派4上有EEPROM,可以將啟動固件放到EEPROM中。但是不幸的是,操作樹莓派自帶的EEPROM需要樹莓派的系統,也就是必須最開始的時候,需要制作啟動樹莓派4的SD卡鏡像,然后通過SD卡啟動Linux后,修改EEPROM中的內容。
關於如何制作樹莓派SD卡鏡像,可以參考我下面的文章:
三個前提條件:
1.登錄控制台(用戶名:pi,密碼:raspberry)
2.樹莓派要能夠連接網絡
3.可以安裝配置rpi-config程序
3.1 安裝rpi-eeprom
rpi-eeprom是在樹莓派固件中操作樹莓派4的eeprom的程序,通過下面的命令進行安裝。
sudo apt-get update
sudo apt-get full-upgrade
sudo apt-get install rpi-eeprom
以上操作如果下載比較慢可以更換國內的源進行:
修改sources.list
文件
sudo vim /etc/apt/sources.list
用#注釋掉之前的源,然后新增
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
接着修改raspi.list
sudo vim /etc/apt/sources.list.d/raspi.list
同樣注釋掉之前的源
修改如下:
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
修改完成就OK了。
安裝完成,檢測一下eeprom現有的配置。
vcgencmd bootloader_config
可以見到如下信息
以上的信息是我以及配置好了的,最開始的信息可能不是這個。但是沒關系,接下來教你設置。
第一步:提取配置文件
cp /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-01-17.bin pieeprom.bin
rpi-eeprom-config pieeprom.bin > bootconf.txt
將配置文件進行拷貝,並且放到指定的目錄。pieeprom.bin
就是配置文件,然后導出成txt文件。該文件的作用與之前樹莓派SD卡中的config.txt類似。
第二步:設置bootconf.txt
中的內容
我配置的內容如下:
[all]
BOOT_UART=1
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
DHCP_TIMEOUT=45000
DHCP_REQ_TIMEOUT=4000
TFTP_FILE_TIMEOUT=30000
TFTP_IP=192.168.12.194
TFTP_PREFIX=1
BOOT_ORDER=0x21
SD_BOOT_MAX_RETRIES=3
NET_BOOT_MAX_RETRIES=5
TFTP_PREFIX_STR=raspi4/
[none]
FREEZE_VERSION=0
后面會解釋一下其中的內容。
第三步:將配置寫回pieeprom.bin
文件中
rpi-eeprom-config --out pieeprom-new.bin --config bootconf.txt pieeprom.bin
這一步用於將配置文件寫回。
第四步:將pieeprom.bin燒錄到eeprom中
sudo rpi-eeprom-update -d -f ./pieeprom-new.bin
看到如下輸出信息即可
此時將SD卡取出,就可以看到系統從eeprom起來。
4.關鍵配置參數說明
BOOT_UART【關注】
如果設置為1,表示使能GPIO 14和 15的輸出,也就是我們可以連接串口打開信息。其串口參數為波特率115200,8位,無奇偶校驗位,1位的停止位。
對於有串口調試助手的,建議用硬件串口輸出信息,所以該位設置為1。
WAKE_ON_GPIO
如果為1,則“ sudo halt”將以低功耗模式運行,直到GPIO3或GLOBAL_EN短路接地。
TFTP_PREFIX【關注】
為了支持每個Pi的唯一TFTP引導目錄,引導加載程序會在文件名前面加上設備特定的目錄。如果在前綴目錄中都找不到start4.elf和start.elf,則清除前綴。在較早的型號上,序列號用作前綴,但是,在Pi4上,不再從序列號生成MAC地址,這使得很難通過檢查DHCPDISCOVER數據包在服務器上自動創建tftpboot目錄。為此,可以將TFTP_PREFIX定制為MAC地址,固定值或序列號(默認)。
0 - Use the serial number e.g. "9ffefdef/"
1 - Use the string specified by TFTP_PREFIX_STR
2 - Use the MAC address e.g. "DC-A6-32-01-36-C2/" Default: 0
這里我設置成1,讓后設置TFTP_PREFIX_STR
路徑。
TFTP_PREFIX_STR【關注】
當TFTP_PREFIX設置為1的時候,可以設置TFTP_PREFIX_STR的路徑。例如
TFTP_PREFIX_STR=raspi4/
這是為了告訴樹莓派4,到哪個目錄下去找啟動文件。由於可能有不同的樹莓派固件,所以這里會不同。
TFTP_IP
設置TFTP服務器的IP地址,樹莓派的IP地址是通過DHCP自動獲取的。
TFTP_IP=192.168.12.194
BOOT_ORDER
該參數配置了不同的啟動模式
- 0x0 - NONE (stop with error pattern)
- 0x1 - SD CARD
- 0x2 - NETWORK
啟動模式是一個32bit的通過特定的位來決定的。如果設置0x21,表示網絡啟動失敗時通過SD卡進行啟動。
如果設置成0x2則表示網絡啟動失敗,不通過SD卡啟動。這里我們設置成0x21。
5.配置TFTP服務器
如果不用SD卡,讓樹莓派4啟動,那么啟動固件必須放在TFTP服務的特定的目錄中。
這里我在Ubuntu上搭建了一個TFTP服務器。
第一步:安裝tftpd-hpa
sudo apt-get install tftp-hpa tftpd-hpa
第二步:編輯腳本文件
sudo gedit /etc/default/tftpd-hpa
腳本內容如下:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/bigmagic/tftpboot/" //tftpboot絕對路徑
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
第三步:啟動服務器
service tftpd-hpa restart
之后還需要做的事情就是
sudo chmod 777 /home/bigmagic/tftpboot/ -R
讓目錄權限變成可以訪問權限。
在/home/bigmagic/tftpboot/
創建目錄,用於存放SD卡上的啟動文件
mkdir raspi4
最后將SD卡中的文件放到樹莓派4中。
6.網絡文件系統
操作系統起來后,如果要掛在SD卡或者網絡文件系統,肯定是需要指定網絡文件系統的。之前在SD卡上制作啟動文件的時候,我們是將跟文件系統放在SD卡上所以通過PXE啟動后的效果如下:
找不到SD卡,通過網絡方式啟動
從網絡中讀取相關的文件。
可以看到檢測不到sd卡上的文件系統。接着我們需要通過網絡啟動文件系統。
6.1 主機上設置NFS文件系統
因為我們的文件系統是在NFS上,所以主機上設置NFS文件系統是讓樹莓派訪問文件系統。
其實前面的TFTP是引導系統,而這個NFS則是為了讓rootfs從NFS上啟動。
sudo apt install nfs-kernel-server
接着編輯nfs的相關配置
echo "/home/bigmagic/nfs/client1 *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
設置權限
chmod 777 nfs/ -R
然后啟動服務
sudo service nfs-kernel-server restart
6.2 樹莓派上設置啟動NFS的rootfs腳本
由於現在樹莓派4上沒有了SD卡,啟動腳本在/home/bigmagic/tftpboot/raspi4
中。所以去修改cmdline.txt
文件。
修改文件內容如下:
console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.12.194:/nfs/client1,vers=4.1,proto=tcp rw ip=dhcp rootwait elevator=deadline
啟動ip地址自行修改。
接着執行
接下來要做的事情就是將我們的跟文件系統拷貝到/home/bigmagic/nfs/client1
目錄下。
此目錄可以從我們之前制作的SD卡的rootfs文件系統中進行拷貝。
操作完成后輸入
echo "192.168.12.194:/tftpboot /boot nfs defaults,vers=4.1,proto=tcp 0 0" | sudo tee -a /home/bigmagic/nfs/client1/etc/fstab
以上操作后便可啟動網絡文件系統了。
7.總結
上述介紹了樹莓派4不用SD卡啟動系統的辦法,對於樹莓派4來說,可以通過內置的EEPROM進行啟動固件的存放。通過這種方式,可以為內核調試增加了許多方便的地方。這種對於做開發樹莓派的人來說,可以專注於程序的開發,不用為頻繁的插拔卡帶來煩惱。同時這種方式對鏡像升級也提供了很多便利。