Install Arch Linux on a USB Key

前些天学校发了一个 2GB 大小的 U 盘,这样一来我手上就多了个 U 盘。我就把原来的一个 16GB 的 Kingston USB Data Traveler 腾了出来,打算装个 Arch Linux 在上面随带随用。Arch 的安装教程网上也是多不胜数了,个人觉得写得比较好的是这个 给 Linux 萌新的 Arch 安装指南 . 本文下面的记录与这个指南大体相同,只是增加了一些个人需要的东西。

前期准备

1 . 挂载 Arch ISO 和 USB Key 设备到虚拟机上,启动进入 Arch Live CD。

2 . 划分分区。我手上这个 U 盘已经被格式化过了,大小是 14.6 G。执行 lsblk -f 查看是哪一个设备,在我的虚拟机里显示是 /dev/sdb。 执行 cgdisk /dev/sdb 进行分区。我需要划分一个 EFI 分区和一个文件系统区。如果需要重新分区,可以直接在 cgdisk 里进行删除和划分。我需要进行两次新建操作。每次新建操作会询问四个问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下面的数字是我 U 盘的情况
# 起始扇区的位置,一般不作修改
First sector (2048-30736350, default = 2048):
# 分区大小,可以
Size in sectors or {KMGTP} (default = 30734303):100MB
# 分区类型,默认为 Linux 文件系统,EFI 分区代码 ef00,交换空间分区代码 8200
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): ef00
# 卷标,可留空
Current partition name is ''
Enter new partition name, or <Enter> to use the current name: EFI

3 . 在 U 盘上创建文件系统并挂载到当前系统。由于我是先创建 EFI 分区再创建主文件系统的,所以我需要依次执行如下命令:

1
2
3
4
5
6
mkfs.vfat /dev/sdb1 # 为 /dev/sdb1 建立 EFI 分区
mkfs.ext4 /dev/sdb2 # 为 /dev/sdb2 建立 ext4 分区
mount /dev/sdb2 /mnt # 挂载主文件系统
mkdir /mnt/boot # 挂载 EFI 分区的文件夹
mount /dev/sdb1 /mnt/boot # 挂载 EFI 分区

4 . 修改软件源。用你惯用的编辑器(nano/vim/emacs/…)打开 /etc/pacman.d/mirrorlist,将你想要的 Server 地址写在最前面。大陆用户一般使用如下几个镜像源:

1
2
3
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch # 清华大学 TUNA 协会
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch # 中科大
Server = http://mirrors.163.com/archlinux/$repo/os/$arch # 网易

由于我们学校有一个镜像源,我就选了我们学校的:Server = http://www.gtlib.gatech.edu/pub/archlinux/$repo/os/$arch。修改完成以后执行 pacman -Syy 更新软件源信息。

安装基本系统

5 . 安装基本包。其中 iw dialog wpa_supplicant wpa_actiond 这几个包最好先装上,因为是连接无线网络需要用到的。networkmanager 是用于管理网络的包,vim 是我使用的编辑器,zsh 是我使用的 shell。

1
pacstrap /mnt base base-devel iw dialog wpa_supplicant wpa_actiond vim zsh htop git networkmanager wget ntp

6 . 生成 fstab。执行以下命令:genfstab -U /mnt >> /mnt/etc/fstab-U 参数表示使用 UUID 进行标识,由于我需要从 U 盘上启动系统,这个选项是必不可少的。

7 . chroot 到新系统中:arch-chroot /mnt /bin/bash

8 . 修改时区与语言设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/US/Eastern /etc/localtime
# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime <--- 中国用户
# 用编辑器打开 /etc/locale.gen,在顶部填入如下两行,打开简体中文和英文的本地化选项
en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
# 保存以后执行
locale-gen
# 设置系统语言为英文,以避免终端和 Log 输出乱码:
echo LANG=en_US.UTF-8 > /etc/locale.conf
# 打开网络管理服务(以自动获取IP,注意 N M 大写)和 NTP 网络时间服务
systemctl enable NetworkManager ntpd

9 . 设置主机名、root 密码并创建新用户。

1
2
3
4
5
6
7
echo USBArch > /etc/hostname
passwd # 注意,现在应该是 [[email protected]],所以这个是设置 root 密码的操作
useradd -m -s /bin/zsh eh # 创建新用户 eh,并且使用 /bin/zsh 作为默认 shell
passwd eh # 修改 eh 用户的密码
visudo # 将 eh 设置为 sudoer
# 在 root ALL=(ALL) ALL 下面加一行 eh ALL=(ALL) ALL

10 . 安装 UEFI 引导
我用 GRUB 来进行引导。先安装需要的包:

1
pacman -S efibootmgr dosfstools grub os-prober

然后向 U 盘中安装 GRUB:

1
2
3
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck --removable
# efi-directory 对应 /mnt/boot,现在已经 chroot 到 /mnt 了
# 由于是安装在 U 盘,所以一定要加上 --removable 参数

生成必要的配置文件:

1
2
3
4
5
# 抄一句 Arch Wiki 里的话,我经常漏了导致失败的:
# 用 mkinitcpio -p linux 创建 RAM Disk 前,修改 /etc/mkinitcpio.conf,
# 将 block 添加到紧挨 udev 的后面. 只有这样早期用户空间才能正确的装入模块。
mkinitcpio -p linux
grub-mkconfig -o /boot/grub/grub.cfg

安装桌面系统

11 . 安装图形界面

1
2
3
4
# 安装 xorg, Dolphin(文件管理器),Kate(文字编辑器)和 Konsole(终端模拟器)
pacman -S xorg plasma dolphin kate konsole sddm kde-l10n-zh_cn
# 如果需要直接启动到图形界面,可以执行 systemctl enable sddm

12 . 安装中文字体

1
2
3
4
# 三者选其一应该就可以了
pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji # Google Noto 系列
pacman -S wqy-microhei wqy-zenhei # 文泉驿
pacman -S adobe-source-han-sans-otc-fonts # 思源黑体

此时可以重启,直接进入装好的系统中。

13 . 安装一些我需要用到的包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 安装 yaourt 额外包管理器
# 编辑 /etc/pacman.conf, 加入如下三行
# [archlinuxfr]
# SigLevel = Never
# Server = http://repo.archlinux.fr/$arch
# 然后执行
sudo pacman -Sy yaourt
# 安装一些我需要的包
sudo pacman -S filezilla notepadqq htop thunderbird gcc-fortran gnupg
# 安装 Google Chrome
yaourt -S google-chrome
# 安装 oh-my-zsh
sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

14 . 为 zsh 处理 Home, End, Del 无响应的问题。先运行 cat,然后依次按这几个键,会见到形如 ^[[2~ 这样的输出,^[[2~ 就是按下的键对应的键位符。在我的机器上,我需要在用户主目录的 zshrc 文件 /home/eh/.zshrc 里加入如下几行设置:

1
2
3
bindkey "^[[1~" beginning-of-line
bindkey "^[[4~" end-of-line
bindkey "^[[3~" delete-char