實踐:一步一步安裝 ArchLinux,并編譯、安裝【RT-Preempt】實時內核
目錄
制作U盤啟動系統(tǒng)
從 U盤啟動,安裝 ArchLinux
1. U盤啟動
2. 硬盤分區(qū)
3. 網絡配置
4. 更換軟件管理套件的鏡像地址
5. 掛載文件系統(tǒng),進行安裝
6. 系統(tǒng)配置
7. 安裝 grub bootloader
安裝軟件包管理軟件Pacaur
通過源碼來安裝
通過Yaourt來安裝
更換實時內核(RT-Preempt)
1. 下載Linux內核和Preempt補丁文件
2. 配置實時策略Fully Preemptible Kernel (Real-Time)
3. 編譯和安裝內核
4. 制作和安裝RAM Disk
5. 復制System.map文件
6. 更新GRUB配置文件
不知不覺使用Ubuntu系統(tǒng)已經好多年了,在Linux所有發(fā)行版中,使用最多的估計仍舊是Ubuntu,主要的原因就是穩(wěn)定,使用的人多,遇到問題了也很容易找到解決方案。
最近看到一句話:入門ubuntu,不滿足manjaro,得心應手之后arch,還想折騰就上gentoo。
看來我仍然在入門的一畝三分地里折騰著,正好家里有一臺淘汰下來的臺式機,正好可以用來折騰一下。
調研了一番之后,決定安裝ArchLinux,這篇文章就記錄一下安裝過程,遇到的一些坑,以及在更換帶有 RT-Preempt 補丁的內核時,遇到的幾個內核配置問題。
manjaro 是 ArchLinux 的一個發(fā)行版,使用的人也不少;
如果想對 Linux 的搭建有更底層的掌握,可以花 1-2 周的時間,按照 LFS 的操作步驟走一遍。
本文主要參考:https://itsfoss.com/install-arch-linux/。
官方給出的電腦硬件要求是:

制作U盤啟動系統(tǒng)
下載 ISO 文件
ArchLinux官網上(https://archlinux.org/download/)給出了很多的鏡像下載鏈接,可以從163網站(http://mirrors.163.com/archlinux/iso/)下載。
選擇一個版本:archlinux-2022.05.01-x86_64.iso。
下一步就是把鏡像文件制作成U盤啟動系統(tǒng),在Windows和Linux上都可以。
在Windows上可以使用rufus軟件來制作啟動U盤啟動系統(tǒng)(我選擇的也是這個方式)。
如果在Linux系統(tǒng)上,可以使用dd命令來制作:
sudo dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress && sync
從 U盤啟動,安裝 ArchLinux
1. U盤啟動
把U盤插入電腦,重啟之后選擇從U盤啟動(根據自己電腦的設置,在啟動時按下F2、F7或其它按鍵)。

這個圖片是參考文檔中的,根據系統(tǒng)的不同,選項的內容也可能稍有區(qū)別。
在我的系統(tǒng)中,選擇 Arch Linux install medium (x86_64, UEFI)選項進入 live U盤中的系統(tǒng)。
這一步其實就相當于是安裝Ubuntu系統(tǒng)中時的Try Ubuntu。
一切順利的話,系統(tǒng)加載運行之后,進入命令行界面,下面就開始一步一步安裝ArchLinux操作系統(tǒng)了。
首先,通過查看文件efivars來確認系統(tǒng)是否支持 EFI。
執(zhí)行命令:ls /sys/firmware/efi/efivars,如果能看到一大堆的輸出信息,就說明支持。
關于 EFI 系統(tǒng)以及系統(tǒng)引導流程(主要是與 MBR 那一套的區(qū)別),可以去搜索一些資料。
2. 硬盤分區(qū)
使用fdisk -l來確定一下硬盤設備名稱,例如:/dev/sda。
也可以使用其它的分區(qū)工具,例如:gdisk,cgdisk,sgdisk。
在硬盤上,很可能已經存在了分區(qū)表,因為之前可能在這個硬盤上安裝過操作系統(tǒng)啊。
建議先把這些分區(qū)表全部刪除掉,然后重新進行分區(qū)。
分區(qū)操作通過指令:fdisk /dev/sda來操作。
如今大部分系統(tǒng)支持的都是UEFI系統(tǒng),因此需要創(chuàng)建一個EFI分區(qū),建議分 512 MB。

創(chuàng)建這個分區(qū)之后,需要把分區(qū)類型修改為EFI類型。
具體操作是:輸入指令 t,再輸入 EFI前面對應的序號。
參考文檔中的序號是:

但是,如果選擇的系統(tǒng)版本不同,這里的序號可能是不一樣的。在我選擇的系統(tǒng)中,EFI類型的編號是數字 1。
EFI分區(qū)創(chuàng)建好之后,再創(chuàng)建一個根分區(qū)就可以了,與安裝其它的發(fā)行版一樣。
最終創(chuàng)建的兩個分區(qū)名稱是:
EFI 分區(qū):/dev/sda1
根分區(qū):/dev/sda2
硬盤分區(qū)的最后操作就是格式化這兩個分區(qū):
mkfs.fat -F32 /dev/sda1
mkfs.ext4 /dev/sda2
3. 網絡配置
為了在后面的步驟中順利的在線安裝,官方文檔中對WiFi進行了設置。
由于我的電腦使用的RJ45有線連接,所以就沒有進行這一步的操作。
4. 更換軟件管理套件的鏡像地址
我們在安裝Ubuntu操作系統(tǒng)之后的第一步,一般都是更改apt的軟件源,設置為國內比較知名的軟件源。
ArchLinux中默認的官方軟件管理套件是pacman(還有其它的管理套件,下面會討論到),為了加快下載速度,也需要根據我們所處的地理位置修改為比較快的軟件源。
依次執(zhí)行如下命令:
同步倉庫:pacman -Syy;
獲取所有的倉庫列表:pacman -S reflector;
備份一下原始文件:cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak;
選擇合適的倉庫:reflector -c "ZH" -f 12 -l 10 -n 12 --save /etc/pacman.d/mirrorlist;
5. 掛載文件系統(tǒng),進行安裝
此刻執(zhí)行的是位于U盤中的系統(tǒng),現(xiàn)在需要做的是把操作系統(tǒng)安裝在剛才創(chuàng)建的分區(qū) /dev/sda2上。
首先把分區(qū)掛載一下: mount /dev/sda2 /mnt。
掛載之后,就可以使用pacstrap腳本來安裝ArchLinux以及一些軟件包了:
pacstrap /mnt base linux linux-firmware vim
安裝過程需要的時間,根據電腦性能和網絡情況而定,總之還是比較快的。如果在安裝過程中因為網絡等原因中斷了,再次執(zhí)行即可。
6. 系統(tǒng)配置
系統(tǒng)配置包括:文件系統(tǒng)掛載文件fstab,設置系統(tǒng)時區(qū),設置密碼等等,一步一步來操作。
首先創(chuàng)建fstab文件:genfstab -U /mnt >> /mnt/etc/fstab。
然后把根文件系統(tǒng)切換到分區(qū)/dev/sda2對應的掛載點/mnt,因為現(xiàn)在要配置的是剛才被安裝的根文件系統(tǒng),所以需要切換進去。
切換命令是:arch-chroot /mnt。
執(zhí)行命令:timedatectl list-timezones 列出支持的所有時區(qū)。
然后執(zhí)行命令 timedatectl set-timezone Asia/Shanghai把時區(qū)設置為自己的實際位置。
最后,進行語系設置。使用vim命令打開文件 /etc/locale.gen,打開下面2個選項:
en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
然后執(zhí)行命令:locale-gen。
創(chuàng)建文件:/etc/locale.conf, 添加如下內容:
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
創(chuàng)建文件:/etc/hostname,添加如下內容:
myarch
創(chuàng)建文件:/etc/hosts,添加如下內容:
127.0.0.1 localhost
::1 localhost
127.0.1.1 myarch
最后,通過指令 passwd來設置root密碼。
7. 安裝 grub bootloader
這一步比較關鍵,確保當前的根目錄是處于/dev/sda2中(也就是上一步chroot所做的動作)。
首先,安裝需要的軟件:pacman -S grub efibootmgr。
在之前的分區(qū)表中,/dev/sda1的分區(qū)類型已經被設置為EFI System,并且被格式化成FAT32文件格式。
現(xiàn)在,需要把grub引導程序安裝到這個分區(qū)上,所以首先需要把這個分區(qū)掛載一下。
創(chuàng)建掛載點目錄:mkdir /boot/efi,然后執(zhí)行掛載命令:mount /dev/sda1 /boot/efi。
安裝grub引導程序也是通過軟件來執(zhí)行的,命令如下:
grub-install --target=x86_64-efi --bootloader-id=GRUB --efi-directory=/boot/efi
安裝成功之后,執(zhí)行如下命令來更新grub的配置文件:
grub-mkconfig -o /boot/grub/grub.cfg
進行到這一步的時候,ArchLinux就安裝完成了。
在參考文檔中還執(zhí)行了其他的一些操作,比如:添加用戶,安裝桌面系統(tǒng),這些都根據個人的實際需要來操作。
因為我不需要桌面,所以在這里重啟系統(tǒng)就完事了。
注意:在重啟之前先退出chroot:
exit
reboot
【本文作者】公-眾-號:“Linux茶館”,是我在工作之余個人維護的分享平臺,十多年的嵌入式開發(fā)老兵,專注于嵌入式 + Linux 領域,玩過單片機、搞過智能家居、研究過 PLC 和 工業(yè)機器人。厚積薄發(fā)、換位思考,以讀者的角度來總結文章。每一篇輸出,不僅僅是干貨的呈現(xiàn),更是引導你一步一步的深入思考,從底層邏輯來提升自己。
安裝軟件包管理軟件Pacaur
ArchLinux中默認的軟件管理套件是pacman,可以在官網中看到所有的軟件列表 https://archlinux.org/packages/。
另外,還有一個軟件管理套件也比較流行:Pacaur,Archlinux自帶的 pacman不能直接安裝Pacaur。
有兩種方式來進行安裝:通過源碼安裝和通過其它工具(Yaourt)來安裝。
在通過源碼安裝這個管理套件的時候,我遇到了一些麻煩。雖然沒有成功,還是記錄于此,以后有機會再試一下。
通過源碼來安裝
1. 安裝必要的軟件
pacman -S binutils make gcc fakeroot expac yajl git --noconfirm
2. 安裝Cower:用于從AUR獲取信息并下載軟件包
curl -o PKGBUILD https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=cower
makepkg PKGBUILD --skippgpcheck
pacman -U cower*.tar.xz --noconfirm
3. 安裝Pacaur
curl -o PKGBUILD https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=pacaur
makepkg PKGBUILD
pacman -U pacaur*.tar.xz --noconfirm
通過Yaourt來安裝
1. 安裝Yaoourt
sudo pacman -S --needed base-devel git wget yajl
cd /tmp
git clone https://aur.archlinux.org/package-query.git
cd package-query/
makepkg -si && cd /tmp/
git clone https://aur.archlinux.org/yaourt.git
cd yaourt/
makepkg -si
2. 通過Yaourt來安裝Pacaur
yaourt -S --noconfirm pacaur
更換實時內核(RT-Preempt)
現(xiàn)在的Linux內核一般都是面向桌面系統(tǒng)的,在一些工控場景中需要打上軟實時內核補丁RT-Preempt,并且選擇Fully Preemptible Kernel (Real-Time)這個實施策略。
如果您不需要實時內核,僅僅想把內核升級成新的版本,那么可以直接通過 pacman,在線安裝、更新 Linux 內核。
在編譯、更換實時內核的時候,我也遇到了幾個問題下面一一記錄于此,主要參考文檔:https://wiki.archlinux.org/title/Kernel/Traditional_compilation。
在編譯內核之前,需要安裝幾個必要的軟件:
pacman -S cpio pahole pacman-contrib asp
1. 下載Linux內核和Preempt補丁文件
Linux 內核選擇版本linux-5.15.36.tar.gz ,下載地址:https://www.kernel.org/。
RT-Preempt 補丁選擇與內核對應的版本:patch-5.15.36-rt41.patch.gz,下載地址:https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.15/older/。
或者也可以直接下載已經打好補丁的內核版本:linux-stable-rt-5.15.36-rt41.tar.gz。
創(chuàng)建工作目錄:mkdir ~/kernelbuild,把下載好的內核和補丁放在其中,并且各自解壓出來。
cd 進入~/kernelbuild/linux-5.15.36目錄,執(zhí)行如下命令打上實時補丁:
patch -p1 < ../patch-5.15.36-rt41.patch
2. 配置實時策略Fully Preemptible Kernel (Real-Time)
打上補丁之后,首先執(zhí)行 make mrproper清除歷史編譯記錄,讓內核保持干凈的狀態(tài)。
配置內核,最終目的就是得到.config這個文件,在下面進行內核編譯的時候,內核中的Makefile就會根據.config中的配置,來執(zhí)行對應的編譯動作。
常用且保險的方式就是:以當前正在使用的操作系統(tǒng)所使用的配置文件作為藍本,進行適當的修改配置,來得到最終的.config文件。
首先執(zhí)行如下命令來得到當前系統(tǒng)的內核配置文件:
$ zcat /proc/config.gz > .config
然后執(zhí)行指令:make menuconfig,進入內核配置界面。
實時策略配置項一般位于路徑:【General setup】-【Preemption Model】中。
但是進入之后會發(fā)現(xiàn):只有3個選項,沒有預期的 【Fuly Preemptible Kernel(Real-Time)】這個選項。
在查閱資料的時候,有一個解決方案說:打開 【 General Setup 】 -> 【 Embedded System 】之后,就可以選擇實時策略了。
的確如此!但是這個打開這個配置之后,編譯出的內核無法啟動!
我沒有對比打開【 Embedded System 】這個選項之后對配置文件的改動,以后可以再研究一下。
正確的解決方案是:
把【General setup】->【Confiure standard kernel features (expert users)】勾選之后,實時策略選項就顯示出來了。
配置好實時策略之后,我就開始編譯、安裝了,但是重啟之后,選擇新內核無法啟動,提示如下錯誤:
mount: /sys/firmware/efi/efivars: unknown filesystem type 'efivarfs'
在嘗試了兩個錯誤的解決方案之后,最終通過下面這個方案解決了這個問題:

3. 編譯和安裝內核
實時策略問題解決了,然后依次執(zhí)行如下指令來編譯內核:
make -j4
make modules -j4
編譯內核的時間比較久,主要取決于電腦的性能。
編譯成功之后,執(zhí)行安裝命令:
make modules_install
cp -v arch/x86/boot/bzImage /boot/vmlinuz-linux515
bzImage文件僅僅是一個軟鏈接,最終指向的是 arch/x86_64/boot 目錄下的同名文件。
4. 制作和安裝RAM Disk
這一步的主要目的就是生成initramfs-linux515.img虛擬內存文件,并復制到/boot目錄中。
initramfs的主要作用就不贅述了,主要就是在操作系統(tǒng)掛載真正的根文件系統(tǒng)(/dev/sda2)之間,作為臨時的根文件系統(tǒng)來使用。
制作 initramfs文件需要使用工具 mkinitcpio 和必要的配位文件。
首先把系統(tǒng)中當前的配置文件備份一下:
cp /etc/mkinitcpio.d/linux.preset /etc/mkinitcpio.d/linux515.preset
然后編譯該配置文件:vim /etc/mkinitcpio.d/linux515.preset,修改下面的三行內容:
ALL_kver="/boot/vmlinuz-linux515"
default_image="/boot/initramfs-linux515.img"
fallback_image="/boot/initramfs-linux515-fallback.img"
最后,執(zhí)行mkinitcpio,來生成initramfs-linux515.img文件。
mkinitcpio -p linux515
5. 復制System.map文件
System.map文件是在編譯linux內核的時候生成的,直接把它復制到/boot目錄下即可:
cp System.map /boot/System.map
參考鏈接中做了一個軟鏈接,效果是一樣的。
6. 更新GRUB配置文件
這一步千萬不要忘記了!更新命令是:
grub-mkconfig -o /boot/grub/grub.cfg
至此,更換實時內核的所有操作就全部結束了!
重啟之后,選擇新的實時內核來啟動(在內核啟動列表中,帶有-rt字眼的),即可順利進入系統(tǒng)!
如果想看一下實時系統(tǒng)對任務處理的實時性,可以通過rt-tests這個軟件包來測試(可以與非實時系統(tǒng)對比一下)
pacman -S rt-tests // 安裝測試軟件
cyclictest --smp -p 100 -m // 執(zhí)行測試命令
既然看到這里了,如果覺得不錯,請您隨手點個【贊】和【在看】吧!
如果轉載本文,文末務必注明:“轉自微信公眾號:IOT物聯(lián)網小鎮(zhèn)”。
推薦閱讀
【2】C語言指針-從底層原理到花式技巧,用圖文和代碼幫你講解透徹
【4】Linux中對【庫函數】的調用進行跟蹤的3種【插樁】技巧
【6】gcc編譯時,鏈接器安排的【虛擬地址】是如何計算出來的?
【8】Linux 動態(tài)鏈接過程中的【重定位】底層原理
其他系列專輯:精選文章、應用程序設計、物聯(lián)網、 C語言。
