分类
碎碎念

将 Arch Linux 安装到你的 Oracle Cloud

由于 CentOS Stream 8 即将停止维护,想着干脆把手头上所有 Oracle Cloud 服务器都切换为 Arch Linux 系统,虽然 Arch 是滚动发行系统,但是好在现在容器效率已经很高,一些软件可以直接跑在容器中,既可以保证宿主机和各个软件之间的安全,也能很好兼容各种软件。

因为 Arch Linux 仅有纯文本的安装方式,所有有了此篇文章,用于记录我的安装过程以及如何在 Oracle Cloud 中安装 Arch Linux。

安装前准备

安装 boot.netboot.xyz 并引导

根据你要安装的机器架构,选择 x86_64 或者 ARM 架构的 boot.netboot.xyz,将其下载到 /boot/efi 里面,不同的系统这个目录可能不一样,如果你也是 RedHat 系列的系统,这里的目录应该一样。

使用 Cloud Shell 或者自己常用的终端连接到机器的控制台。这里推荐使用 Shell 进行安装,因为可以粘贴代码,如果使用 VNC 则需要手打代码。通过控制台或者 ssh 重启服务器,在启动的过程不停按 ESC 按键,直到出现 EFI 设置界面。部分系统在启动菜单也可以进入 EFI 设置,RedHat 系列的系统应该是启动菜单最后一项(System setup)。

Oracle Linux 可能不显示启动菜单,可以参考这篇文章启用。

在 EFI 设置界面中,依次选择并进入 Boot Maintenance Manager > Boot From File,此时第三级界面应该会显示 EFI 分区,选中并进入然后找到 boot.netboot.xyz 的 EFI 文件进行引导并且等待进入菜单页。

启动 Alpine Linux 系统并配置网络

在 boot.netboot.xyz 的菜单页中,依次选中并进入 Linux Network Installs (64-bit) > Alpine Linux > Alpine Linux 3.xx,然后等待 Alpine Linux 系统启动完成。

启动完成后,输入 root 无需密码即可进入系统,此时先配置一下网络,以便稍后可以下载一些必要的文件。直接拷贝以下代码粘贴到终端,并且重启一下网络服务,此时系统就应该有网络了。

cat > /etc/network/interfaces <<EOL
auto eth0
iface eth0 inet dhcp
EOL
/etc/init.d/networking restart

在机器获得网络后,你可以改用 ssh 继续配置,先使用 setup-sshd 安装一下 ssh 服务,在提示 Allow root ssh login? 的时候输入 yes,再使用 passwd 设置一下 root 密码,然后就可以使用终端进行连接了。

安装必要的软件

在 Alpine 中输入 setup-apkrepos 然后输入 c 启用社区仓库,随后再次按下回车更新仓库数据。

输入以下命令安装一些必要的软件

apk update && apk add arch-install-scripts pacman dosfstools e2fsprogs xfsprogs lvm2

创建硬盘分区

使用 fdisk /dev/sda 命令来修改硬盘分区,注意此命令具有一定危险性,建议在操作前仔细阅读相关文档。

先使用 g 来切换成 GPT 分区并清空原有分区,然后使用 n 来创建一个 EFI 分区(建议不少于 500M),再使用 t 将分区类型修改为 1(EFI System)。由于我打算使用 LVM 来安装系统,这里需要创建一个额外的分区用于存放 kernel 和 Initramfs 文件,所以需要再次创建两个分区。如果你直接用 xfs 或者 ext4 就简单很多。

创建完成如果 /dev 没有显示分区,可以使用 partprobe 同步一下分区信息,使用以下命令格式化分区

# 将 EFI 分区格式化成 FAT32
mkfs.fat -F 32 /dev/sda1

# 将 kernel 分区格式化成 xfs
mkfs.xfs /dev/sda2

# 为 sda3 创建 LVM 需要的物理卷
pvcreate /dev/sda3

# 使用 arch_instance 创建卷分组
vgcreate arch_instance /dev/sda3

# 创建 swap 和 root 逻辑卷
lvcreate -n swap -L 4G arch_instance
lvcreate -n root -l +100%FREE arch_instance

# 格式化 swap 分区
mkswap /dev/mapper/arch_instance-swap

# 格式化 root 分区
mkfs.xfs /dev/mapper/arch_instance-root

Arch 官方建议创建 4G 的 swap 分区,这里根据自身需求进行创建。

分区创建完成后,使用以下命令将 root 分区挂载出来

mount -t xfs /dev/mapper/arch_instance-root /mnt

分区创建完成后,你也可以先将 boot.netboot.xyz 的引导文件重新下载到 EFI 分区,防止安装过程出现意外或者安装完成后无法启动导致只能删除实例重新创建实例,但是由于众所周知的原因,Oracle 始终免费的实例删除了基本上就很难再开出来,所以在部署的过程留一手还是很有必要。

部署 Arch Linux 安装文件

从 Arch Linux 官网下载页面找到最新的 bootstrap 压缩包,使用 wget 将其下载到 /mnt/tmp 中,因为 Oracle Cloud 始终免费的 x86_64 主机内存太小,放在内存中进行安装容易爆内存,所以才有需要使用 Alpine Linux 来辅助安装。

tar -xf 解压后,还需要修改一下 root.x86_64/etc/pacman.d/mirrorlist 文件,选择一个合适的镜像地址,至此安装前环境已经准备完成。

正式安装 Arch Linux 系统

使用 arch-chroot root.x86_64 即可进入 Arch Linux 的安装程序,前面已经进行过硬盘分区,所以不需要再次进行分区,可以直接执行以下指令开始部署系统

# 挂载分区
mount /dev/mapper/arch_instance-root /mnt
mount --mkdir /dev/sda2 /mnt/boot
mount --mkdir /dev/sda1 /mnt/boot/efi
swapon /dev/mapper/arch_instance-swap

# 更新仓库信息
pacman-key --init
pacman-key --populate archlinux

# 部署系统,Intel 处理器需要将 amd-ucode 改为 intel-ucode
pacstrap /mnt base linux linux-firmware amd-ucode e2fsprogs openssh vim grub efibootmgr xfsprogs lvm2

# 生成挂载点文件
genfstab -U /mnt >> /mnt/etc/fstab

接下来的一些配置可以参考官方安装文档,这里就不过多赘述了。

arch-chroot /mnt
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc
sed -i -e 's/^#en_US\.UTF-8/en_US\.UTF-8/g' /etc/locale.gen
locale-gen
echo 'LANG=en_US.UTF-8' >> /etc/locale.conf
systemctl enable systemd-resolved systemd-networkd systemd-timesyncd sshd
systemctl set-default multi-user.target

# 禁止将 /tmp 挂载到 tmpfs(内存本来就小)
systemctl mask tmp.mount

# 修改 root 密码
passwd

# 不允许 root 使用密码登录 ssh
sed -i -e 's/^#PermitRootLogin/PermitRootLogin/g' /etc/ssh/sshd_config

# 添加登录密钥
mkdir -p /root/.ssh
chmod 700 /root/.ssh
echo 'YOUR_PIBLIC_KEY' >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys

# 配置网卡
echo 'DNS=8.8.8.8 8.8.4.4' >> /etc/systemd/resolved.conf
cat > /etc/systemd/network/20-ethernet.network <<EOL
[Match]
Name=en*
Name=eth*

[Network]
# How to enable IPv6 on Oracle Cloud? - https://youtu.be/yxm3Bn7uHyw
# Also open port 546 on IPv6. Nftables example:
# nft add rule ip6 filter INPUT udp dport dhcpv6-client accept
DHCP=yes
IPv6AcceptRA=yes
IPForward=no

[DHCPv4]
UseDNS=false
UseNTP=false

[DHCPv6]
UseDNS=false
UseNTP=false

[IPv6AcceptRA]
UseDNS=false
UseDomains=false
EOL

由于我使用了 LVM 分区,所以还需要按照这份文档修改一下文件并且重新生成 Initramfs 文件。

# 搜索 HOOKS 然后将 lvm2 填写在 block 和 filesystems 之间
vim /etc/mkinitcpio.conf
# 或者直接使用下面的命令
# sed -i 's/block filesystems/block lvm2 filesystems/g' /etc/mkinitcpio.conf

# 重新生成 Initramfs
mkinitcpio -P

现在只差最后一步了,添加一个引导程序,否则无法进入系统,由于 Oracle Cloud 支持控制台,我们可以配置一下 ttyS0 以便控制台能够正常使用,如果不配置就只能使用 VNC

cat >> /etc/default/grub <<EOL
GRUB_TERMINAL_INPUT="console serial"
GRUB_TERMINAL_OUTPUT="gfxterm serial"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200"
GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT/quiet/}"
GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT} console=tty0 console=ttyS0,115200"
EOL

再使用 grub 工具配置一下引导程序

grub-install --efi-directory=/boot/efi
grub-mkconfig -o /boot/grub/grub.cfg

# 非必需,创建回退 EFI 启动项
mkdir -p /boot/efi/EFI/BOOT
cp -dp /boot/efi/EFI/arch/grubx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI

到这里系统就已经安装完成,先 exit 再 reboot 就可以开始享用 Arch Linux 系统了~

默认是最小安装,一些 RedHat 特色软件可以在部署阶段加入到 pacstrap 后面,也可以在系统启动后使用 pacman 进行安装,例如我常用的 Cockpit,熟悉 CentOS 的网络配置文件可以安装 NetwrokManager,防火墙 Firewalld 等等,感觉就算用其他系统也免不了用 RedHat 的软件🤣

参考资料:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据