Arch Linux Installation Guide 2020 (UEFI+GPT+LVM+Dual Boot)

Win 10 和 Arch Linux雙啓動

詳細描述請查看Arch Wiki中有關雙啓動的頁面
推薦先安裝好Windows,再安裝Linux。安裝Linux時只要掛載Windows安裝時創建的ESP分區就行了。

如果電腦支持UEFI,那就以UEFI啓動方式安裝Windows和Arch,硬盤的Partition table建議UEFI搭配GPT、傳統BIOS搭配MBR。也闊以叉開搭配,可以參考我以前寫過的記錄。隨便MBR、GPT都能裝,看現有硬盤是個啥,就順着裝,不用來回折騰了。

(我是在筆記本、只有一塊硬盤裝的:EFI啓動+GPT,先裝Win 10,分好Windows的區。Win安裝完成後,進磁盤管理,從最後一塊區分了100多G出來,格式化爲Free Space,留作安裝Arch的分區。)

接下來開始安裝Arch。鏡像的下載和刻錄工具好像在Wiki裏有寫,官網Download的種子文件,下載挺快,或者去國內鏡像網站下載也行;刻錄工具推薦rufus,我忘了我在哪下載的rufus了……

進入安裝鏡像,驗證啓動模式

執行命令 # ls /sys/firmware/efi/efivars,若有東西輸出,則爲EFI啓動;若返回不存在dir,則不是UEFI啓動。
如果自己知道電腦設置了什麼啓動模式,就不用驗證了。

檢查網絡是否連接

執行命令# ping -c 4 www.baidu.com,若網絡暢通,則輸出就是一行一行很快結束的;若停頓了輸出,最後還顯示packet loss 100%,就是沒網。

  • 若沒網,且電腦連着網線,則執行# dhcpcd,應該就連上網了。
  • 若是無線,就用iw工具連接:
    1. 激活網卡 # ip link set interface up
    2. 查看可連接的無線網絡 # iw dev interface scan | less
    3. 連接無需密碼的公共網 # iw dev interface connect "your_essid"
    4. 連接有密碼的無線網 # iw dev interface connect "your_essid" key 0:your_key
    5. 再ping一下,試試聯網成功否

我記得第一次裝Arch時,連無線有個工具是wifi-menu,不知道現在的鏡像裏是否還有這個工具。Arch Wiki中有關無線網的頁面在此Network_configuration/Wireless

更新系統時鐘

# timedatectl set-ntp true

如果裝的是雙系統Win和Arch,則需要在安裝完Arch後設置一下時間:RTC、UTC這些。
好像Win和Linux的時間標準不一樣,以前看過Arch Wiki,並且我以Arch的時間爲準,則安裝好Arch後,在Arch裏設置RTC與UTC保持一致,這樣Linux下的時間就與生活中的正常時間一樣,而Win下的時間是+8才爲正常時間。
詳見Arch Wiki中的Time standard。點進去後從頭看下整個頁面的內容也行。

分區

首先,個人推薦的分區工具爲cfdisk,有個簡單界面,便捷快速。
因爲我之前是在Win 10中的磁盤管理從最後一個Windows盤劃出了100多G空間作爲安裝Arch使用,並且格式化爲Free Space。建議格式化爲Free Space,這樣一進入界面化的分區工具,就能找到該分哪個space。如果不格式化爲Free Space,則需要記住分出來多少G空間,然後在那個空間上進行Linux分區。
從Win分出來區時,不一定要從最後一個盤分,也可以從前面的盤分,但要記住順序,是第幾塊區。例如,在筆記本上+一塊硬盤+EFI啓動,然後Win分區爲C、D、E、F,則在cfdisk中顯示爲:win10安裝時創建的ESP分區爲sda1,C盤的區是sda2,D、E、F則依次爲sda3、sda4、sda5,若在Win的磁盤管理中是從D盤劃出來一塊空間,則在cfdisk中顯示爲sda6,且位於sda3和sda4中間。(好像是醬紫,說錯了請忽略……

如果不是安裝雙啓動,是在新/空硬盤上安裝UEFI啓動的Arch,則進入cfdisk後,會讓選擇分區表類型,選爲GPT即可。然後需要自己New一塊大小在260MiB~512MiB的分區,爲sda1,然後Type選爲“EFI System”,就建好了ESP(EFI system partition)。

剩餘的Free Space,可以自行選擇劃分幾個區。我裝的是雙系統+Linux on LVM,所以把Free Space直接New一下,Type選爲“Linux LVM”,將這一整塊空間全部弄成LVM。

分區劃完後,進行“Write”寫入磁盤分區變化,確認,然後“Quit”。退出後,可以執行# lsblk,看剛纔的分區變化是否成功。

設置LVM

這次又在虛擬機體驗Arch安裝,是因爲在b站聽人說安裝過程發生了些許變化。所以我又試了一次,其實沒什麼影響。好好看Arch Wiki,多看Arch Wiki,大部分問題都能解決。

有關LVM的介紹,直接在Arch Wiki裏搜LVM。以前創建LVM的操作在LVM頁面就有,但是現在寫在了另一個頁面,詳見Install Arch Linux on LVM

關於LVM的相關介紹、操作,請認真看上面兩個鏈接。
接下來開始設置LVM:

  • 顯示可設置LVM的分區:
    # lvmdiskscan
  • 創建PV(類型爲Linux LVM的分區,皆可在其上創建PV):
    # pvcreate /dev/sda2
  • 創建VG(一個VG可以包含多個PV):
    # vgcreate VolGroup00 /dev/sda2
  • 如果還有其他PV要加進VG:
    # vgextend VolGroup00 /dev/sdc1
  • 創建LV:(一個VG中可以有多個LV,因爲在虛擬機裏隨便玩,我只建了一個LV,並用上VolGroup00的全部空間)
    # lvcreate -l +100%FREE VolGroup00 lvolroot
    (若要創建多個指定大小的LV,可用"-L"選項指定大小:# lvcreate -L 10G VolGroup00 lvolroot

格式化分區 創建文件系統

將ESP分區格式化爲FAT32:
# mkfs.fat -F32 /dev/sda1
將LV格式化爲ext4:
# mkfs.ext4 /dev/VolGroup00/lvolroot

掛載

先掛載root根分區:
# mount /dev/VolGroup00/lvolroot /mnt

然後掛載ESP分區:
# mkdir /mnt/boot
# mount /dev/sda1 /mnt/boot
*Arch Wiki中說推薦將ESP掛載到/boot,也可掛載到/efi,也可以選擇除了這倆的其他位置。如果稍後要用systemd-boot,則最好掛載到/boot,方便(我沒實踐過 用systemd-boot + esp掛載到/efi,好像也行);若要用GRUB,則掛到/boot或/efi都行;若整個筆記本只裝Arch,則不用boot loader或者boot manager也能UEFI啓動Arch。(用GRUB的話,還可以設置select entries時的背景壁紙,選個炫酷的壁紙,那一瞬間,看起來比較靚。)

接着,還有什麼區(home啦、usr啦,等等),就該掛掛。

如果boot loader要用GRUB,則還需下面兩行,解決安裝GRUB時可能發生的問題:
# mkdir /mnt/hostlvm
# mount --bind /run/lvm /mnt/hostlvm

上面所有小節中的命令 涉及到sdaX的,請依自己的情況,換成相應的sdaX,勿出錯。

換源

在/etc/pacman.d/mirrorlist中將China源粘貼到源列表的最開始,或者自己寫到源列表的開頭,只把源地址中間的網址換一下就行,開頭結尾都一樣,清華是mirrors.tuna.tsinghua.edu.cn、網易是mirrors.163.com、aliyun是mirrors.aliyun.com,這幾個一般就夠用了。

安裝系統及需要的包

以前安裝系統是下面醬紫的:
# pacstrap /mnt base base-devel

現在變了,沒了base-devel包:
# pacstrap /mnt base linux linux-firmware lvm2 connman vim man-db man-pages texinfo

因爲設置了LVM,所以在這兒需要給新系統安裝上lvm2包;connman是個人推薦的一個網絡管理器,現在先給新系統安裝上,等chroot後就可以在新系統內聯網,如果有慣用的其他網絡管理器,可自行更換。(這兒安裝包時,除了系統所需外,比較重要的就是網絡管理器,在新系統只要能聯網,那想幹啥就幹啥。)

Fstab

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

Chroot

# arch-chroot /mnt

這條是接着之前說的,安裝GRUB時可能發生的問題的解決辦法:
# ln -s /hostlvm /run/lvm
(如果不用GRUB,應該不需要這裏的和前面的“解決辦法”。)

Time Zone

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

Localization

編輯/etc/locale.gen,將en_US和zh_CN、zh_HK、zh_TW所在行的“#”去掉,然後保存退出,執行
# locale-gen
# echo "LANG=en_US.UTF-8" > /etc/locale.conf

Network configuration

設置hostname:
# echo "myhostname" > /etc/hostname

編輯/etc/hosts:

127.0.0.1	localhost
::1		localhost
127.0.1.1	myhostname.localdomain	myhostname

設置之前安裝的網絡管理器connman:
開啓服務:
# systemctl start connman.service
允許開機自啓:
# systemctl enable connman.service

然後# connmanctl,可以設置連哪個無線網。連一次,後續再用時就自動連接了。有關connman的使用,查看網頁

Initramfs

因爲設置了LVM,所以需要Adding mkinitcpio hooks,For systemd based initramfs:
打開/etc/mkinitcpio.conf,找到HOOKS這行,按下圖所示添加"sd-lvm2":
HOOKS=(base systemd ... block sd-lvm2 filesystems)
(這是systemd based initramfs的,需要把udev換成systemd,並添加sd-lvm2;如果是busy-box based initramfs,則只需要在相應位置添加lvm2)

然後recreate the initramfs image:
# mkinitcpio -P
“P”是大寫。

設置密碼、新建用戶

設置root密碼:
# passwd
新建普通用戶、設置密碼:
# useradd -m username
# passwd username

我最開始在別的博客裏看到的新建用戶的命令是# useradd -m -g users -G wheel username,在這次之前,一直用着這條命令,但現在才知道這是不必要的:

  • -g選項會將新用戶的default group設爲users,但是不推薦這樣做,尤其是多用戶系統。不用-g,則用戶的default group爲一個和username同名的group,這是推薦做法,後續會再講。
  • -G好像是給用戶添加輔助組還是什麼,但是現在沒必要給用戶設置wheel輔助組,sudo和su不依靠wheel也能發揮作用。以後需要加輔助組了,再加。

Boot loader

(我用的是EFI啓動+GRUB,所以這裏只寫了寫GRUB安裝。用systemd-boot的話,安裝會更簡單,詳見頁面。而根據Arch Wiki中的比較,GRUB支持的東西最多。)

首先,安裝grub、efibootmgr,若是Windows+Arch雙系統,則還需要os-prober
# pacman -S grub efibootmgr

然後,安裝支持系統掛載NTFS和exFAT分區的工具,安裝Microcode(若是AMD的CPU就把"intel"換爲amd):
# pacman -S ntfs-3g exfat-utils intel-ucode

然後,安裝polkit,使普通用戶能使用reboot、shutdown等命令:(若是自己一個人用的筆記本的Linux,那用systemctl也行)

“polkit is necessary for power management as an unprivileged user”

# pacman -S polkit

然後,安裝配置sudo:
# pacman -S sudo
# EDITOR=vim visudo (沒有安裝vim,可換成其他installed editor)
進入後找到"root ALL=(ALL) ALL"這行,複製一下黏貼到下一行,然後將root改爲需要的username。

然後,安裝GRUB:
# grub-install --removable --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB
“esp"處替換爲esp的掛載點,本文爲”/boot";“GRUB"是bootloader identifier,可自己隨便寫,其他選項的含義請查看Wiki。若成功安裝GRUB,則會輸出什麼什麼什麼什麼"No error occurred.”。

因爲我的/boot和/根分區都在LVM裏,所以還需編輯/etc/default/grub,找到下面這行並在末尾添加"lvm":
GRUB_PRELOAD_MODULES="... lvm"

然後,生成grub.cfg:(每次修改了/etc/default/grub,都應該重新生成grub.cfg,以使配置生效)
# grub-mkconfig -o /boot/grub/grub.cfg
如果是Win+Arch雙系統,且安裝了os-prober,且GRUB安裝沒發生問題,但是生成配置文件時沒有說檢測到Windows存在,可以等完成安裝後,進入UEFI設置,把安全啓動、快速啓動關了,然後再試試,還不行 就在Linux下掛載一下Windows分區,然後再試,還不行,就看看Arch Wiki中GRUB頁面下方的Troubleshooting。
若還不行,就只能自己添加Windows啓動項了,方法在Wiki中有講。以下是我的/etc/grub.d/40_custom:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry "Win 10" {
	insmod part_gpt
	insmod fat
	set root=(hd0,gpt1)
	chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
	boot
}
menuentry "System shutdown" {
	echo "System shutting down..."
	halt
}
menuentry "System restart" {
	echo "System rebooting..."
	reboot
}

這個文件寫好後,也是需要重新grub-mkconfig一下,才能生效。

(我第一次安裝Arch時,是和win 7雙系統,當時第一次grub-mkconfig就檢測到了Windows;然後在2019年上半年時,我把整個硬盤清空,重新安裝了Win 10 和 Arch,這次則沒有檢測到Win 10,試了一些解決方法,任然未檢測到,遂自行添加了Win 10啓動項——但是後來不知道怎麼的,因爲我加了GRUB的背景壁紙需要重新生成配置文件,這次就自動檢測到了"Windows boot manager"。)

有關GRUB更詳細的信息和問題解決,請參考GRUB

Reboot

退出chroot環境:
# exit
unmount所有分區:
# umount -R /mnt
重啓:
# reboot

移除安裝介質,即可進入新系統,完成安裝。
如若還需要安裝DE或者WM以及其他一些東西,可看Wiki的General recommendations和List of applications自行選擇。
我個人一直都是用着i3wm、dmenu、URxvt、Thunar、Chromium等等。


接下來記錄一些這次新看到的東西

文件權限控制:ACL(Access Control Lists)和chmod

這裏只記錄一些可能用到的ACL命令:
To set permissions for a user:
# setfacl -m "u:user:permissions" <file/dir> // 若省略user,則默認爲給owning user修改權限

To set permissions for a group:
# setfacl -m "g:group:permissions" <file/dir> // 若省略group,則默認爲給owning group修改權限

To set permissions for others:
# setfacl -m "other:permissions" <file/dir>

To allow all newly created files or directories to inherit entries from the parent directory (this will not affect files which will be copied into the directory):
# setfacl -dm "entry" <dir>

To remove all entries (entries of the owner, group and others are retained):(Remove all extended ACL entries:)
# setfacl -b <file/dir>

To show permissions, use:
# getfacl <file/dir>

用ACL修改過的文件/目錄,在ls -l時,會看到顯示權限的那個field的最後面有個"+",就表示是經ACL修改過的。但是如果使用setfacl -m時省略了user或者group,即給owning user or group進行修改,好像就沒有"+"。(這個記不清了……)

關於chmod:
# man chmod中,可以看到其稍詳細的描述:

chmod [ugoa…][[-+=][perms…]…], where perms is either zero of more letters from the set rwxXst, or a single letter from the set ugo. Multiple symbolic modes can be given, separated by commas.

下述“the selected file mode bits”表示使用chmod命令時你選擇的權限,“the existing file mode”表示當前(未修改時 | 執行chmod命令前)文件的權限

先說“+ - =”:

  • +就是將“the selected file mode bits”加到“the existing file mode”上,
  • -就是將“the selected file mode bits”從“the existing file mode”中去除,
  • =就是使“the selected file mode bits”和“the existing file mode”相同,即add the selected file mode bits,並remove unmentioned bits。但是若改變的是目錄的權限,且SUID和SGID屬於unmentioned,則該目錄的SUID和SGID不發生改變。原話是醬紫的:“= causes them to be added and causes unmentioned bits to be removed except that a directory’s unmentioned set user and group ID bits are not affected.”。 也就是說,在使用=時,對於file,它的SUID和SGID會根據“the selected file mode bits”發生變化,例如the existing file mode中有SUID,但是the selected file mode bits中沒有寫明SUID,此時的SUID就是unmentioned,而要使二者“=”,則需要把SUID剔除,所以說文件的SUID發生了變化;而對於dir,則不會發生這樣的改變,即:the existing file mode中有SUID,但是the selected file mode bits中沒有寫SUID,目錄的SUID也不會發生改變(被去掉)。

再說“permissions”,當perms是“rwxXst”時:

  • t:restricted deletion flag or sticky bit,對於dir來說,此bit可阻止用戶隨意刪除目錄下的東西,即:若一個目錄加了t,那麼(1)每個用戶對於此目錄下的東西,只能刪除owning user是自己的,不能刪除別人的;(2)如果用戶是這個加了t的目錄的擁有者,那便有權限刪除此目錄下的任何東西。 比如/tmp,在o上有t,就是users不可以刪除tmp下的不屬於自己的文件或目錄,而tmp目錄的擁有者root則可以刪除tmp下的任何東西。關於sticky bit,可看man chmod中的解釋。
  • s:set user or group ID on execution,對於file來說,若u+s,則執行file的用戶在執行過程中可以獲得owning user的權限,比如/usr/bin/passwd,它的擁有者是root,但是普通用戶執行時就可以暫時擁有passwd的擁有者(root)的權限,修改相關文件的內容,來給自己修改密碼;而對於dir來說,若dir有了g+s,則同組中不論哪個用戶在dir下創建新文件或目錄,都可以使新文件或目錄的owning group與dir的owning group保持一致。
  • X:execute/search only if the file is a directory or already has execute permission for some user。作用相當於x,但是隻有當操作對象是(1)目錄 或 (2)已經在ugo上任意一個有x的文件 時,才起作用:例如,有個file是-rw-r–r--,這時執行chmod u+X,或給g、o加X都不會有用,但是若這個file是-rwxr–r--,即ugo任意一個有了x,那麼此時執行g+X或o+X纔會生效,變成-rwxr-xr–或-rwxr–r-x。

當perms是“ugo”時:

  • u:the permissions granted to the user who owns the file,
  • g:the permissions granted to other users who are members of the file’s group,
  • o:the permissions granted to users that are in neither of the two preceding categories。

ACL在控制權限上更靈活一點。使用中需根據具體情況,看chmod系列和ACL哪個能更好地達成目的。

關於UPG

第一次遇到UPG是在Arch Wiki中的Users and groups這章,Example adding a user這節,它給的鏈接就是下面這篇文章:The How and Why of User Private Groups in Unix

UPG即User Private Groups,文中寫到:“The problem that UPG tries to solve is shared directories between different users.”。

文中還有一段關於在目錄上g+s的解釋:

From the coreutils info page, the following happens when setting the set_gid bit on a directory:
    On most systems, if a directory’s set-group-ID bit is set, newly created subfiles inherit the same group as the directory, and newly created subdirectories inherit the set-group-ID bit of the parent directory.

UPG之前在創建新用戶時提到過。Arch Wiki中說不推薦在useradd時用-g選項給用戶設定相同的default group,不用-g的話,則默認每個新用戶的default group都是一個與username同名的group。而UPG就是在說要給每個用戶設置各自的不同的default group,這樣就有了"private"。

這樣做有利於創建共享文件夾/共同工作目錄:
例如,現在有兩個用戶vanellope和liberty,他們各自的default group是vanellope、liberty,然後創建一個staff group,把二人都加入staff組。假定準備創建的共享目錄爲sharedF,mkdir sharedF以後,將它的owning group改爲staff,然後利用chmod,使staff group對sharedF的權限爲rwx,再chmod g+s sharedF,給它set gid。這樣二人在sharedF創建的subfile和subdir的owning group就自動設爲staff,且subdir會繼承sharedF的setgid。但是這時staff組中的用戶對不是自己創建的文件只有r權限,沒有w權限,有時很不方便。這可以通過設置umask,從022改成002,(“the method for facilitating shared write access for specific groups of users is setting user umask value to 002”),使與用戶同組的其他用戶對用戶新建的文件有了w權限。而因爲有UPG,雖然mask變成了002,但是用戶的default group只有用戶自己,這樣系統中的other users對於用戶在自己的家目錄下創建的文件/目錄是沒有w權限的,保護了用戶隱私、安全。
如果沒有UPG,即用戶的default group都是staff,則當mask變爲002時,staff中的其他用戶會對用戶在家目錄下的文件也具有w權限,而不是隻對共享文件夾下的文件有w權限。

另外,如果不想讓staff組中的用戶可以刪掉別人的文件,可以對sharedF進行o+t,即restricted deletion flag。這樣對sharedF下的東西具有刪除權限的只有subfile、subdir的owning user和sharedF的owning user。

Pacman(Package manager)

查看-Q的各選項的意義:
# pacman -Q --help

Upgrading packages:
# pacman -Syu

To remove a package and its dependencies which are not required by any other installed package:
# pacman -Rs package_name

To search for already installed packages:
# pacman -Qs string1 string2 ...

To display extensive information about a given package:
# pacman -Si package_name

For locally installed packages:
# pacman -Qi package_name

To list all packages no longer required as dependencies (orphans):
# pacman -Qdt

To list all packages explicitly installed and not required as dependencies:
# pacman -Qet

For recursively removing orphans and their configuration files:(Removing unused packages (orphans): )
# pacman -Rns $(pacman -Qtdq)
(Note: The arguments -Qt list only true orphans. To include packages which are optionally required by another package, pass the -t flag twice (i.e., -Qtt).)

pacman也有GUI工具,詳見Pacman Tips and tricks

i3lock-wrapper

我用的是i3wm,這個包是i3lock的一個fork,可以提供有毛玻璃效果的鎖屏界面。之前AUR裏有這個包,但是現在沒了。

我網盤裏有已經下載好的包文件夾,只需要makepkg -sic就可以安裝上了。但是現在可能不能正常運行。看了看GitHub issues,有人找到了原因:因爲scrot的版本>=1.0後,需要加-o選項,才能overwrite什麼什麼temp文件。
我的解決辦法就是:正常安裝好i3lock-wrapper後,以root權限打開/usr/bin/i3lock-wrapper,編輯第146行,給scrot加上-o選項,即可正常使用了。
這是我下載好的i3lock-wrapper的包文件夾的分享鏈接,提取碼:7ti9。失效了請聯繫我([email protected]),再分享。


從ACL開始到本文結束所寫內容,我個人認爲看英文原文理解地比較到位,因爲我翻譯成我的話,可能自己看起來都繞,所以有需要的同學請多多研讀英文原文文檔。


目前只記錄這麼多,後續有什麼想起來的或是新遇到的,會再增添。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章