+++ date = '2025-12-12T11:08:46+08:00' draft = false title = 'macOS下基于QEMU的Arch Linux (aarch64)简易安装教程' description = '树洞#7876708' license = 'MIT Licence' categories = 'instructions' tags = ['技术栈'] +++ # QEMU安装测试Arch Linux (aarch64) 测试环境:macOS Tahoe 26.0.1 测试设备:MacBook Air (M3) ## 需要下载的文件: - ArchLinuxARM-aarch64-latest.tar.gz镜像(不能直接启动) - alpine-standard-3.23.0-aarch64.iso(可启动) - QEMU_EFI.fd(如果curl下载下来文件不是2MB左右大小,可手动访问指令中的地址下载,或者使用[本文件](QEMU_EFI.fd)) - macOS系统中:终端输入: ```zsh curl -o ~/Downloads/ArchLinuxARM-aarch64-latest.tar.gz https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/os/ArchLinuxARM-aarch64-latest.tar.gz curl -o ~/Downloads/alpine-standard-3.23.0-aarch64.iso https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.23/releases/aarch64/alpine-standard-3.23.0-aarch64.iso curl -o ~/QEMU_EFI.fd https://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd ``` ## 准备QEMU虚拟机环境: - 安装QEMU本体: > 如果你还没有安装homebrew:终端输入: > `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"` ```zsh brew install qemu ``` - 创建磁盘文件:(目录是你的当前用户文件夹,要记住,否则找不到o(^▽^)o) ```zsh qemu-img create test.raw 20G ``` - 写入分区表: ```zsh gdisk test.raw << 'EOF' o Y n 1 +512M EF00 n 2 8300 w Y EOF ``` - 检查分区表: ```zsh gdisk test.raw <<'EOF' p EOF ``` > 理想情况显示: > ``` > Number Start (sector) End (sector) Size Code Name > 1 2048 1050623 512.0 MiB EF00 EFI system partition > 2 1050624 41940991 19.5 GiB 8300 Linux filesystem) > ``` - 转换为qcow2文件(省空间) ```zsh qemu-img convert -f raw -O qcow2 test.raw test.qcow2 ``` 得到约524KB的test.qcow2 - 配置适当启动参数:(提示:如果你的设备内存≤16GB,不建议分配8GB内存给虚拟机,实际上2GB完全可以运行,记得修改) ```zsh qemu-system-aarch64 \ -accel hvf -cpu host -smp 4 \ -M virt \ -m 8G \ -nographic \ -device virtio-net-pci,netdev=net \ -netdev user,id=net,hostfwd=tcp::2222-:22 \ -cdrom ~/Downloads/alpine-standard-3.23.0-aarch64.iso \ -bios QEMU_EFI.fd \ -drive file=test.qcow2,if=virtio ``` ## 进入Alpine Linux 启动后,输入root回车,登录; - 启用ext4文件系统相关操作: ```bash apk add e2fsprogs ``` - 查看磁盘: ```bash fdisk -l ``` > 从输出中记下要安装到哪个磁盘:369M的vda是Alpine的CDROM,不是目标磁盘,应该选择另一个:vdb(这和下面大部分命令都有关,如果你不是vdb,建议依次command+F搜索并替换:vdb1->[你的磁盘名]1 vdb2->[你的磁盘名]2。还挺精准,不会改乱。)(数字一般不变,1是EFI引导分区,2是安装目录) > 示例输出: > ``` > Found valid GPT with protective MBR; using GPT > > Disk /dev/vda: 756096 sectors, 369M > Logical sector size: 512 > Disk identifier (GUID): 35323032-3231-4330-b130-303534383230 > Partition table holds up to 248 entries > First usable sector is 64, last usable sector is 756032 > > Number Start (sector) End (sector) Size Name > 1 64 811 374K Gap0 > 2 812 3691 1440K EFI boot partition > 3 3692 756031 367M Gap1 > Found valid GPT with protective MBR; using GPT > > Disk /dev/vdb: 41943040 sectors, 0 > Logical sector size: 512 > Disk identifier (GUID): c3685d8f-206c-4491-98c8-61ed4f05c173 > Partition table holds up to 128 entries > First usable sector is 34, last usable sector is 41943006 > > Number Start (sector) End (sector) Size Name > 1 2048 1050623 512M EFI system partition > 2 1050624 41940991 19.4G Linux filesystem > ``` - 创建文件系统: ```bash mkfs.ext4 /dev/vdb2 ``` (或者强制:`mkfs.ext4 -F /dev/vdb2`) - 检查文件系统: ```bash fsck.ext4 -f /dev/vdb2 apk add e2fsprogs e2fsprogs-extra dumpe2fs /dev/vdb2 | head -20 blkid /dev/vdb2 ``` (最后一个命令输出示例:`/dev/vdb2: UUID="b21052d5-7608-493e-9d52-ff7259f68f1f" TYPE="ext4"`) - 格式化EFI分区: ```bash mkfs.vfat -F32 /dev/vdb1 ``` - 挂载2个分区:(这里很坑!需要用这个命令,否则`Invalid Argument`) ```bash mount -t ext4 -o defaults,errors=remount-ro /dev/vdb2 /mnt mkdir /mnt/boot mount /dev/vdb1 /mnt/boot/ ``` - 先启动网络: ```bash ip link set eth0 up udhcpc -i eth0 ``` - 在Alpine中启动SSH,传Arch Linux镜像: ```bash apk add openssh openssh-client echo "PermitRootLogin yes" >> /etc/ssh/sshd_config ``` - 设置密码(要输两遍,输入完就回车,不会显示)(`Bad password`不用管,继续输): ```bash passwd root /etc/init.d/sshd start ``` - 检查虚拟机ssh是否在端口22监听:(有ssh字样就是) ```bash netstat -tlnp | grep :22 ``` - 然后在macOS另一个终端:(按⌘+N新建终端) ```zsh scp -P 2222 ~/Downloads/ArchLinuxARM-aarch64-latest.tar.gz root@localhost:/root/ ``` > 如果有`WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!`: > 使用`ssh-keygen -R "[localhost]:2222"`清除密钥; - 回到Alpine,检查文件是否传输成功: ```bash ls -lh /root/ArchLinuxARM-aarch64-latest.tar.gz cd /mnt ``` - 移动到当前工作目录: ```bash mv /root/ArchLinuxARM-aarch64-latest.tar.gz ./ ``` - 检查当前目录 ```bash pwd ls -lh ``` - 解压: ```bash tar -xzf ArchLinuxARM-aarch64-latest.tar.gz ``` - 挂载必要的虚拟文件系统: ```bash mount -t proc /proc /mnt/proc mount -t sysfs /sys /mnt/sys mount --rbind /dev /mnt/dev mount --rbind /run /mnt/run ``` - 复制 DNS 配置: ```bash cp /etc/resolv.conf /mnt/etc/resolv.conf ``` - 设置主机名:(`arch-vm`字样可自由修改) ```bash echo "arch-vm" > /mnt/etc/hostname ``` - 切换到新系统 ```bash chroot /mnt /bin/bash ``` - 创建fstab文件: 1. 获取分区UUID: ```bash BOOT_UUID=$(blkid -s UUID -o value /dev/vdb1) ROOT_UUID=$(blkid -s UUID -o value /dev/vdb2) ``` 2. 创建fstab文件 ```bash cat > /etc/fstab << EOF # Static information about the filesystems. # See fstab(5) for details. # UUID=${ROOT_UUID} / ext4 defaults,noatime 0 1 UUID=${BOOT_UUID} /boot vfat defaults,noatime 0 2 EOF ``` 3. 检查创建的fstab:(确认每个UUID后面都有值!没有的话看看EFI和主分区有没有挂载) ```bash cat /etc/fstab ``` > 示例: > ``` > # Static information about the filesystems. > # See fstab(5) for details. > > # > UUID=38c55c13-8929-4f15-aa41-4091a976f413 / ext4 defaults,noatime 0 1 > UUID=693A-FE3A /boot vfat defaults,noatime 0 2) > ``` - 设置时区: ```bash ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ``` - 设置硬件时钟: ```bash hwclock --systohc ``` - 设置root密码(要记住!): ```bash passwd ``` - (可选)创建普通用户(`archuser`字样可自由修改): ```bash useradd -m -G wheel -s /bin/bash archuser passwd archuser ``` - 配置sudo: ```bash echo "wheel ALL=(ALL) ALL" >> /etc/sudoers ``` - 启用`systemd-networkd`(网络相关服务): ```bash systemctl enable systemd-networkd systemctl enable systemd-resolved ``` - 配置网络接口 ```bash cat > /etc/systemd/network/20-eth0.network << EOF [Match] Name=eth0 [Network] DHCP=yes EOF ``` - 添加**清 华 大 学**开源软件镜像站 ```bash echo 'Server = http://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/$arch/$repo' > /etc/pacman.d/mirrorlist ``` - 更新包数据库: ```bash pacman -Sy ``` - 初始化密钥环: ```bash pacman-key --init ``` - 填充 Arch Linux ARM 密钥: ```bash pacman-key --populate archlinuxarm ``` - 安装 GRUB: ```bash pacman -S grub efibootmgr ``` - 安装 GRUB 为可移动媒体(正常安装老失败,这样效果一样): ```bash grub-install --target=arm64-efi --efi-directory=/boot --bootloader-id=GRUB --removable ``` - 生成配置: ```bash grub-mkconfig -o /boot/grub/grub.cfg ``` - 检查: ```bash head -20 /boot/grub/grub.cfg ``` > 示例: > ``` > # > # DO NOT EDIT THIS FILE > # > # It is automatically generated by grub-mkconfig using templates > # from /etc/grub.d and settings from /etc/default/grub > # > > ### BEGIN /etc/grub.d/00_header ### > insmod part_gpt > insmod part_msdos > if [ -s $prefix/grubenv ]; then > load_env > fi > > if [ "${env_block}" ] ; then > set env_block="(${root})${env_block}" > export env_block > load_env -f "${env_block}" > fi > ``` - 安装内核: ```bash pacman -S linux-aarch64 ``` - 查找内核文件: ```bash find /boot -name "*initramfs-linux.img*" -o -name "*Image*" ``` - 创建 GRUB 内核配置: ```bash ROOT_UUID=$(blkid -s UUID -o value /dev/vdb2) cat > /boot/grub/grub.cfg << EOF set default=0 set timeout=5 insmod part_gpt insmod ext2 insmod fat menuentry "Arch Linux ARM" { linux /Image root=UUID=$ROOT_UUID rw quiet initrd /initramfs-linux.img } menuentry "Arch Linux ARM (fallback)" { linux /Image root=UUID=$ROOT_UUID rw quiet initrd /initramfs-linux-fallback.img } EOF ``` - 检查:要确保UUID有值! ```bash cat /boot/grub/grub.cfg ``` > 示例: > ``` > set default=0 > set timeout=5 > > insmod part_gpt > insmod ext2 > insmod fat > > menuentry "Arch Linux ARM" { > linux /Image root=UUID=38c55c13-8929-4f15-aa41-4091a976f413 rw quiet > initrd /initramfs-linux.img > } > > menuentry "Arch Linux ARM (fallback)" { > linux /Image root=UUID=38c55c13-8929-4f15-aa41-4091a976f413 rw quiet > initrd /initramfs-linux-fallback.img > } > ``` - 安装基本工具(可选) ```bash pacman -S sudo vim git wget curl ``` - 完成: ```bash exit ``` - 把窗口关掉。 ## 启动Arch Linux(使用新指令) - macOS终端输入: ```zsh qemu-system-aarch64 \ -accel hvf -cpu host -smp 4 \ -M virt \ -m 8G \ -nographic \ -device virtio-net-pci,netdev=net \ -netdev user,id=net,hostfwd=tcp::2222-:22 \ -bios QEMU_EFI.fd \ -drive file=test.qcow2,if=virtio ``` > 显示示例: > ``` > GNU GRUB version 2:2.14rc1.r54.g29f3131a-2 > > /----------------------------------------------------------------------------\ > |*Arch Linux ARM | > | Arch Linux ARM (fallback) | > | | > | | > | | > | | > | | > | | > | | > | | > | | > | | > | | > \----------------------------------------------------------------------------/ > > Use the ^ and v keys to select which entry is highlighted. > Press enter to boot the selected OS, `e' to edit the commands > before booting or `c' for a command-line. > ``` - 会自动引导系统; 输入root回车; 输入密码进入系统; 此时系统已联网,可以通过pacman自由安装软件。 ## 附: - 磁盘扩容:macOS终端输入: ```zsh qemu-img resize test.qcow2 +10G ``` 可以增加10GB存储空间。 - 静默启动: 启动参数中`-nographic`换为 ```zsh -daemonize \ -display none ``` 注意每个`\`后面不能有空格。 - 完整启动脚本示例:`启动Arch Linux_静默.sh` - 提示: - 如果你的设备内存≤16GB,不建议分配8GB内存给虚拟机,实际上2GB完全可以运行,记得修改; - `echo`字样的指令为提示信息,无实际作用; ```bash #!/bin/bash echo "================================" echo " Arch Linux ARM 虚拟机(静默启动)" echo "================================" echo "" echo "连接信息:" echo " SSH地址: localhost:1123" echo " 用户名: root" echo " 密码: 0000" echo " 用户名: archuser" echo " 密码: 0000" echo "" echo "================================" echo " SSH使用提示: " echo "================================" echo "# 启动 SSH 服务" echo "systemctl start sshd" echo "systemctl enable sshd" echo "" echo "# 检查服务状态" echo "systemctl status sshd" echo "" echo "# 允许 root 登录(如果需要)" echo "echo \"PermitRootLogin yes\" >> /etc/ssh/sshd_config" echo "" echo "# 重启 SSH 服务" echo "systemctl restart sshd" echo "" echo "# 重新生成 systemd 配置" echo "systemctl daemon-reload" echo "" echo "直接访问Arch Linux:macOS终端输入:" echo "ssh -p 1123 root@localhost" echo "" echo "# 文件传输(macOS终端)" echo "scp -P 1123 [本地文件] root@localhost:[远程路径]" echo "scp -P 1123 root@localhost:[远程文件] [本地路径]" echo "目录请使用:scp -P 1123 -r [本地目录] root@localhost:[远程路径]" echo "一键同步文件夹:rsync -rlptvz -e \"ssh -p 1123\" --no-owner --no-group ~/arch_share/ root@localhost:/hostshare/" echo "" echo "重置连接密钥:" echo "ssh-keygen -R \"[localhost]:1123\"" echo "" echo "在macOS终端使用" echo "socat TCP6-LISTEN:1124,reuseaddr,fork TCP4:127.0.0.1:1123 &" echo "socat TCP6-LISTEN:1123,reuseaddr,fork TCP4:127.0.0.1:1124 &" echo "来使得虚拟机服务器可被外部IPv6访问" echo "Arch Linux启动中..." echo "等待3–5秒,系统引导完成后,即可使用Visual Studio Code进行SSH访问。" echo "要停止虚拟机运行,可以使用远程终端输入shutdown now,或者直接在活动监视器中结束qemu-system-aarch64进程。" qemu-system-aarch64 \ -accel hvf \ -cpu host \ -smp 4 \ -M virt \ -m 8G \ -device virtio-net-pci,netdev=net,mac=52:54:00:12:34:56 \ -netdev user,id=net,hostfwd=tcp::1123-:22,hostfwd=tcp::1124-:8080 \ -bios QEMU_EFI.fd \ -drive "file=arch.qcow2,if=virtio,media=disk" \ -daemonize \ -display none ``` 在文本编辑器中完成编辑后,保存到`test.qcow2`和`QEMU_EFI.fd`的相同目录,再使用`chmod +x 启动Arch Linux_静默.sh`使文件可执行。 - DeepSeek小提示: 1. **安全性**:文档中启用了root SSH登录,生产环境应禁用; 2. **密码强度**:建议使用更强的密码; 3. **磁盘空间**:20G对于开发环境可能足够,但长期使用建议更大;