tags | title | |
---|---|---|
|
在虚拟机 / 物理机中安装 Arch Linux |
本文将承接前文安装 Arch Linux 前的准备工作和为 Arch Linux 创建 Hyper-V 虚拟机,按步骤介绍在虚拟机以及物理机中安装 Arch Linux 的步骤。个别步骤虚拟机同物理机的操作不一致,后文中会注明,请注意区分。
以下参考官方安装指南。
此小节编写于 2021 年 4 月,此工具的使用流程目前已经发生了变化,
从 2021 年~~ 愚人节~~ 4 月 1 日起发布的 ArchISO,官方重新加入了弃更已久的安装脚本,堪称爷青回 / 文艺复兴。用这个脚本,你可以轻松的在同学的电脑的虚拟机上 15 分钟安装 Arch 并进入桌面环境。不过截止到此时脚本已经发生了多次更新,笔者没有再使用,建议各位在了解这个工具存在的情况下自行选择手动还是脚本安装。想要使用脚本安装,必须先理解如何手动安装。否则出现任何问题,都会摸不着北。故下文先正常走一遍手动安装的流程。
如果担心自己无法完全脱离 Windows,在某些时间点可能还要用到 Windows 专有的工具或者游戏,那么不妨直接做成双启动,不受虚拟 Windows 的局限性。
接下来说的如果一开始看不明白没关系,可以先跳过这一小节,在虚拟机中按照后文安装一遍,了解了概念以后回来再看这里。之所以在开头提是希望避免读者实际安装的时候才发现需要双启动却没有做准备工作而浪费时间。
如果要安排上双启动,最理想(简单)的顺序是:
- 在目标安装盘上创建并格式化一个至少 500 MB 的 ESP
- 安装 Windows 的时候创建一个大小符合 Windows 需要的分区并安装在它里面。此时 Windows 会自动利用磁盘中已有的 ESP。
- 在剩余的空间和已有的 ESP 上安装 Linux。
- 重启,享用双启动的系统。
如果先安装了 Windows 并不方便格式化重装,ESP 的大小会在 100 MB 左右,虽然我目前双启动只用了 75.3 MB,但如果换用其他内核也有可能不够存放内核和初始内存文件系统。此时,可以使用 systemd-boot 的 XBOOTLDR 启动模式。
启动机器前,请在机器固件设置(虚拟机配置或物理机主板配置)中打开 UEFI 模式。并且,俺建议和虚拟机安装过程一样关闭 Secure Boot。支持这一建议的原因为——Secure Boot 保护我们不受 Evil Maid Attack 之类物理攻击,但俺自用笔记本的环境几乎不存在收到这类攻击的可能,并且俺也不涉及绝密级别的工作,也没有做全盘加密,这种要看半个小时才弄得好的对我没有什么价值的安全措施暂时就不考虑了。如果有需要可以参看官方Secure Boot 指南。
之前提到过尝鲜建议先用虚拟机安装,可以在原系统下方便查阅资料。
不过即便是在物理机上启动了 Arch 安装介质,也有办法查阅资料。在连接到互联网之后,可以执行Installation_guide
来快速使用文本型网页浏览器lynx
查看官方指南。
如果希望一边看网页 / 文档,一边进行安装,可以用ctrl+alt+F1-6
或alt+ 左 / 右键
切换终端。
俺使用默认的 US 布局,故不做更改。
虚拟机之前已经配置了虚拟网络适配器,故跳过。
物理机安装时如使用有线连接,无需额外操作;而如需使用 Wi-Fi 连接,则首先检查无线功能是否被关掉:
rfkill list
如果是硬件关掉了,用机器上的开关开开;如果是被内核软件关掉了,可以执行命令打开:
rfkill unblock wifi
之后使用 iwd 连接无线网络,按 tab
键自动补全(一般情况下只需要第一行和最后一行):
iwctl
device list
station your-wireless-device scan
station your-wireless-device get-networks
station your-wireless-device connect your-wifi-SSID
一般来说,archboot
安装环境中已经包含了各种网卡的驱动,其中就有俺所需的高通专有驱动 broadcom-wl
。但如果工具仍然报错,请根据 无线网络配置 检查常见问题。
如此便可连接上 Wi-Fi 网络。
目标机器连接到网络后,如果可以使用另一台电脑连接到此台电脑的网络,则可以配置并使用 SSH 远程连接并进行安装操作。只需要给root
用户设置密码:
passwd
之后在客户端机器上执行 ssh root@目标机器的地址
即可。这种方法可以充分利用客户端机器上更好的性能或者熟悉的操作系统、操作方式。还可以轻松将配置文件用 sftp 的方式拷贝到目标机器上,快速完成配置。
运行如下命令,文件夹存在并有内容即正常。如不存在,则系统是在 BIOS 环境中启动的,请再次检查创建虚拟机时是否选择的 Generation 2。如是在物理机上安装,检查主板设置是否开启了 UEFI 模式。如果列出文件夹不存在,则启动的是 BIOS 模式。
ls /sys/firmware/efi/efivars
timedatectl set-ntp true
检查时钟状态:
timedatectl status
列出所有硬盘:
fdisk -l
寻找类似/dev/sda
或者/dev/nvme0n1
的条目,并根据磁盘的大小等信息,确定您想要安装的磁盘。
Linux 系统需要至少一个 root 目录(/
)分区。如果是 UEFI 启动,还需要一个 EFI 系统分区;如果是 BIOS 启动,并且想俺一样想用 GPT 分区表和 GRUB 则需要一个 BIOS 启动分区。Swap 可以通过分区实现也可以通过动态 Swap 文件实现,不过我现在有 16 GB 内存所以不上 Swap 裸奔。注意,不用 Swap 不能休眠计算机,据说有一些日志性质的缓存也在 Swap 中,不过没有照样用的可以。
在 UEFI 启动下安装,俺参考了官方分区模板,选择将磁盘分为 512MB 的 EFI 系统分区和利用全部剩余空间的 Linux x86-64 根分区。和一个 8GB 的 Swap 分区。Swap 分区的大小可以参考 It's FOSS 上的 一篇文章。一般来说设为物理内存的两倍肯定够用了。
在只能 BIOS 启动的一台老机器上,俺同样按照模板创建了一个 1MB 的 BIOS 启动分区、内存的两倍大小的一个 8GB 的 Swap 分区和利用全部剩余空间的 Linux x86-64 根分区。
分区时为了方便可以用 fdisk
工具的图形版 cfdisk
:
cfdisk
以下以常见的 UEFI / GPT 为例:
- Select label type 选择
gpt
(如果未提示,检查屏幕上方第三行是否为Lable: gpt
。如果不是则用fdisk
新建分区表。) - New 一个
512M
的分区,Type 更改为EFI System partition
- New 一个大小为剩余空间~~ -
8GB
(即cfdisk
自动填写的大小减去8GB
)~~的分区,并确保 Type 为Linux Root partition (x86-64)
New 一个8GB
的分区,Type 更改为Linux swap
- 选择 Write 将分区更改写到磁盘
- Quit
刚创建好的分区是没有文件系统的,我们要自行创建文件系统。
可以用
fdisk -l
来查看分区大小,用lsblk -f
来查看分区格式
将 EFI 系统分区格式化为 FAT32 格式,将 Linux 文件系统分区格式化为 ext4 格式:
如果您的分区名和下述不一致,请自行替换
mkfs.fat -F32 /dev/sda1
mkfs.ext4 /dev/sda2
如果之前创建了 Swap 分区,应将其启用:
mkswap /dev/sda3
swapon /dev/sda3
将 Linux 文件系统分区挂载为/mnt
,将 EFI 系统分区挂载为/mnt/boot
。
系统启动时,会在 EFI 系统分区寻找一个 Boot Loader(Manager)或者使用 EFISTUB 方式直接启动 Linux 系统内核。为了方便日后安装双系统或者调整启动参数建议安装
systemd-boot
或者GRUB
作为启动器。笔记本中俺是安装了双系统。
根据官方 Wiki 上关于 EFI 系统分区挂载 的说明,当选择 EFISTUB 直接启动的方法时,需将 EFI 系统分区挂载到(是否必须?存疑。)/boot
中。对应于我们将 root 挂载到/mnt
的情况,应将 EFI 系统分区挂载到/mnt/boot
目录。
mount /dev/sda2 /mnt
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot
Arch Linux 默认在线安装。此外,更新时也会通过镜像服务器下载软件包。镜像服务器的列表在/etc/pacman.d/mirrorlist
中,在安装过程中会被自动拷贝到新系统。在连接到互联网后,reflector
会自动从镜像服务器列表中选择前 20 个最近完成同步的服务器。下载软件包时会自动按照列表中的先后顺序选择服务器。但这些服务器中有的从国内连接会很慢。如果发生这种情况,可以手动改成使用国内大厂、大学的源。
我们也可以按照 Wiki 上关于 镜像服务器排序 的说明测试并修改列表:
reflector --country China --sort rate --save /etc/pacman.d/mirrorlist
还可以手动编辑,将自己喜好的镜像服务器放置在列表的前列:
-
如不想用 Vim / Nano 等命令行文本编辑器的话,可以直接用某个服务器地址覆写列表文件:
echo "Server = https://mirrors.cloud.tencent.com/archlinux/\$repo/os/\$arch" > /etc/pacman.d/mirrorlist
-
如果希望再附加一两行服务器,用
>>
来在文件末尾附加新内容,例如:cat >> /etc/pacman.d/mirrorlist Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/\$repo/os/\$arch Server = https://mirrors.sjtug.sjtu.edu.cn/archlinux/\$repo/os/\$arch Server = http://mirrors.163.com/archlinux/\$repo/os/\$arch #ctrl+d
最后一行表示用组合键
ctrl+d
输入文件终止符EOF
来完成该文件的编写。详见 Linux 系统输入输出重定向简介。
最后检查文件内容:
cat /etc/pacman.d/mirrorlist
在 /etc/pacman.conf
中将 ParallelDownloads
设置前的注释删掉其用并设置为你认为合适的线程数,比如 16 个或更多,即可启用多个软件包并行下载。
如果更新了服务器列表后还不够快,可以下载powerpill
,并用其先缓存各软件包。当然如果身边有可用的 Arch 机器,也可以用pacserve
,这里只说下powerpill
。
由于powerpill
属于 AUR 而非官方源,ArchISO 下makepkg
又会比较麻烦,所以建议添加 ArchlinuxCN 源或作者的源,并将SigLevel
改成PackageRequired
:
vim /etc/pacman.conf
# 将通用 SigLevel 改成 PackageRequired
SigLevel = PackageRequired
# ArchLinuxCN
[archlinuxcn]
Server = https://mirrors.cloud.tencent.com/archlinuxcn/$arch
# powerpill 作者源(个人建议有 CN 源就够了,别加这个了)
[xyne-x86_64]
SigLevel = Required
Server = https://xyne.archlinux.ca/bin/repo.php?file=
安装powerpill
并将各软件包缓存到新机上,(如果在虚拟机上,不需要安装linux-firmware
。在容器中,还能不装linux
内核):
# 如用 ArchLinuxCN,则需要安装 keyring
pacman -Sy archlinuxcn-keyring
pacman -S powerpill
mkdir -p /mnt/var/cache/pacman/pkg
powerpill -Swb /tmp --cachedir /mnt/var/cache/pacman/pkg base base-devel linux linux-firmware
建议此时就将所有之后想要安装的软件包一次性缓存下来,节省后续手动安装过程中等待下载的时间。下一步的pacstrap
工具会使用这些缓存直接安装。如果之前选择的镜像服务器不好用,可以ctrl+c
中止下载并重新选择服务器。下次pacman
会从中止的软件包开始续传。
下载并安装 Arch Linux:
pacstrap /mnt base linux linux-firmware
注 1:此时便可在命令后续写其他想要安装的软件包名,用空格隔开。这些软件包会被直接安装到新系统中。
注 2:从 2019 年 10 月 6 日起,base 软件包组被同名的新软件包
base
替换,且不再包含linux
、linux-firmware
、netctl
、vi
等包。俺已经根据这一变化、重新安装了系统并更新了这篇文章。这一改动的好处在于日后
base
中添加的新成员可以跟随base
的更新而自动安装。排除一些非必须的软件包可以给诸如进行批量部署的运维人员自定义需要的部件等使用场景带来方便。大家都可以安装自己需要的内核(linux
)、文本编辑器(neovim
)、网络管理器(networkmanager
)、固件(broadcom-wl-dkms
)等等,而不必用ignore
来排除、安装后删除、又或者不管不顾造成冗余。
fstab 文件用来规定分区、磁盘等如何被(自动)挂载。如果像我一样只在一个 GPT 盘上装系统,可以不用在此时就生成这个文件,而是用 systemd 自动挂载。否则请看下面的常规操作。
创建 fstab 文件,用-U
或-L
来指定用 UUID 还是标签来标识(建议使用 UUID):
genfstab -U /mnt >> /mnt/etc/fstab
检查生成的文件:
cat /mnt/etc/fstab
变更可见根目录到新系统中,开始新系统的设置:
arch-chroot /mnt
有nano
、vi
、vim
、neovim
等可以使用,俺使用的是neovim,并且将其通过 [
symlink](https://en.wikipedia.org/wiki/Symbolic_link) 用其彻底替换
vi(也可以安装
aur/neovim-symlinks` 包帮你完成替换):
pacman -S neovim
ln -s /usr/bin/{nvim,vi}
设置时区(亚洲 / 上海)(也可以暂时不设置,启动到新系统后用桌面环境自带设置或者 timedatectl
更改):
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
将硬件时钟设置为与系统时钟相同:
hwclock --systohc
程序和系统均需要用 Locale 来确定地域、货币、时间日期格式等等。要使用某个 locale 设置,就要先生成它。有时候,在系统使用过程中即使自己只用到一套 locale,也要为了支持切换、或者支持此电脑上的其他用户对不同的 locale 的需要,将所有可能用到的 locale 都一并生成。
移除/etc/locale.gen
中您需要的 locale 前的#
号注释。可以用 Nano/Vi(m) 等工具修改,也可以用cat
命令直接编写,例如:
cat > /etc/locale.gen
en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
zh_HK.UTF-8 UTF-8
zh_TW.UTF-8 UTF-8
# ctrl+d
注:建议选择 UTF-8 字符集的 locale。
之后生成 locale 讯息:
locale-gen
创建locale.conf
文件,设置LANG
变量(也可以不设置,进入新系统后用桌面环境自带设置或localectl
设置):
echo LANG=en_US.UTF-8 > /etc/locale.conf
注:建议操作系统均使用英文 locale,这样终端内的输出、软件报错信息均为英语,便于 Google 搜索和问题分享等等。反之,设置成汉字语系的 locale 还可能导致 TTY 乱码。
之后设置新系统的键盘布局,由于俺用默认的 US 键盘布局,故跳过。
创建 hostname 文件(也可以不设置,进入新系统后用桌面环境自带的设置或者用hostnamectl
设置):
用您喜欢的主机名替换
myhostname
。
echo myhostname > /etc/hostname
cat > /etc/hosts
127.0.0.1 localhost
::1 localhost
127.0.1.1 myhostname.localdomain myhostname
# ctrl+d
如果此系统有一个永久 IP 地址,应该用此地址替换
127.0.1.1
。
完成其他网络配置:
-
虚拟机:
对于虚拟机,只需要启动
dhcpcd
服务即可:systemctl enable dhcpcd
-
物理机:
如使用有线网络连接,同上述虚拟机配置一样只需启动
dhcpcd
服务即可。如需在新系统中继续使用 Wi-Fi,则建议安装一个 网络管理器。鉴于 GNOME、KDE 等桌面环境常使用
networkmanager
来管理网络连接,Xfce 也支持network-manager-applet
作为前端,此包会在安装桌面环境时作为依赖自动安装。俺建议在netctl
被移出base
的当下,使用它来联网。如果想和俺一样使用 Xfce 作为桌面环境,则直接安装
network-manager-applet
pacman -S network-manager-applet
如果使用 GNOME、KDE 等默认使用它的桌面环境,则作为依赖包安装
networkmanager
pacman -S networkmanager --asdeps
安装完成后启用它,下次启动到系统后就会自动启动网络管理服务了。
systemctl enable NetworkManager
此外,关于无线网卡驱动,俺的笔电使用的无线网卡芯片为高通的 BCM43142,不被高通官方开源网卡驱动支持。而官方的专有驱动
wl
则似乎由于知识产权问题,不能由其他组织分发,所以没能被集成在 Linux 操作系统内核自带固件全家桶linux-firmware
中,必须由自行安装。对应的,俺不用安装linux-firmware
似乎也没事:pacman -S broadcom-wl
该驱动有一种可以支持 DKMS 技术、随 Linux 系统内核更新自动适配的版本,怕部分更新而出问题也可以安装 DKMS 版:
pacman -S linux-headers broadcom-wl-dkms
一般来说不需要创建新的 initramfs,除非想要使用 LVM,系统加密,或者 RAID 等进阶技术。
如果您之前没有生成fstab
,希望使用 systemd 来自动挂载 root 等分区,则需要用 systemd init hook。
编辑/etc/mkinitcpio.conf
,在HOOKS
中将base
改为systemd
,并去掉udev
、usr
、resume
。完成后创建新的 initramfs:
mkinitcpio -P
我们可以选择设置 root 账户密码或不设置 root 账户密码,直接创建我们需要的:
passwd
这是重启到新系统前最后的步骤了,以下参考了 Arch 启动过程 #Boot loader 来配置系统的 Boot loader。
如果是在 物理机 上安装,需要先安装 Microcode,以便根据处理器品牌,配置早期微码更新。Intel 处理器的操作如下,Amd 处理器需要将intel
替换为amd
:
pacman -S intel-ucode
虚拟机上 不需要考虑 Microcode
如果希望双启动的,可以用systemd-boot
来控制启动过程;如果不做双启动,可以选择更精简的 EFISTUB 启动方法,并参考 Using UEFI directly 来进行配置。下面先描述 EFISTUB,再描述 systemd-boot。
编写 EFISTUB 启动项的脚本:
-
首先用
exit
命令或者组合键ctrl+d
退出 chroot 环境。 -
创建一个脚本文件来存贮将要执行的一条长命令,方便我们检查和修改参数:
vi efibootmgr.sh
不用 Vi(m)也可以用 Nano 等编辑器或者
cat
、echo
等命令。但之后输入分区 UUID 俺是用 Vi(m)的:read
命令完成的。进入 Vi 后是普通模式。
普通模式下按
h
j
k
l
分别向 ←↓↑→ 移动光标。按i
进入插入模式开始键入文字。按
Esc
从各种模式返回普通模式。普通模式下键入
:
和命令并回车来执行 Vi 命令,例如:q
在未修改文件的情况下退出、:q!
放弃修改并退出、:w
保存、:wq
/:x
保存并退出等。上述:read
也是如此执行。普通模式下键入
dd
来剪切当前行,p
来粘贴,J
(即shift+j
)来将下一行接到当前行末尾。更多 Vi(m) 技巧请您自行了解,不在此赘述。
-
在其中写入如下内容:
将下文
/dev/sda
和1
替换为您的 EFI 系统分区(ESP)的磁盘和分区号。--disk /dev/sda --part 1
对应的是俺之前创建的 ESP——/dev/sda1
。-
虚拟机:
efibootmgr --disk /dev/sda --part 1 --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw initrd=/initramfs-linux.img' --verbose
-
物理机:
多一段启动 Microcode 的
initrd=/intel-ucode.img
efibootmgr --disk /dev/sda --part 1 --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw initrd=/intel-ucode.img initrd=/initramfs-linux.img' --verbose
-
-
root
参数如果之前做好了使用 systemd 自动挂载的准备可以忽略掉,否则,将root=
之后的 PARTUUID 的参数替换成 Linux 文件系统分区(俺这里是/dev/sda2
)的分区 UUID。手动输入比较麻烦,这里俺使用的 Vi(m) 的:read
命令,让 Vi(m) 将:read !
后面的文字当作 Shell 命令执行,并将结果另起一行写在文件中。:read !lsblk -dno PARTUUID /dev/sda2
注意:默认情况下 Vi 会 防止用户使用退格键删除
自动缩进
、换行符
以及进入插入模式时的位置
之前的字符。要么直接在普通模式下用J
(大写 J)将下一行接到当前行末尾,要么临时:set backspace=indent,eol,start
。 -
检查脚本中内容:
cat efibootmgr.sh fdisk -l lsblk -dno PARTUUID /dev/sda2
-
确认无误后,可将该脚本在机器磁盘中备份一份(可选),赋予该脚本可执行权限,并运行:
cp efibootmgr.sh /mnt/home chmod u+x efibootmgr.sh ./efibootmgr.sh
-
再次检查启动项是否配置无误:
efibootmgr --verbose
-
设置启动顺序(可选):
运行完脚本后,efibootmgr 自动将
Arch Linux
项设置为第一启动项,故此步骤可以跳过。efibootmgr -o XXXX,XXXX --verbose
其中 XXXX 即 efibootmgr 的输出中各启动项前的四位数。
俺在笔电上安装时会将 U 盘设为第一项,系统设为第二项,主板固件设置设为第三项。关机之后移除 U 盘便可从硬盘系统启动。之后若无法启动或缺少驱动,下次启动前插入 U 盘便能进入安装环境进行急救。确认启动正常后,可用
systemctl reboot --firmware-setup
重启到主板设置或者直接用 efibootmgr 将系统启动项调回第一项。
[systemd-boot 启动](https://wiki.archlinux.org/title/Systemd-boot]其实很简单,而且也支持启动时选择进入 Windows 或者主板设置。
bootctl install
之后进行配置。先创建启动项,可以拷贝参考样例:
cp /usr/share/systemd/bootctl/arch.conf /boot/loader/entries
再将拷贝来的文件中的options
行删掉,在initrd /initramfs-linux.img
行之前加上载入 ucode 的配置(如是 amdcpu 则将 intel 改为 amd):
initrd /intel-ucode.img
最后是这样的:
title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
保存以后可以继续编写 systemd-boot 本身的配置/boot/loader/loader.conf
,不过其实没啥重要的,全删了用默认值也没问题。
-
用组合键
ctrl+d
或者命令退出 chroot 环境:exit
-
卸载文件系统(可选):
umount -R /mnt
如果文件系统正处于使用中,可以用 fuser(1) 找到。
-
关机:
shutdown now
所有仍然挂载的文件系统会被
systemd
自动卸载。移除安装介质:
-
再次启动并用设置好的密码登录 root 账户后,终于进入了 Arch Linux。
至此,我们便可以在 Hyper-V 虚拟机 / 物理机中运行最小化、可联网的 Arch Linux 系统。可以关机稍作休息,择时进行后续配置过程。
您可以进一步参考官方推荐的安装完成后的操作。包括但不限于:
- 创建用户账户、配置
sudo
- 安装蓝牙、显卡等的闭源驱动
- 配置无线网络连接
- 安装桌面环境
俺也会在之后 Arch 新机用上 Google 一文中继续记录俺进一步折腾系统到可以用搜索引擎查资料的程度的步骤,详情请移步后文。