ThinkPad X220上运行Arch Linux

ThinkPad X220上运行Ubuntu 一段时间后,感觉还有一些不满意:主要是 ThinkPad X220笔记本 对Linux非常友好,能够hack BIOS释放更大性能,可玩性高,所以权衡之后,转为采用arch linux来运行底层操作系统,部署了桌面系统作为个人开发平台。

当然,Ubuntu对商业软件支持更为完善,对于生产系统,还是建议使用Ubuntu,或者更为保守稳定的RHEL。

安装

  • 创建安装U盘:

    hdiutil convert -format UDRW -o archlinux-2019.09.01-x86_64.img archlinux-2019.09.01-x86_64.iso
    sudo dd if=archlinux-2019.09.01-x86_64.img.dmg of=/dev/rdisk3 bs=10m
    
  • 通过U盘启动

启动后进入的是字符终端,安装方式类似Gentoo。

无线网络设置

注解

Arch Linux安装需要网络,通常建议先通过有线网络连接Internet来完成安装过程。不过,我的工作环境没有有线,所以先设置无线网络。

注解

默认Linux内核是模块华的,硬件的设备驱动作为内核模块保存在硬盘上。当操作系统启动时udev会根据硬件加载不同的驱动模块,这就创建了需要的网络接口。有些无线芯片需要额外的固件(firmware),则默认安装的 linux-firmware 包含了很多固件支持。虽然udev能自动加载内核模块,但是也有一些内核模块需要手动安装,如果加载了互相冲突的模块,则需要屏蔽掉不需要的模块。

安装无线软件包 wireless_tools 可以提供 iwconfig 命令

  • 检查网络接口名称:

    iwconfig
    

可以看到如下输出:

wlp3s0   IEEE 802.11   ESSIID:off/any
         ...
  • 激活无线网卡:

    ip link set wlp3s0 up
    
  • 搜索可用的无线网络:

    iwlist wlp3s0 scan | less
    
  • 检查兼容网卡:

    lspci -k
    

可以看到内核加载了无线网卡的模块

设置无线的简易方法:wifi-menu

Arch Linux提供了一个字符终端设置无线的交互工具 wifi-menu ,直接执行这个命令可以打开 ncurse 控制台图形界面,非常方便使用。

设置无线的复杂方法:netctl

  • 进入 netctl 案例目录:

    cd /etc/netctl/examples
    cp /etc/netctl/examples/wireless-wep /etc/netctl/home
    

这里 home 是profile名字。

  • 修改profile文件 /etc/netctl/home ,主要修订 Interface 和 SSID 以及密钥

  • 启动无线网络连接:

    netctl start home
    

准备工作

  • 更新系统时钟:

    timedatectl set-ntp true
    
  • 磁盘分区:

    parted /dev/sda
    

注解

  • /dev/sda1 划分为 EFI系统分区,大小 260-512MB
  • /dev/sda2 根分区,大小50GB
  • 格式化分区:

    mkfs.ext4 /dev/sda2
    
  • 挂载文件系统:

    mount /dev/sda2 /mnt
    mkdir /mnt/boot
    mount /dev/sda1 /mnt/boot
    

安装

  • 选择镜像网站

arch linux的镜像网站定义在 /etc/pacman.d/mirrorlist 。在这个定义文件中,越靠前的网站优先级越高,所以建议将地理位置最近的网站列到最前面。例如,在中国,可以选择163镜像网站。

  • 安装基本软件包:

    pacstrap /mnt base linux linux-firmware
    

配置

  • fstab

生成fstab文件(这里 -U-L 定义UUID或labels):

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

将根修改到新系统:

arch-chroot /mnt
  • 设置时区:

    ln -sf /usr/share/zoneinifo/Assia/Shanghai /etcc/localtime
    

运行 hwclock 生成 /etc/cadjtime

hwclock --systohc
  • 本地化语言支持 - 只需要UTF支持就可以,所以修改 /etc/locale.gen 保留 en_US.UTF-8 UTF-8 然后执行:

    locale-gen
    

创建 locale.conf 设置如下:

LANG=en_US.UTF-8

网络配置

  • 创建 /etc/hostname 文件,内容是主机名:

    zcloud
    
  • 编辑 /etc/hosts

    127.0.0.1    localhost
    127.0.1.1    zcloud.huatai.me  zcloud
    

Initramfs

通常不需要创建新的 initramfs ,因为在执行 pacstrap 命令安装linux软件包的时候已经执行过 mkinitcpio 。不过,对于LVM, 系统加密 或者 RAID ,则需要修改 mkinitcpio.conf 然后创建 initramfs 镜像:

mkinitcpio -p linux

Root密码及用户账号

  • 设置root密码:

    passwd
    
  • 设置日常账号:

    group add -g 20 staff
    useradd -g 20 -u 501 -d /home/huatai -m huatai
    passwd huatai
    
  • 设置sudo:

    pacman -S sudo
    echo "huatai   ALL=(ALL:ALL) NOPASSWD:ALL" >> /etc/sudoers
    

安装Boot Loader

注解

请参考 EFISTUB ,我这里采用了将 ESP 分区挂载到 /boot 目录,直接使用 EFISUB 就不需要安装bootloader。

如果要使用常规的boot loader,例如GRUB,则需要将 ESP 分区挂载到 /efi 目录。

详细请参考 EFI system partition - Mount the partitioon

待实践,通常应该是:

pacman -S grub
grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB
grub-mkconfig -o /boot/grub/grub.cfg

由于我使用EFISTUB直接启动内核,所以不需要安装boot loader,目前这步跳过。

使用EFISTUB启动

  • 安装 efibootmgr

    pacman -S efibootmgr
    

参考 EFISTUB - Using UEFI directly 执行如下命令:

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

注解

PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 设置PARTUUID参数请检查 ls -lh /dev/disk/by-partuuid/ 目录下设备文件的软链接,可以找到对应磁盘 /dev/sda1 的 PARTUUID。请注意,PARTUUID和磁盘UUID不同,在 /etc/fstab 中使用的是UUID。

警告

这里存在一个问题,就是arch linux不能识别ESP分区的vfat文件系统,启动时候会报错 mount: /new_root: unknown filesystem type 'vfat' 。原因是我将VFAT的分区 /etc/sda1 作为 /boot ,但是默认安装的内核是没有带有VFAT模块。

解决方法参考 Minimal initramfs 修改添加vfat模块以及对应的fsck工具(我这里也添加了btrfs,以便后续使用btrfs数据盘。注意需要安装对应的fsck工具)

MODULES=(vfat btrfs)
BINARIES=(fsck fsck.ext2 fsck.ext3 fsck.ext4 e2fsck fsck.vfat fsck.msdos fsck.fat fsck.btrfs)

安装fsck工具:

pacman -S dosfstools btrfs-prog

生成新的initramfs:

mkinitcpio -P
  • 设置以后检查启动项:

    efibootmgr --verbose
    
  • 设置启动顺序:

    efibootmgr --bootorder XXXX,XXXX --verbose
    

这里 xxxx,xxxx 是刚才 efibootmgr --verbose 输出的每个启动项的编号。

  • 重启系统

使用exit或者ctrl-d命令chroot环境,然后 umount -R /mnt ,最后输入 reboot 命令重启系统。

安装必要软件包

  • 为方便工作,安装以下软件包:

    pacman -S sudo screen wpa_supplicant \
      firefox midori parole \
      ristretto leafpad keepassxc
    

注解

firefox虽然没有chromium(chrome)速度快,但是相对节约资源,并且随着版本迭代,速度已经基本和chrome接近。并且插件丰富,可以实现很多的功能,也是开发web应用的利器。

midori是Xfce4平台支持的浏览器开源项目,内核采用webkit,非常轻量级,作为主要的工作浏览器。(Xfce4修改默认浏览器方法: Settings -> Settings Manager -> Preferred Applications )

parole是Xfce4推荐的媒体播放器。

ristretto和leafpad是Xfce4平台支持的轻量级图片浏览和文本编辑器。

KeePassX在Linux平台需要安装mono实在太沉重,所以替换成社区版本到KeePassXC,不过不能打开KeePassX的最新割舍密码库文件,所以采用先从KeePassX导出CSV文件,然后导入到KeePassXC中使用。

  • 升级系统:

    sudo pacman -Syu
    

公司802.1X无线网络

注解

个人实践发现,802.1X设置相对比较复杂,虽然能够通过命令行和配置文件实现,例如使用nmcli或netctl结合wpa_supplicant完成配置。但是,实际上协议分为很多种加密和认证类别,命令行配置需要花费很多时间尝试。即使我之前配置过很多次,依然发现在配置中遇到很多挫折。

推荐采用 NetworkManager 来完成配置,兼容性和易用性非常好。虽然wicd更为轻量,但是我发现wicd强制需要提供详细的WPA/WEP协议细节,反而非常难以匹配环境。实际上,最终我采用NetworkManager一次配置成功。

netctl命令行配置网络

参考 Getting wired internet with 802.1X security running at install

  • 创建 /etc/netctl/office 配置文件,认证信息采用 wpa_supplicant

    Description="802.1X wireless connection"
    Interface=wlp3s0
    Connection=wireless
    
    IP=dhcp
    Auth8021X=yes
    WPAConfigFile=/etc/wpa_supplicant/wpa_supplicant-office.conf
    
  • 创建 /etc/wpa_supplicant/wpa_supplicant-office.conf 配置文件包含认证信息:

    ctrl_interface=/var/run/wpa_supplicant
    ap_scan=0
    network={
      key_mgmt=IEEE8021X
      eap=TTLS
      identity="email address"
      password="password"
      phase2="autheao=MSCHAPV2"
    }
    
  • 然后通过netctl启动无线网络:

    sudo netctl start office
    

就可以连接802.1X认证网络。

wicd设置网络

参考 Arch Linux 文档 - wicd

Xfce虽然没有提供默认的网路管理工具,但是结合轻量级wicd管理工具非常容易设置。

  • 安装:

    sudo pacman -S wicd wicd-gtk
    
  • 将用户加入到users组:

    sudo gpasswd -a USERNAME users
    
  • 启动wicd:

    sudo systemctl start wicd
    sudo systemctl enable wicd
    
  • 启动客户端:

    wicd-client
    

也可以启动到通知栏:

wicd-client --tray

NetworkManager设置网络

参考 Arch Linux 文档 - NetworkManager

  • 安装NetworkManager:

    sudo pacman -S networkmanager network-manager-applet
    
  • 激活NetworkManager:

    sudo systemctl start NetworkManager
    sudo systemctl enable NetworkManager
    
  • 重新登陆xfce图形桌面,会看到自动启动NetworkManager Applet,则在托盘可以看到图标,配置交互方式完成,EASY

图像界面

  • 安装显卡驱动(虽然没有选择mesa 3D支持但是依然会安装):

    sudo pacman -S xf86-video-intel
    
  • 安装 xorg-server (没选安装 xorg 是为了降低软件包):

    sudo pacman -S xorg-server
    

注解

参考 arch linux文档 - Xorg