Close

不想學習的時候你還可以這樣——ArchLinux安裝不完全指北

我的 ThinkPad T40 走的時候真的算不上安詳,屏幕上的圖像上下跳竄,硬碟時不時發出哀怨的聲音,最終也是沒有伴我走完 2020 這個多舛的年份。於是我打算換一臺代表人類嶄新科技的筆記本電腦,首發於 2011 年 4 月的 ThinkPad X220。二手電腦送來的時候店家很貼心地告訴我,上面已經預裝了「潔淨」的 Windows 系統。這就很不靠譜了,一個常識就是,要麼你有一個潔淨的作業系統,要麼你有 Windows。一個捆綁了瀏覽器播放器郵件客戶端寫字板繪圖工具的作業系統要自稱潔淨的話,可能是因爲出廠前把底限完全地卸載了吧……

這次要安裝的 ArchLinux 作業系統將會非常地輕量,除了 basebase-devel 兩個組之外所有的應用程式都只有在我們需要的時候纔會安裝,從而確保了系統中沒有我們不用的程式(其實還是有的,諸如 tee 啊,sed 啊,利用率就不高)。本次安裝基本是按照 ArchWiki 的 Installation guide 來進行的,ArchWiki 的編輯質量真的非常高,所以那些說 ArchLinux 用戶冷漠的人,都是沒有好好閱讀 Wiki 的人啊。

總之,完成的效果應該如下圖:(不含炎熔跟芙蓉姐妹)

My Linuxporn
我的 ArchLinux 作業系統界面

準備工作

很久以前,安裝系統我們都會把文件放置到目標機器上,然後通過編輯分區掛載信息來執行安裝,這個思路本質上還是沒有改變,但 Liveboot USB 科技使我們可以把系統方便地燒錄在隨身碟裏,通過腳本文件來釋放到目標系統,不得不說,人類的科技真的很偉大。即便如此,要購買到 USB,在上海來說也是非常困難的,最後不得不選擇網購,這個世界雲端化得太快,物理儲存媒介不再有便攜的意義,明明是便攜式的硬碟也動輒 1TB。從 ArchLinux 的下載頁獲取 ISO 鏡像文件之後,就可以通過燒錄工具寫到 USB 中了,過去的教程會推薦大家用 dd,因爲是 Linux 系統自帶的工具,並且也非常簡單好用,但現在因爲有「誰も大好き」的含義更方便的 GUI 替代品而遭受唾棄。這次推薦的工具是 balenaEtcher,一款跨平臺的 Liveboot USB 燒錄工具,將先前下載的 iso 文件燒錄到 USB 中,然後備份好原來機器上的文件(因爲我的 Windows 很潔淨,所以可以跳過這裏)。

插上 USB 開機,摁住(我的情況下)F12 鍵就能打斷系統加載的進程,然後選擇「boot from usb device」或者類似的項,就能進入安裝界面,選擇「installation live environment」即可登錄一個 ArchLinux 的對話,live environment 當中已經預裝了很懂功能,並且有安裝系統專用腳本 pacstrap,用來釋放鏡像中的文件。

在 Live Environment 當中的工作

登錄了 live environment 之後,就是我們熟悉的終端界面了,cdls 這些熟悉的功能又回到我們手邊了。

確認引導模式(boot mode)

大概是 7、8 年前吧,電腦的驅動引導依然是保存在 BIOS 當中的,這種引導模式稱爲 MBR(Master Bootstrap Record),不過隨着 Windows 科技的進步,越來越多的電腦都使用了 UEFI(Unified Extensible Firmware Interface)這種更加靈活和功能豐富的操作界面。通過如下命令來確認系統用哪種引導模式:

ls /sys/firmware/efi/efivars

/sys/firmware/ 文件夾下面保存了固件信息,如果目標機器是 MBR 的話,自然不會有 efi 這個固件,就會報檔案不存在的錯誤。反之,沒有報錯的話,意味這系統確實是 UEFI 的。明明是 10 年前的機器了,X220 也是應用了 UEFI 固件,ThinkPad 真是不容小覷。

連接網路

安裝鏡像小的另一個原因在於,主要的程式和包依然是從 ArchLinux 的 repository 下載的,因此需要網路支持。安裝時候建議連接有線網路,當然有線網路這種東西也原來越罕人問津了,我們可以通過下述安裝鏡像中預裝的工具來連接無線網路:

ip link

ip link 會列出所有可用的網路設備,在我的 X220 上的結果是

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s25: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether f0:de:f1:b1:64:ee brd ff:ff:ff:ff:ff:ff
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000
    link/ether 10:0b:a9:0c:13:40 brd ff:ff:ff:ff:ff:ff

第一個 lo 是 loopback 的意思,顯示的是到本機自身的鏈路,第二個 enp0s25 應該是 ethernet port 的縮寫(參考這裏),是有線網路,可以看到他的 state 也是 DOWN,第三個 wlan0 則是本機的 wifi 界面(wireless local area network)。那麼通過:

ip link set <interface> up

啓動無線網路,這裏的 <interface> 就是確認的無線網路的界面。而後利用

iwctl station <interface> connect <SSID>

來連接網路。在咖啡店之類不清楚 SSID 的網路的時候可以利用 iwctl 的交互界面來查詢(scan)可用的網路。需要注意的是,iwctl 等無線網路工具並不包含在基本安裝中,也就是說,安裝完的 ArchLinux 是不具備無線網路連接的功能的。

通過簡單的 ping 某些網址我們可以來確認網路是否暢通,在大陸可以 ping 中國的鏡像站點,在世界別的角落可以 ping google 或者 archlinux.org

ping archlinux.org

硬碟分區(disk partition)和掛載(mount)

通過 fdisk 工具可以簡單實現分區,而後通過 mkfs 工具可以實現格式化。安裝作業系統我們首先分析一下需要的分割區數量和大小。

  • 引導分割區(必須)用於存放引導系統啓動的檔案,掛載在 /etc/efi,也有掛載在 /etc/boot/efi 的做法,
  • 根目錄(必須)用於儲存所有系統文件和用戶共用的檔案,掛載在根目錄 / 位置,
  • Swap分割區(可選)也稱爲交換分區,在實體記憶體(RAM)用完的時候提供一個緩衝的空間,由於現在的電腦 RAM 大小都驚人,因此 swap 分割區也變得可有可無,但來自 2011 年的 X220 只有 2GB 的 RAM,因此選擇配置一部分的 swap,
  • 用戶文件(可選)用於儲存用戶的文件,由於 UEFI 的通行,支持更大的空間,劃分用戶文件分割區的做法已經失去了意義,雖然我還是這麼做了……掛載在 /home/ 下面。

由於 X220 的硬碟大小是 300G,分區的計劃是這樣的:

分區功能分區大小
引導分割區 /etc/efi大於 215M,分配了400M
交換分區 swap大於 512M,分配了600M
根目錄 /分配了60G,現在有點後悔,感覺可以再大一些
用戶目錄 /home分配了剩餘的239G

通過 lsblk 確認了硬碟的名稱是 /dev/sdX 之後,就可以利用 fdisk /dev/sdX 對硬碟進行分區操作了,基本而言會用到的功能有:

  • n 新建分割區,由於我們這次只有四個分區,所以可以都是主分割區,起始位置默認,結束位置用 +400M 之類的記法來設置即可,
  • d 刪除已有分區,用於刪除先前的 Windows 分割區或者由於寫錯的分區表,
  • p 打印目前編輯中的分區表,
  • t 設置分區的類型,我們會用的類型基本有 EFI(用於引導分割區)、Linux(用於存放文件系統)、和 swap(用於交換分區),
  • w 寫分區表,注意在執行 w 之前,分區表都沒有被寫入系統,如果此時退出 fdisk 系統並不會有任何變化,但寫操作之後,原來在系統當中的分區就會被破壞而變得不能(輕易地)讀取,
  • q 退出 fdisk,這個設定是給「如何退出 Vim」的讀者準備的。

寫完分區表之後,我們就可以格式化分區了:

mkfs.fat -F32 /dev/sdX1		# for efi partition
mkswap /dev/sdX2			# for swap partition
mkfs.ext4 /dev/sdX3			# for root partition
mkfs.ext4 /dev/sdX4			# for home partition

然後把所有分區按計劃掛載到 /mnt 下面:

mount /dev/sdX3 /mnt
mkdir /mnt/home /mnt/efi
mount /dev/sdX1 /mnt/efi
mount /dev/sdX4 /mnt/home
swapon /dev/sdX2

到這裏爲止,已經把所有先期準備妥善完成了。分區完成的效果應該是這樣的:

My partition settings
我的分區方案

安裝系統(pacstrap

接下來就是使用神奇腳本的時間了:

pacstrap /mnt base base-devel linux linux-firmware netctl dialog sudo vim grub

pacstrap 的功能是將指定的包安裝到第一個參數指定的目錄裏,base 組包含的 ArchLinux 的最小安裝,但是爲了開發方便,我們追加了 base-devel 來獲得 gcccmake、以及 git 等功能,linuxlinux-firmware 給硬體的驅動做及時的更新和補丁,netctl 則提供了無線網路的操作界面,其中dialog 是一個非常便利的 wifi-menu 功能。最小安裝的 Archlinux 是不具有 sudo 的功能的,也就是說即使建立了用戶,用戶也無法擁有管理員的權限,因此安裝 sudo 來實現這個功能,vim是我的日常書寫工具。grub 則是引導啓動的工具。

這個安裝過程可能會比較久(取決於網路環境和個人愛的多少),我的情況的話大概是4、5盤 Arknight 的時間。安裝 ArchLinux 的時候玩 Arknight,不曉得你有沒有 get 到這個扣錢梗。趁這個時間說一下爲什麼建立一個非 root 用戶那麼重要,因爲 root 可以爲所欲爲啊,甚至可以試試看 rm -rf / 這種操作,所以需要使用別的用戶,減少他的權限。例如當我們安裝來自於 AUR(ArchLinux Users Repository)的時候,makepkg 就會告訴我們,絕對不能用管理員權限來安裝來路可疑的軟件。

寫分區文件

爲了讓系統能夠自動掛載硬碟,而不是每次我們親自來 mount,我們需要寫一個分區文件來告訴系統如何掛載。

genfstab -U /mnt >> /mnt/etc/fstab

參數 -U 的作用是用 UUID(Universal Unique Identifier 全宇宙唯一標識符)來標記硬碟,這樣操作的好處在於即使我們之後增加了硬碟,或者調換了接口,系統依舊能夠正確找到文件系統的位置。

在新安裝的系統當中的工作

安裝完系統,我們就能通過 arch-chroot 這個特殊的 chroot 功能來切換到新的系統中,原來系統中跑的服務並不會中斷,趁這個機會,我們要製作啓動文件。

GRUB 啓動文件

由於用的是 UEFI,發現除了 grub 之外還需要安裝 efibootmgr 來實現製作啓動引導文件,因此再安裝一下這個程式:

pacman -S efibootmgr

而後,我們就可以把 GRUB 安裝到我們準備好的引導分割區了:

grub-install --target=x86_64-efi --bootloader-id=GRUB --efi-directory=/etc/efi

--target 指定了我們要安裝 GRUB 版本,對於 x86 的 64 位機器(ArchLinux 不再支持 32 位系統)用的版本自然就是 x86_64-efi 了,對於 arm64 架構的機器,這個參數應該是 grub-efi-arm64,而 armv7 上面似乎也有對應的版本,不過在 armv7 的設備上 GRUB……(苦笑)

最後把配置文件輸出到指定位置:

grub-mkconfig -o /boot/grub/grub.cfg

這時我們退出 chroot 然後重啓系統就可以進入新裝的操作系統了,但在此之前,先做一些基本的設置。

系統設置

Linux 提供了很多便利的工具,因此在真正開始使用之前的設這非常重要。

時區設置

timedatectl set-timezone Asia/Shanghai

或者,我喜歡的方法是老派的 symbolic-link

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc

然後就能通過 NTP(Network Time Protocol)來調教時鐘了

timedatectl set-ntp true

本地化設置

本地化設置講能夠幫助你的系統正確顯示文字,時間格式等,本地化設置的文檔位於 /etc/locale.gen 編輯這個文檔,刪除你需要的語言編碼,我的話選擇了 en_US.UTF-8 UTF-8zh_CN.UTF-8 UTF-8zh_CN.GBK GBKzh_TW BIG5、和 ja_JP.UTF-8 UTF-8 來提供英文,簡化字,正體字,以及日文的顯示。

設置完之後,用:

locale-gen
echo 'LANG=en_US.UTF-8' >> /etc/locale.conf

就能使得本地化設置生效。爲什麼中文弄了那麼一堆呢?因爲 GBK (國 Guo 標 Biao 庫 Ku)是一個簡化字字庫,因爲網路隔絕的原因,使用 GBK 的網站依然很多;BIG5 最早是由一家臺灣電腦公司設計的內碼,是正體中文字庫,由於歷史原因依然被很多(尤其是遊戲)軟體運用。相對而言 UTF-8 是一個標準的 Unicode 編碼策略,包含了簡化字和正體,是我們推薦使用的方案。雖然我的習慣是使用正體漢字,但我對大五碼也是深惡痛絕啊,要不是爲了風色幻想系列,這種編碼早就應該滅絕了吧,建議 BIG5 改名叫 WF7 碼(想得美)。

網路設置

Linux 從本質上還是一個網路終端-服務器的結構,因此需要給新裝的電腦一個命名:

echo <hostname> >> /etc/hostname

這樣就把設備命名爲了 <hostname>,之後再設置一下本地 IP:

vim /etc/hosts

在文件中鍵入

127.0.0.1	localhost
::1		localhost
127.0.1.1	<hostname>.localdomain <hostname>

新建用戶和密碼

首先先爲 root 設置密碼(出於安全考慮)

passwd

注意對 root 來說,密碼最好足夠複雜,難以記憶。

然後我們來增加一個用戶 <user> 並把他加入 wheel 分組,賦予他 sudo 的權限,我們用這個用戶來日常登錄和操作系統。

useradd -m -G wheel <user>

useradd 工具用於建立一個新的用戶,-m 爲這個用戶建立了用戶目錄,默認地,這個目錄位於 /home/<user> 由於我們分區掛載的模式,這些文檔和系統文檔不在同一塊分割區中(如果有兩張硬碟的話,甚至可以不在同一張硬碟中)。

新增完用戶,我們也需要給這個用戶也設置密碼:

passwd <user>

這個密碼用於日常登錄 <user> 帳號,因此不應該太難以輸入。至此爲止我們可以登出系統登錄新用戶,但是新用戶並沒有任何管理員的權限,爲 wheel 用戶組賦予 sudo 的權限,需要我們編輯 /etc/sudoers 這個文件。需要注意的是,首先這個文件比需要有 root 權限的用戶才能編輯,其次他也拒絕用戶直接用編輯器編輯,對應的我們需要使用 visudo 命令來打開文件,和單純的 vi 直接編輯不同,visudo 在保存修改過的 sudoer 之前會檢查內容是否語法正確,防止這個文件別破壞。

visudo

在文件中找到下面這行

# %wheel ALL=(ALL:ALL) ALL

刪除前面的 # 使得這條設置生效,這樣新建的用戶就擁有 sudo 權限了。

重啓和登錄

完成了所有設置之後,我們需要退出 chroot

exit
shutdown now

拔除 USB 重啓,就能登錄新裝的系統啦。整個流程大概在半小時左右的樣子,但是得到的新系統只有 tty 終端,距離可用性依然有很大的距離,下一篇,我們再討論怎麼配置和適當美化系統吧(:

作業

那麼今天的作業是

  • 如果 GRUB 沒有安裝正確,或者某些配置導致了無法順利啓動應該怎麼辦呢?(提示:Liveboot USB 真的是人類科技文明的精華哦~)
  • 爲什麼在 chroot 下有一些事情無法做呢?有哪些事情是無法做的呢?(比方說 shutdownreboot 還有別的嘛?)

下課~

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

沪ICP备19039127号-1