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”是大写。

(2021.02更新:sd-lvm2现在变成了lvm2;HOOKS中的udev是默认在那儿的,一般PC装Arch好像不用非得按上述括号中的,systemd-based initramfs写不写udev好像没啥区别)

设置密码、新建用户

设置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 -risc就可以安装上了。但是现在可能不能正常运行。看了看GitHub issues,有人找到了原因:因为scrot的版本>=1.0后,需要加-o选项,才能overwrite什么什么temp文件。
我的解决办法就是:正常安装好i3lock-wrapper后,以root权限打开/usr/bin/i3lock-wrapper,编辑第146行,给scrot加上-o选项,即可正常使用了。
这是我下载好的i3lock-wrapper的包文件夹的分享链接,提取码:7ti9。失效了请联系我(liberty1997@yeah.net),再分享。

更新:
AUR目前还是没有i3lock-wrapper,想用的话就是下载我网盘的分享然后自己安装一下,安装好后看一下/usr/bin/i3lock-wrapper文件,因为作者后来加了一个判断scrot版本的语句(No.150行),如果有这个判断语句的话,就不用上述提到的“我的解决办法”了。(如果因为某些原因安装失败了,也没法解决的话,那就用别的包吧,还有个i3lock-blur,应该也可以实现毛玻璃锁屏。)

这是i3lock-wrapper作者的GitHub,README.md中有酱紫一句话“For Arch Linux users here is an AUR created by Thiago Perrotta.”,不过“AUR”这里的超链接已经404了,维护AUR/i3lock-wrapper的那位老哥不干了,AUR的包也就去了。


从ACL开始到本文结束所写内容,我个人认为看英文原文理解地比较到位,因为我翻译成我的话,可能自己看起来都绕,所以有需要的同学请多多研读英文原文文档。


目前只记录这么多,后续有什么想起来的或是新遇到的,会再增添。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值