重新在 Oracle VPS 上安装 archlinux

本文最后更新于 2022年7月23日 晚上

故事背景

故事的背景其实有点惨,我之前的 oracle vps 在小太阳的帮助下装上了 archlinux, 而且平稳运行了大概两年的样子吧,后来我还把 matrix 部署在上面了。可是某一天更新了系统之后,它挂了!

ssh 也无法连上, vnc 也连不上(这其实是因为 openssh 更新了),于是我又只能把 matrix 服务器转回国内。但是,从昨天开始,我matrix 开始看不了图片了,就算服务器挂梯子也不行,始终看不了图片(享受 IRC 待遇)。这可不行啊,得想办法把 matrix 再搬到国外,因此又想起了那台停机几个月的 vps。

这里插一句,如果要装成 NixOS 的话,非常方便,似乎有对应的 Could-init 文件,在初始化 vps 的时候添加进去就好了。但是 archlinux 没有。


补充另一个方法: Kars Wang 的 gist,这个方法不需要操作 UEFI shell 也能够实现重新分区,看起来咱走了弯路。


踩坑经历

这里大家看看就好,我只说哪些做法是不推荐的。

  • 首先,我自己的文章:在 Oracle 免费 VPS 上安装 Archlinux 肯定是不推荐了。但是可以看一看,有些基础的操作(比如开机器、连 VNC)还是值得一看的,但是具体步骤不能照搬。
  • 然后是 Clansty 的文章:在阿里云服务器上安装 Arch Linux ,如果你只有一台机器,那可以看这个,但是你有多台机器的话,我也不推荐你用 bootstrap 安装。
  • 最后是 Netboot 的方式:如果你的服务器内存高于 2GiB(实际上好像高于1.5GiB 就可以), 那就直接用 Netboot 吧, 别看我的文章了。Netboot 我推荐两种安装方式,一种是 netboot.xyz;另一种是 archlinux 官方的 netboot, 在 https://archlinux.org/releng/netboot/ 下载 ipxe-arch.efi,放到服务器的/boot/EFI/rescue 下面,然后连上 VNC,将服务器重启,在 UEFI 里面选择 IPXE 启动即可,或者找到下载的 efi 启动。

推荐的安装过程

如果你的 VPS 像我一样,只有 1GiB 的 RAM, 无法用 netboot 安装 archlinux, vps 提供商又不被 vps2arch 所支持,然后你又想完整地安装 archlinux (包括对硬盘重新分区,oracle 的 EFI 太小了,只有 106M)。 那么你应该看看我这一篇文章。

本文假定,你还有一台可用的 oracle 的 VPS,并且已经装上了 archlinux, 能够正常使用。(如果你另一台 vps 不是 archlinux, 那也没关系,你可以看 在阿里云服务器上安装 Arch Linux ,把某些操作对应的替换过来就可以了。

事前准备

首先按照 在 Oracle 免费 VPS 上安装 Archlinux 做好 连接服务器连接 VNC.

现在,我们已经有一台 archlinux 服务器 (或者其他服务器,即前文的 I 机),和一台 Ubuntu 20.04 的新开的机器(你开的什么就是什么)。

然后我们将 ubuntu 20.04 的机器关机,在甲骨文的面板上将它的引导卷分离下来,注意这是要新装 archlinux 的机器,注意左下角 资源> 引导卷,然后点右边的三个点,分离引导卷。

1656929522935.png

聪明的你可能猜到我们要干什么了,没错,我们要把它挂载到另一台服务器上面,然后装好 archlinux 再挂载回来!

在 oracle 的网页面板上打开另一台服务器( archlinux, I机) ,找到对应的位置,附加上块存储卷,注意位置在 资源 > 附加的块存储卷

1656929770190.png

等一会等到附加完毕之后,找到右边的三个点... 点击,选择 iSCSI 命令和信息,展开 Linux, 会给你 连接(三条)和断开连接(两条)的命令,保存好。我这里就不截图出来了。

1656929943171.png

然后通过 ssh 连上 I 机,进去之后复制那三条命令,就可添加上硬盘。如果你在这里遇到了错误,请参考 Open-iSCSI,简单来说,你应该先安装

open-iscsi软件包,然后启动对应的服务(并将它加入开机自启)

1
sudo systemctl enable --now iscsid

然后再重新运行连接的三条命令,应该就可以了。

成功之后会有类似下面这样的输出,敏感信息用 xxxx 替代了。

1
2
3
New iSCSI node [tcp:[hw=,ip=,net_if=,iscsi_if=default] xxxxxxxxxxxxxxx] added
Logging in to [iface: default, target: xxxxxxxxxxxxxx]
Login to [iface: default, target: xxxxxxxxxxxxxx] successful.

然后我们看一下 目前的硬盘

1
lsblk

输出的结果大致上像这样

1
2
3
4
5
6
7
8
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 46.6G 0 disk
|-sda1 8:1 0 46.5G 0 part /
|-sda14 8:14 0 4M 0 part
`-sda15 8:15 0 106M 0 part /boot
sdb 8:32 0 46.6G 0 disk
|-sdb1 8:33 0 512M 0 part
`-sdb2 8:34 0 46.1G 0 part

右边的 //boot 就是我们目前正在用的硬盘的分区,注意到 /boot 只有 106M,连两个内核都装不下,而 sdb (注意你的可能不是 sdb)就是我们新挂载上的硬盘,我们要将 archlinux 装到这个硬盘里面。

开始安装

分区

首先,我们将 sdb 重新分区

1
sudo fdisk /dev/sdb

输出如下

1
2
3
4
5
6
Welcome to fdisk (util-linux 2.38).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help):

输入 d, 删除分区,我输入了两次,把两个分区都删了。

1
2
3
4
5
6
7
8
Command (m for help): d
Partition number (1,2, default 2): 2

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

然后重新创建分区,输入 n,然后提示输入大小的时候输入 +512M

1
2
3
4
5
6
Command (m for help): n
Partition number (1-128, default 1): 1
First sector (34-97677278, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-97677278, default 97675263): +512M

Created a new partition 1 of type 'Linux filesystem' and of size 512 MiB.

然后再次输入 n 一路回车创建我们的第二个分区

1
2
3
4
5
6
Command (m for help): n
Partition number (2-128, default 2):
First sector (1050624-97677278, default 1050624):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1050624-97677278, default 97675263):

Created a new partition 2 of type 'Linux filesystem' and of size 46.1 GiB.

然后输入 p 看一下我们的分区

1
2
3
4
5
6
7
8
9
10
11
12
13
Command (m for help): p

Disk /dev/sdb: 46.58 GiB, 50010783744 bytes, 97677312 sectors
Disk model: BlockVolume
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 1048576 bytes
Disklabel type: gpt
Disk identifier: 6780050F-7A6E-4BDB-87EF-9993AC5C0EBA

Device Start End Sectors Size Type
/dev/sdb1 2048 1050623 1048576 512M Linux filesystem
/dev/sdb2 1050624 97675263 96624640 46.1G Linux filesystem

好像 sdb1 的类型不太对,我们给它改一下,输入 t, 然后输入1(分区编号), 再输入1 (分区类型)

1
2
3
4
5
Command (m for help): t
Partition number (1,2, default 2): 1
Partition type or alias (type L to list all): 1

Changed type of partition 'Linux filesystem' to 'EFI System'.

可以看到分区类型已经成功改为 EFI 了。最后 输入 w 保存。(我就不输入了,我都已经装好了,保存了我装好的系统就没了)。

pacstrap

这一步其实是参考的 以官方Wiki的方式安装ArchLinux,但是我把重要的内容都抄过来了,大家没必要点进去(嘿嘿)。

然后我们将硬盘挂载到对应文件夹

1
2
sudo mount /dev/sdb2 /mnt/
sudo mount /dev/sdb1 /mnt/boot

没有报错的话,我们就挂载好啦。由于我们是境外服务器嘛,没必要改镜像,我们直接用 pacstrap 安装一些必要的包进去。

1
sudo pacstrap /mnt base base-devel linux linux-firmware dhcpcd

然后生成 fstab

1
sudo genfstab -L /mnt >> /mnt/etc/fstab

然后我们要 看一下 fstab 对不对(其实这里生成的 fstab 不对哦

1
cat /mnt/etc/fstab

结果如下,注意:**你看到的跟我的不一样!**你的应该是写的 /dev/sdb 之类的,你需要自己把他们改成 UUID 这样的,具体的 UUID 里面有。

1
2
3
4
5
6
7
8
9
10
11
# Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>
# /dev/sdb2 UUID=fc934606-93e4-4748-b2b9-faf07f2dec9b
UUID=fc934606-93e4-4748-b2b9-faf07f2dec9b / ext4 rw,relatime,stripe=256 0 1

# /dev/sdb1 UUID=EF87-F5A7
UUID=EF87-F5A7 /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2

/swapfile none swap defaults 0 0

注意到我们还多了个 /swapfile 所以我们也必须要创建一个 swapfile 或者你可以把那行注释掉。

chroot

然后我们可以 chroot 进去了

1
sudo arch-chroot /mnt

先设置时区

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

装一些必要的包,过程中一路确认就好

1
pacman -S vim sudo sshd dhcpcd

设置下 locale,在里面启用 en_US.UTF-8 UTF-8 就行了,服务器上不需要中文。

1
vim /etc/locale.gen

然后执行

1
locale-gen

然后打开locale.conf

1
vim /etc/locale.conf

在文件里面第一行写入

1
LANG=en_US.UTF-8

保存退出。

现在开始设置主机名

1
vim /etc/hostname

在第一行输入你设置的主机名,假设是 myhostname,保存并退出。

编辑/etc/hosts文件:

1
vim /etc/hosts

在文件末尾添加(将myhostname替换成你自己设定的主机名),实际上这里还应该将你的服务器的公网IP 也映射到 localhost 但是不做也无所谓。

1
2
3
127.0.0.1	localhost
::1 localhost
127.0.1.1 myhostname.localdomain myhostname

保存并退出。

现在开始输入 passwd 设置root 的密码,注意密码需要输入两遍,不会有回显。

然后我们安装 ucode, intel 的就输入 intel-ucode (Oracle 好像是 AMD 的,那就换成 amd-ucode

1
pacman -S amd-ucode

然后我们安装 grub

1
pacman -S grub efibootmgr

部署 grub并生成配置文件

1
2
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub
grub-mkconfig -o /boot/grub/grub.cfg

注意:如果你前面的 fstab 里面有 /swapfile

请创建 swapfile 不然启动会失败,这里我创建 2G

1
dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress

修改权限并初始化,然后启动它。

1
2
3
chmod 0600 /swapfile
mkswap /swapfile
swapon /swapfile

如果你已经是一个老手,你可以在这里就设置好你的用户,配置好 sudo, 同时不要忘记将你的 ssh 公钥写入到你用户的 authorized_keys

配置用户

我们首先创建一个用户,请将 username 替换为你的用户名。

1
useradd -m -G wheel username

然后为它设置一个密码

1
passwd username

再为它配置 sudo

1
EDITOR=vim visudo

找到

1
# %wheel ALL=(ALL:ALL) NOPASSWD: ALL

去掉前面的 #, 然后保存退出,这样我们的用户不需要密码就能使用 sudo 了。

退出 chroot

我们的系统差不多要安装好了,下面退出 chroot,并卸载硬盘。

1
2
exit
sudo umount -R /mnt

如果提示

1
umount: /mnt: target is busy.

我们就使用 下面的命令卸载。

1
sudo umount -R /mnt -l

然后我们还要把硬盘卸载下去,因为要挂载回另外一台机器上了。

最后我们找到这台机器附加的块存储卷,找到 iSCSI 命令和信息, 复制其中的 断开连接 命令,并输入,应该会提示

1
2
Logging out of session [sid: 6, target: xxxxxxxxxxxxxxxxxxx]
Logout of [sid: 6, target: xxxxxxxxxxxxxxxxx] successful.

然后我们直接分离块存储卷

1656932975616.png

给新机器 (ubuntu 20.04,但是快要是 arch 了) 附加引导卷,在对应机器页面的 资源> 引导卷 下面。

配置 UEFI

首先我们先连上 VNC,请参见 事前准备,在我们在 I 机上面装好 tmux, 并运行 tmux

粘贴中转 vnc 的 命令进去,然后按 ctrl+b 再按 d 分离 tmux,免得我们 ssh 断开后中转也自动断开了。注意,如果这里 VNC 连接断了,请重新连接,并检查中转服务是不是也断了,中转服务也断了请重新连接中转服务。

然后我们在本地用 remmia 连上 VNC。注意 VNC 的画面,同时给 新机器开机,在 VNC 那里疯狂按 F2 来进入 UEFI 页面。

进入到 UEFI 之后画面大概像这样,里面有 Boot manager, 但是好像什么都干不了。也有 Boot Maintainance Manager,能够干一些事情。

1656933662022.png

比如 Boot Maintainance Manger 里面能够改 Boot order, 但是实际上没有用。这里就不展示了。

我们选择 Boot Manger,再选择 EFI Internal Shell, 回车进入 shell.

1656933986185.png

注意: 此处开始不能用 ctrl+v 粘贴了,但是 remmia 有自带的将剪贴板逐字发送到 VNC 的功能,扳手🔧图标就是

我们输入如下命令查看现有的启动项。

1
bcfg boot dump

1656934152288.png

这是我的启动项,第一个已经被改成 archlinux 了,你的第一个应该是 UEFI ORACLE BlockVolume. 而且你没有 Option: 04.

然后我们添加一个 grub 启动项,序号为4,命名为 archlinux

1
bcfg boot add 4 fs0:\EFI\grub\grubx64.efi "archlinux"

然后我们将它移动到编号为 0的位置

1
bcfg boot mv 4 0

你可能以为这就管用了,其实并没有,真正管用的是下一步。

我们删除掉 ORACLE 的启动项,它现在编号应该为 4

1
bcfg boot rm 4

然后我们输入 exit 退出 shell. 回到 Boot Maintainance Manager > Boot Options > Change Boot Order 可以看到,我们的 archlinux 启动项变成了第一位!

1656934595781.png

然后我们回到 UEFI 主页面,选择 Continue,就看到熟悉的 grub

1656935550278.png

进去了之后登录 root 帐号,然后我们要启动 dhcpcdsshd 服务

1
2
systemctl enable --now dhcpcd
systemctl enable --now sshd

然后就可以尝试通过 ssh 连接到服务器了。本文到这里也就完结了。
最后附上一张 neofetch 结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
╭─sukanka@oarch ~
╰─$ neofetch --off
sukanka@oarch
-------------
OS: Arch Linux x86_64
Host: KVM/QEMU (Standard PC (i440FX + PIIX, 1996) pc-i440fx-4.2)
Kernel: 5.18.9-arch1-1
Uptime: 54 mins
Packages: 166 (pacman)
Shell: zsh 5.9
Resolution: 1024x768
Terminal: /dev/pts/0
CPU: AMD EPYC 7551 (2) @ 1.996GHz
GPU: 00:02.0 Vendor 1234 Device 1111
Memory: 115MiB / 964MiB


╭─sukanka@oarch ~
╰─$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 46.6G 0 disk
├─sda1 8:1 0 512M 0 part /boot
└─sda2 8:2 0 46.1G 0 part /

参考文章


重新在 Oracle VPS 上安装 archlinux
https://blog.askk.cc/2022/07/04/reinstall-arch-on-oracle/
作者
sukanka
发布于
2022年7月4日
许可协议