全球第一代
RISC-V星光開發(fā)板
芯片原廠技術(shù)支持!
高性價(jià)比!
極易上手!
數(shù)量有限!
往下看,干貨滿滿~
如何在StarFive 星光板上創(chuàng)建Debian系統(tǒng)鏡像?
轉(zhuǎn)自Linux開發(fā)者Houge的博客,原文鏈接
https://litterhougelangley.life/blog/2022/03/03/
準(zhǔn)備工作:
耐心
一杯咖啡
一塊板子和一條串口調(diào)試線,至少16G的任何品牌的SD card
能熟練操作的一個(gè)Linux發(fā)行版(推薦Archlinux或者Ubuntu)
大致了解如何利用qemu和binfmt創(chuàng)建RISC-V模擬運(yùn)行環(huán)境
大致了解如何創(chuàng)建塊設(shè)備
大致了解如何創(chuàng)建一個(gè)RISC-V交叉編譯環(huán)境
大致了解如何使用簡單的systemd-nspawn容器或者chroot
大致了解StarFive VisionFive的啟動流程
覺得以上準(zhǔn)備好煩,就是想白嫖的朋友只有等我的視頻連載吧~
第一部分:編譯、打包內(nèi)核,創(chuàng)建deb源
創(chuàng)建一個(gè)StarFive VisionFive的RISC-V內(nèi)核尤為重要,截止本文完稿,主線內(nèi)核5.16還沒有對StarFive VisionFive的dts和deconfig提供支持,預(yù)計(jì)5.17能進(jìn)入主線了,所以目前我們需要使用5.17的發(fā)布候選版本,就是RC版本進(jìn)行編譯和構(gòu)建。完整流程如下:
#Debian或者Ubuntu
#Debian安裝依賴:
apt install libncurses-dev libssl-dev bc flex bison gcc-riscv64-linux-gnu build-essential ccache cpio fakeroot flex git kmod libelf-dev libncurses5-dev libssl-dev lz4 qtbase5-dev rsync schedtool wget zstd pahole dwarves -y
#Ubuntu安裝依賴:
apt install libncurses-dev libssl-dev bc flex bison gcc-riscv64-linux-gnu build-essential ccache cpio fakeroot flex git kmod libelf-dev libncurses5-dev libssl-dev lz4 qtbase5-dev rsync schedtool wget zstd dwarves -y
#下載源碼:
#可以從這個(gè)地址下載內(nèi)核,但是不要從releases下載。大家最好下載最新的commits,在這里#我提供一個(gè)下載地址:https://github.com/starfive-tech/linux
mkdir -p linux-build
#創(chuàng)建編譯目錄
cd linux-build
#進(jìn)入目錄
wget https://github.com/starfive-tech/linux/archive/54fad564dc7a117704e99248c3984f907e1867d5.tar.gz
#下載特定commits的內(nèi)核源碼,大家根據(jù)你當(dāng)天最新commits下載。
tar -xpvf 54fad564dc7a117704e99248c3984f907e1867d5.tar.gz
#解壓源碼
mv linux-54fad564dc7a117704e99248c3984f907e1867d5 linux-5.17.0-rc5
#給解壓出來的源碼目錄改一個(gè)簡單的名字
cd linux-5.17.0-rc5
#進(jìn)入該目錄
cp arch/riscv/configs/starfive_jh7100_fedora_defconfig .config
#復(fù)制內(nèi)核配置文件到內(nèi)核源碼根目錄下,并取名為.config
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- menuconfig
#利用交叉編譯工具鏈具體再配置內(nèi)核
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- -jX bindeb-pkg LOCALVERSION=-starfive-xxx
#-jX 有多少線程都可以利用上,最后那里是去個(gè)你喜歡的名字
#等待編譯完成。完成后會在上一層目錄生成4個(gè)deb文件,類似下圖:
這4個(gè)deb文件中,其實(shí)我們只需要3個(gè)就足夠了,一個(gè)是linux-headers,一個(gè)是linux-image。我們現(xiàn)在知道這三個(gè)文件放在你的家目錄的linux-build目錄下。下面我們看看如何用Arch構(gòu)建:
Archlinux或者其他發(fā)行版,可以用類似的方法。
下面談到一些小的技巧,關(guān)于文件系統(tǒng)的:
1. 假設(shè)你使用btrfs文件系統(tǒng),在/mnt/目錄下可以創(chuàng)建一個(gè)子卷,在子卷下編譯,后續(xù)還能打個(gè)快照,做做備份;
2. 假設(shè)你使用zfs文件系統(tǒng),建議使用zvol塊設(shè)備,格式化成ext4文件系統(tǒng),掛載到/mnt/xxx/目錄下,構(gòu)建和打包。原因也同樣是方便備份和做克隆,抑或是快速部署。備份的理由是因?yàn)槲仪扒昂蠛笥眠^三個(gè)版本的Debian Sid/unstable的gcc交叉編譯工具鏈構(gòu)建,第一次成功,過了一周編譯失敗了,因?yàn)間cc更新后引入了一個(gè)bug,需要打補(bǔ)丁,這個(gè)時(shí)候如果我有上一個(gè)版本的備份就直接rollback去構(gòu)建和打包,就不影響后面的操作了。所以,養(yǎng)成備份和克隆的習(xí)慣很重要。下面我們假設(shè)你在Archlinux或者其他的發(fā)行版上已經(jīng)在/mnt/xxx/目錄下有子卷或者塊設(shè)備了,直接開始~
#以下操作默認(rèn)在root權(quán)限進(jìn)行
pacman-Syay#安裝我喜歡的yay
pacman-Sparu#安裝你們喜歡的paru
#以上操作二選一
yay -S debootstrap debian-archive-keyring ubuntu-keyring
#安裝Debian系統(tǒng)一些重要工具,debootstrap可以將各種架構(gòu)的base system安裝到指定目錄,后面的keyring目的是提供密鑰,用于驗(yàn)證deb包是否被篡改。
debootstrap unstable /mnt/xxx https://mirror.sjtu.edu.cn/debian/
#從上海交大Debian鏡像源下載最新的debian sid base system并且安裝到/mnt/xxx目錄
debootstrap impish /mnt/xxx https://mirror.sjtu.edu.cn/ubuntu/
#從上海交大ubuntu鏡像源下載最新的ubuntu 21.10 base system并且安裝到/mnt/xxx目錄
systemd-nspawn -D /mnt/xxx/ -M kernel --bind-ro=/etc/resolv.conf
#利用systemd-nspawn創(chuàng)建名為kernel的debian/ubuntu x86_64 base system容器
#后續(xù)的操作可以參考上面Debian和Ubuntu的操作。完成之后,你需要記住打包好的deb包所在的位置,你可能需要使用root權(quán)限去將這些deb復(fù)制到你方便操作的目錄下等待下一步操作。
完成內(nèi)核編譯打包,不要高興太早。
注意在內(nèi)核源碼目錄下把StarFive VisionFive的dtb文件復(fù)制出來到你記得的目錄。這個(gè)dtb所在的目錄是<內(nèi)核源碼>/arch/riscv/boot/dts/starfive/下。大家一定記住。
下面繼續(xù),針對安裝內(nèi)核deb有兩種操作方法,我更推薦第二種。第一種簡單,但是不清真,就是后續(xù)將編譯打包好的riscv內(nèi)核復(fù)制到將來的系統(tǒng)中,直接安裝,命令是:dpkg -i xxx.deb;第二種方法,我更愿意叫它是Debian/Ubuntu安裝軟件的“原教旨主義”,就是通過架設(shè)我們的私有的RISC-V deb源,這樣的好處是,可以讓你身邊有需求的朋友,完全按照Debian/Ubuntu系的傳統(tǒng),安裝你做好的內(nèi)核,并且能夠維護(hù)這個(gè)內(nèi)核版本,以方便他們后續(xù)更新使用。我們來談架設(shè)Deb源。
選擇合適的服務(wù)器:
如果是公司內(nèi)部,可以選擇在NAS上創(chuàng)建一個(gè)Ubuntu的虛擬機(jī),然后將網(wǎng)絡(luò)映射到你們公司局域網(wǎng)中,讓所有人都能正常訪問;
如果是像我這種,我選擇XX云,建立一個(gè)Ubuntu的VPS作為deb源服務(wù)器。好的,現(xiàn)在假設(shè)VPS或者你的虛擬機(jī)已經(jīng)創(chuàng)建好了。開始在VPS上操作吧。
apt install reprepro --yes
#安裝reprepro,deb發(fā)布器
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc
apt install ntpdate
ntpdate -s time.nist.gov
#以上操作的目的是將VPS或者虛擬機(jī)的時(shí)間同步到標(biāo)準(zhǔn)北京時(shí)間,防止時(shí)間不匹配,無法安裝和更新軟件
gpg --gen-key
#生成你的密鑰,后續(xù)deb包都會用這個(gè)私鑰簽名,其他機(jī)器需要下載你的公鑰,用于驗(yàn)證
上圖就是生成的密鑰,用gpg --list-keys可以顯示出來。注意那一長串字符:706CE3DD…,記下最后8位:33372332,它們有重要作用,別問我怎么知道的,哈哈哈哈~
apt install apache2 -y
#安裝一個(gè)你會操作的web服務(wù)器,我比較習(xí)慣apache
下面去web服務(wù)器目錄下創(chuàng)建目錄:
mkdir -p /var/www/html/ubuntu-impish
cd /var/www/html/ubuntu-impish
mkdir -p conf db dists pool
touch conf/distributions
#distributions描述性文件
touch conf/options
#options描述倉庫的一些選項(xiàng)
#注意ubuntu-impish這個(gè)是名字,大家喜歡什么名字可以隨便一點(diǎn),根據(jù)你們的需要自由處理。
下面來配置distributions:
Origin: ubuntu
Suite: impish
Label: ubuntu
Codename: impish
Architectures: riscv64
Components: main
Description: Apt repository for StarFive VisionFive V1
SignWith:33372332
上面的內(nèi)容我來解釋一下:
Origin如果你是Debian,就寫Debian,如果是Ubuntu,就寫Ubuntu
Suite寫成你的發(fā)行版的代號
Label類似Origin
Codename就是發(fā)行版代號
Components這個(gè)是組件,因?yàn)槲覀冎皇菨M足小范圍的朋友使用,main就夠了,如果是嚴(yán)格的維護(hù),最好詳細(xì)分類
描述部分大家自由發(fā)揮
SignWith這里是簽名,還記得你的那8位密鑰嗎?
下面導(dǎo)出我們的公鑰到源目錄:
gpg --export --armor 33372332 > /var/www/html/ubuntu-impish/gpg-public.key
#再次強(qiáng)調(diào)那個(gè)8位密鑰
上圖就是創(chuàng)建后的大致樣子。
下面就可以來發(fā)布或者撤銷你創(chuàng)建好的內(nèi)核deb包了:
reprepro -b /var/www/html/ubuntu-impish -C main includedeb impish/<你之前編譯并打包好的deb目錄>/*.deb
#這是發(fā)布你的deb包,這時(shí)候會彈出一個(gè)TUI,你在里面輸入密碼(gpg創(chuàng)建密鑰對時(shí)輸入的密碼)
reprepro -b /var/www/html/ubuntu-impish -C main remove impish
#從倉庫移除或者撤銷deb包
如果一切順利,你的私有deb倉庫就創(chuàng)建好了。好好維護(hù)吧~
第一部分小節(jié):
? 內(nèi)核編譯打包推薦交叉編譯,速度快;
? 記得dtb要復(fù)制出來,方便最后處理;
? 構(gòu)建出來的deb包強(qiáng)烈推薦使用傳統(tǒng)的架設(shè)源服務(wù)器管理
第二部分:創(chuàng)建塊設(shè)備、分區(qū),創(chuàng)建RISC-V的Debian base system
現(xiàn)在無論任何一個(gè)發(fā)行版,安裝zfs的樹外內(nèi)核模塊都非常方便了,下面以我自己的習(xí)慣來創(chuàng)建塊設(shè)備。如果各位不會使用zfs文件系統(tǒng),也沒關(guān)系,利用losetup創(chuàng)建.img文件,作為塊設(shè)備也是一樣的。雖然zfs更加“科學(xué)”,笑死笑死~
#以下內(nèi)容均在root權(quán)限下操作:
zfs create -V 10G root/Container/starfive-lxde
#在root/Container/池下,創(chuàng)建一個(gè)名字叫做starfive-lxde塊設(shè)備,大小是10G(10G對于Debian/Ubuntu都夠了,但是對于Gentoo是不夠的,Gentoo需要120G)
cfdisk -z /dev/zvol/root/Container/starfive-lxde
#對該塊設(shè)備進(jìn)行分區(qū),分區(qū)的樣子類似下圖:
格式化上面的三個(gè)分區(qū):
注意第一個(gè)分區(qū)是空分區(qū);
第二個(gè)分區(qū),格式化成vfat,不用取label名字;
第三個(gè)分區(qū),格式化成ext4,label取名字叫做:_/boot;
第四個(gè)分區(qū),格式化成ext4,label取名字叫做:_/;
在/mnt目錄下創(chuàng)建一個(gè)目錄,我這里就叫做:Starfive,即/mnt/Starfive
開始一系列操作來掛載塊設(shè)備到目錄到/mnt/Starfive;
mount -t ext4 /dev/zvol/root/Container/starfive-lxde-part4 /mnt/Starfive
mkdir -p /mnt/Starfive/boot
mount -t ext4 /dev/zvol/root/Container/starfive-lxde-part3 /mnt/Starfive/boot
mkdir -p /mnt/Starfive/boot/efi
mount-tvfat/dev/zvol/root/Container/starfive-lxde-part2/mnt/Starfive/boot/efi
掛載完成后,可以運(yùn)行l(wèi)sblk查看下,結(jié)構(gòu)類似下圖:
利用debootstrap安裝RISC-V的Debian base system到/mnt/Starfive下:
debootstrap –arch=riscv64 –keyring /usr/share/keyrings/Debian-ports-archive-keyring.gpg –include=Debian-ports-archive-keyring unstable /mnt/Starfive https://deb.debian.org/Debian-ports/
解釋一下:
–arch=riscv64這里強(qiáng)調(diào)了架構(gòu),是riscv64的;
–keyring這里需要大家去單獨(dú)下載一個(gè)deb包,我已經(jīng)不記得debian和ubuntu的源里是否包含,不包含可以下載這個(gè)包,下載后解壓deb提取debian-ports-archive-keyring.gpg這個(gè)文件放到我上面這個(gè)目錄下;
–include在base system保重,添加特定的包,debian-ports-archive-keyring包是密鑰包,添加一下避免后續(xù)萬一缺少密鑰什么麻煩
目前RISC-V架構(gòu)并不在穩(wěn)定版本Debian的支持中,比方說現(xiàn)在的Debian穩(wěn)定版是Debian 11,它是不支持RISC-V的,所以我們只能用不穩(wěn)定版本Sid/Unstable,如果你在某些網(wǎng)站看到RISC-V是穩(wěn)定分支,那是宣傳,并不是真實(shí)情況。
/mnt/Starfive是目錄,現(xiàn)在已經(jīng)掛載好塊設(shè)備了
https://deb.debian.org/debian-ports/是下載deb包的地址(這是官方源,建議不要用鏡像,偶爾因?yàn)橥絾栴},會出現(xiàn)文件校驗(yàn)不匹配)
根據(jù)各位的網(wǎng)速,完成base system的部署。
第二部分小節(jié):
用你們習(xí)慣的方法創(chuàng)建塊設(shè)備;
習(xí)慣去備份,避免重復(fù)勞動,節(jié)約時(shí)間;
掌握debootstrap的命令,可以看看help的輸出,多嘗試總不會有錯(cuò)。
第三部分:完善基礎(chǔ)系統(tǒng),準(zhǔn)備/boot目錄必要文件,為開發(fā)板最后啟動做準(zhǔn)備Debian/Ubuntu創(chuàng)建RISC-V模擬環(huán)境
#以下內(nèi)容均在root權(quán)限下完成
apt install qemu-user-static binfmt-support -y
#安裝qemubinfmt創(chuàng)建模擬環(huán)境
Archlinux或者其它發(fā)行版創(chuàng)建RISC-V模擬環(huán)境
大家參考這段Archlinuxwiki就可以了,我就不班門弄斧了。
隨后我們就可以直接用systemd-nspawn進(jìn)入容器開始后續(xù)的操作。
#以下內(nèi)容均在root權(quán)限下完成
systemd-nspawn -D /mnt/Starfive -M starfive --bind-ro=/etc/resolv.conf
#啟動名字為starfive,根目錄在/mnt/Starfive的Debian RISC-V容器。
apt update; apt dist-upgrade -y
#更新系統(tǒng)
apt install curl gnupg2 gnupg vim nano initramfs-tools -y
#安裝必要的工具,編輯器,為后續(xù)生成initramfs鏡像做準(zhǔn)備。
curl -s http://<內(nèi)核私有源的地址>/xxx/gpg-public.key | apt-key add -
#添加內(nèi)核私有源的公鑰到apt-key中,我記得ubuntu和debian這里略有不同,大家根據(jù)不同發(fā)行版再搜索下方法。
deb http://<內(nèi)核私有源的地址>/xxx unstable main
#添加私有源的地址到/etc/apt/sources.list中
apt update; apt install <你私有源中內(nèi)核的名字,切記linux-headers linux-image都安裝>
#刷源,安裝私有源內(nèi)核
這個(gè)時(shí)候你的/boot目錄下應(yīng)該是這樣的:
大家可以從這里下載最早創(chuàng)建的Fedora鏡像中的啟動必要的文件,你可能會問,為什么Debian/Ubuntu下不能根據(jù)自己的發(fā)行版創(chuàng)建?其實(shí)原因是開發(fā)板的uboot讀取的配置文件和目前.efi文件所決定的,我們按部就班就可以了。
下面我們就需要將Fedora原始鏡像中文件復(fù)制到Debian/Ubuntu的/boot目錄下,做適當(dāng)修改就可以了。
將boot文件夾(從上面下載的壓縮包解壓出來以后,你會看到)復(fù)制到Debian/Ubuntuboot目錄下。
那么目前Debian/Ubuntu的/boot目錄下就還有一個(gè)boot文件夾,里面有一個(gè)叫做uEnv.txt的文件,大家可以用常用的編輯器打開,將Fedora修改成Debian。類似下面兩張圖所示:
完成后我們來復(fù)制EFI文件夾(壓縮包里可以見到),將這個(gè)EFI文件夾完整復(fù)制到Debian/Ubuntu的/boot/efi/目錄下,你可將EFI文件夾里的fedora刪掉,當(dāng)然保留也可以,作為一個(gè)備份。
將編譯內(nèi)核那個(gè)部分生成的dtb復(fù)制到你的Debian/Ubuntu的/boot/目錄下。
將壓縮包中的extlinux目錄還有g(shù)rub.cfg也復(fù)制到Debian/Ubuntu的/boot目錄下,用編輯器對extlinux里面的配置文件和grub.cfg進(jìn)行修改,修改的內(nèi)容包括kernel對應(yīng)的vmlinuz文件名,fdt對應(yīng)的dtb文件,initd對應(yīng)的initramfs鏡像,UUID值,你可以重新打開一個(gè)終端sudo lsblk查看根目錄的UUID,復(fù)制后、粘貼過去。最后樣子大概是這樣的:
最后別忘了ls-l看看/boot目錄,再tree檢查一下(沒有tree就apt安裝一下)。
感覺大功告成了,別忘了最后的收尾:
passwd root
#為root創(chuàng)建一個(gè)密碼
sync
#同步文件系統(tǒng),寫入緩存
exit
#退出容器
umount /dev/zvol/root/Container/starfive-lxde-*
#卸載掛載的塊設(shè)備
dd if=/dev/zvol/root/Container/starfive-lxde of=/dev/<你的sdcard> status=progress bs=1M
#將做好的塊設(shè)備燒到你的sdcard上,這里注意確定你的塊設(shè)備,別寫錯(cuò)了
第三部分小結(jié):
根據(jù)你做的鏡像發(fā)行版不同,Debian和Ubuntu導(dǎo)入你內(nèi)核私有源的公鑰會略有不同,根據(jù)遇到的情況查閱Google
按部就班,多檢查細(xì)節(jié)
-
RISC
+關(guān)注
關(guān)注
6文章
462瀏覽量
83707
發(fā)布評論請先 登錄
相關(guān)推薦
評論