0 准备

准备安装镜像,创建磁盘:

1
qemu-img create -f qcow2 archlinux.qcow2 20G

从光盘启动虚拟机:

1
qemu-system-x86_64 -hda archlinux.qcow2 -boot d -cdrom archlinux-2022.02.01-x86_64.iso -m 8192 -smp 8

没有使用UEFI,采用Legacy BIOS启动。

1 安装

从光盘启动后进入iso,检查网络:

1
ping archlinux.org

没有问题,使用reflector更新一下镜像列表,可以cat一下/etc/pacman.d/mirrorlist验证一下:

1
reflector -c china -a 10 --sort rate --save /etc/pacman.d/mirrorlist

使用fdisk -l看下硬盘,发现虚拟硬盘的设备名是/dev/sda。使用fdisk /dev/sda启动fdisk

m查看帮助,按照帮助操作。分一个swap分区和一个/即可。

分完后按w保存,可以lsblk验证一下。这里分了19G的/dev/sda1和1G的/dev/sda2。对它们初始化:

1
2
mkfs.ext4 /dev/sda1
mkswap /dev/sda2

将根分区挂载到/mnt,之后会chroot到/mnt下面;启动swap分区:

1
2
mount /dev/sda1 /mnt
swapon /dev/sda2

在挂载的根目录下安装系统(如果是真机,还要安装linux-firmware包):

1
pacstrap /mnt base linux vim

2 配置

为新系统生成fstab文件:

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

进入新系统,arch-chroot会打开新系统下的/bin/bash

1
arch-chroot /mnt

设置时区,并同步硬件时钟:

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

设置主机名:

1
echo "yourhostname" > /etc/hostname

修改host文件(why?)

1
2
3
127.0.0.1        localhost
::1 localhost
127.0.1.1 myhostname

设置root密码:

1
passwd

安装和配置grub,ref

1
2
3
pacman -S grub
grub-install --target=i386-pc /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

退出新系统,取消挂载并关机:

1
2
3
exit
umount /mnt
shutdown now

3 进入新系统

去掉qemu启动选项里的-boot-cdrom,从硬盘启动进入新系统:

1
qemu-system-x86_64 -hda archlinux.qcow2 -m 8192 -smp 8

不出意外,此时应该网络不通,需要启动network manager。用自带的systemd-networkd就好。

1
2
systemctl enable systemd-networkd.service
systemctl enable systemd-resolved.service

找到网卡的名字,这里是ens3

1
networkctl -l

编辑/etc/systemd/network/20-wired.network,Name填入网卡名:

1
2
3
4
5
[Match]
Name=ens3

[Network]
DHCP=yes

重启后可以使用网络。

创建普通用户,放进wheel用户组从而可以使用sudo

1
useradd -m -G wheel yourusername

设置密码:

1
passwd yourusername

安装sudo,并开启wheel用户组的sudo权限:

1
2
3
pacman -S sudo
EDITOR=vim visudo
# 去掉某个注释,看文件里的提示

4 杂项

带--nographic参数启动qemu

ref

需要关闭grub的graphical terminal:取消注释/etc/default/grubGRUB_TERMINAL_OUTPUT=console一行

重定向guest kernel的输出到第一个串口:/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT追加console=ttyS0

更新grub:grub-mkconfig -o /boot/grub/grub.cfg

将虚拟机的串口重定向到host上的qemu monitor:qemu启动参数增加-serial mon:stdio