在 Oracle 免费 VPS 上安装 Archlinux

本文最后更新于 2022年7月15日 凌晨

今天的故事是,在 甲骨文 (Oracle) 提供的免费 VPS 上安装 Archlinux。我很早以前就白嫖了两台 VPS, 配置为 1C1G+50G +480Mbps. 默认提供的系统不含 Archlinux.

很久以前,我成功在腾讯云上使用 vps2arch 成功装上了 Archlinux。但是,在 Oracle 上面一直失败,后来我请 小太阳 bigfootACA 帮我安装了一台。

另一台上面有运行自建的服务,所以一直没有用。直到现在把服务迁移出来了,才考虑也装上 Archlinux,另一个原因是看到群友在讨论在 Oracle VPS 上安装 Arch 这件事情。 但是,现在不好意思再次麻烦人家了。自己动手,丰衣足食。


更新:本文已经过时,唯一的价值在于连接 VNC,请参考 重新在 Oracle VPS 上安装 archlinux

参考资料

群友发的两篇博客

前期探索

最开始的时候,我是按照 Cpt. Huntsman 的文章走的,可是,没办法,没有 pivot_root 命令,于是放弃。

后面转到 Clansty 的方案,她的方案我尝试了很多遍,虽然有些小坑,但是有一次,我本来已经装好了,结果被我作没了(进 /etc/shadow 把自建用户那行删了,自建用户再也登不上,而 root 又没改密码,导致再也连不上了。

后面就直接终止 VPS, 重新建立实例,中间出现了几次妖蛾子,有时候创建出来的实例我根本就登不上去。有时候创建实例卡在初始化那里。也有一次,本来都快装好 Arch 了,结果 grub-install 命令没搞对(照抄的 Clansty 的,但是我的是 UEFI 引导)。也尝试过知乎文章那样,用控制台连接,然后通过网络启动的方式安装,结果直接一个 kernel panic.

最终是结合了 Clansty 的方案与知乎的文章的控制台连接。最终的结果如图所示,反复创建删除了好几次。

安装过程

选择镜像

创建实例的时候选择的镜像为 Ubuntu 20.04 , 选 Ubuntu minimal 也可以 (这个不带 Vim)。

image-20220214005324348

添加 SSH 密钥 的地方,如果你不知道什么是 ssh 密钥 请选择默认选项并点击 保存私有密钥 然后放到 ~/.ssh/id_rsa 并且执行

1
chmod 600 ~/.ssh/id_rsa

然后点击创建。如果你知道 ssh 密钥,按你自己的喜好操作即可。

连接服务器

创建好之后,选择刚刚创建好的实例

image-20220214010036122
找到 IP 地址(打码的部分)与用户名 (ubuntu)

你可以在终端通过如下命令连接到你的服务器:(把 123.123.123.123 换成你服务器的 IP)

1
ssh ubuntu@123.123.123.123 -i ~/.ssh/id_rsa

现在我们已经知道怎样连接服务器了。

连上去之后,输入

1
2
3
sudo su
passwd root
passwd ubuntu

给两个用户都设置一个密码(每个密码都要输两遍)。以便我们能够在VNC 里面登录。

连接 VNC

这一部分参考的知乎的文章。

你需要:

  1. 一台闲置(Idle)的,跟 Oracle 免费机完全没有关联的 VPS (简称 I 机)
  2. 一个临时生成的ssh公钥与私钥文件(ssh2)
  3. 装好一个 VNC 客户端,我用的 remmina 与它的 vnc 插件 libvncserver

生成 ssh key:

用I机当做跳板,在内部创建与F机控制台通信的ssh隧道,远程登录I机,输入以下命令,生成ssh2:

1
ssh-keygen -b 4096

一路回车,生成成功,然后导出公钥

1
cat ~/.ssh/id_rsa.pub

将其保留在记事本上,后面要用。

实例的详细信息下方找到 资源>控制台连接,创建一个本地连接。将刚刚复制到记事本的公钥粘贴进去,完成创建(我已经创建好了,所以无法再创建)。

image-20220214011517111

找到刚刚创建好的控制台连接,最右边点击三个点,选择复制 Linux/Mac 的 VNC 连接 (我是 Linux 系统嘛,反正复制 VNC 就对了)。

image-20220214011744746

复制出来的命令像这样(这里抄的知乎的,不敢把我自己的放出来),注意这里相对于复制出来的有更改,

localhost:5900 改成了 0.0.0.0:32647, 这是出于安全的原因。

由于 openssh 8.8 开始弃用了 ssh-rsa,我们重新开启它,在 I 机与 oracle vps 上面分别创建 ~/.ssh/config, 写入如下内容

1
PubkeyAcceptedKeyTypes +ssh-rsa

最终我们的命令变成了

1
ssh -o ProxyCommand='ssh -W %h:%p -oHostKeyAlgorithms=+ssh-rsa -oPubkeyAcceptedKeyTypes=+ssh-rsa  -i .ssh/id_rsa  -p 443 ocid1.instanceconsoleconnection.oc1.ap-tokyo-1.anxhiljr3qzs6ryc3ibomraydyib4qngcpa3h37b2tb4isljgaujwq5jigya@instance-console.ap-tokyo-1.oci.oraclecloud.com' -N -L 0.0.0.0:32647:ocid1.instance.oc1.ap-tokyo-1.anxhiljr3qzs6rycfo4gp26wnkjhsv23kycsljg63ej2vsh5uxug5ukb3tqq:5900 ocid1.instance.oc1.ap-tokyo-1.anxhiljr3qzs6rycfo4gp26wnkjhsv23kycsljg63ej2vsh5uxug5ukb3tqq -oHostKeyAlgorithms=+ssh-rsa -i .ssh/id_rsa

在 I机(中转机)上面执行上述命令,可能需要输入 yes. (参考知乎)。执行后,只出现一个不会退出的光标,而无其他报错,就说明运行成功了。

装好 remmina 与它的vnc 插件后,在本地打开终端,执行下面的命令(英文界面,中文界面是方框),

1656900513563.png

输入你的中转机(I机) 的 IP 地址,和端口,回车。如图上为 234.234.234.234:32647.

连接上之后会有这样一个黑框框(我这个已经装好 了)。通过VNC 我们可以监测到 VPS 的状态,即使 ssh 登录不上了,我们还可以通过 VNC 界面查看原因。

输入用户名 root, 密码点击

1656900617176.png

输入用户名 root, 将 root 的密码复制到剪贴板,然后按照下图的方式输入

1656900760844.png

准备好了之后,我们可以正式开始安装 Archlinux 了。

安装 Archlinux

首先,登录要安装 Archlinux 的服务器。这里是 Oracle 免费 VPS ubuntu 20.04.

这一部分基本抄袭的 Clansty 的内容。

下载 RootFS

首先呢我们得有一个 Arch 的 RootFS,也就是一个基本的包括 Arch Linux 根目录下所有文件的文件夹,一会儿要 chroot 进去。为了使用 chroot 这个功能,直接在 Arch 的下载页面找一个离服务器比较近的镜像源,复制里面 archlinux-bootstrap 开头的 tar.gz 包的地址,下载到服务器的 /tmp 文件夹。其实这个时候可以 cd/tmp 里面把不相关的文件都删掉了。

注:由于我的服务器IP 是日本的,所以我选择了日本的服务器

1
2
3
cd /tmp
sudo su
wget https://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/latest/archlinux-bootstrap-x86_64.tar.gz

然后自然是要解包这个文件,顺便看看里面都有些啥

1
2
3
tar -xzf arch*
cd root.x86_64
ls

结果就像

1
bin  boot  dev  etc  home  lib  lib64  mnt  opt  proc  README  root  run  sbin  srv  sys  tmp  usr  var

这里面就像一个装好了的 Linux 的根目录一样,所以说是 RootFS 嘛

进入 chroot 环境

如果使用的是 ubuntu minimal (不带 vim),先安装 vim

1
2
apt update 
apt install vim

听说需要用 mount --bind 把 RootFS 解包的目录自己与自己链接起来,不然 pacman 会装不了软件。至于要是不知么做会发生什么,咱也没试过,妳们可以自行尝试。

1
mount --bind /tmp/root.x86_64 /tmp/root.x86_64

别急,由于这个 RootFS 包是最简安装,你看它只有 140MB 是吧,它里面甚至连个文本编辑器都没有。所以咱需要在 chroot 之前编辑一下镜像源的文件,启用自己喜欢的镜像源,这样 pacman 才能正常安装系统。我的 IP 是日本,我就直接使用日本的镜像源了。虽然 zhullyb 说国外一律用 CloudFlare 的镜像源<但是在安装的时候用这个会出错,可以装好了之后替换成这个。选择镜像源的方式就是删除该行前面的注释(#)。vim 使用教程见 菜鸟教程,会插入 (i), 退出即可。

1
vim /tmp/root.x86_64/etc/pacman.d/mirrorlist

好啦,现在可以正式进入 chroot 环境啦。不过呢用普通的 chroot 进去之后 /dev 之类的目录会是空的,不可以正常安装系统。要使用 Arch 镜像中的 arch-chroot 脚本,这个脚本会自动执行一些 mount 命令,把设备啊之类的都映射到 chroot 容器里面,咱就可以正常安装系统啦。

1
/tmp/root.x86_64/bin/arch-chroot /tmp/root.x86_64/

在 chroot 环境中给机器安装 Arch Linux

首先初始化 pacman 的密钥(读作 ”蜜月“ 哦),pacman 就能正常使用啦

1
2
pacman-key --init
pacman-key --populate archlinux

现在我们已经进入属于 Arch 的世界了,不会再想念原先的 Linux 发行版了。所以现在应该把原先发行版的文件消灭掉。由于我们现在运行的环境就在原先的分区上,所以直接格式化肯定是不行的。需要把原先的分区挂载到现在的系统中,然后把属于原系统的文件删删删

Oracle中,系统分区是 /dev/sda1

注:我们可以在 VPS 上执行如下命令查看有哪些分区哦

1
2
3
4
5
6
➜  ~ lsblk
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

可以看到 系统分区是 /dev/sda1, boot 分区是 /dev/sda15,在 ubuntu里面运行 lsblk 的时候是不会显示 /boot 的,只会显示

1
2
3
4
5
6
➜  ~ lsblk
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

的字样,但是我们同样要意识到这个106M 的分区应该是 boot.

现在我们开始挂载分区到系统中啦。

首先看看你的系统引导方式是 BIOS 还是 UEFI, 这取决于我们是否需要挂载 boot 分区。参考 Viseator

1
ls /sys/firmware/efi/efivars

输入命令并回车执行后,如果提示

1
ls: cannot access '/sys/firmware/efi/efivars': No such file or directory

表明你是以BIOS方式引导,否则为以EFI方式引导。

然后挂载分区,执行下面的命令,挂载 sda1 (替换为你的分区)

1
mount /dev/sda1 /mnt

UEFI 引导的还要将 sda15 (替换为你的分区)挂载到 boot

1
mount /dev/sda15 /mnt/boot

由于 Linux 系统中“一切皆文件”,像 /dev /proc /run /sys 这些目录都是存储到硬件的映射的,所以不能删。同时,我们工作的目录在 /tmp 下,swapfile (如果有)是我们正在使用的 swap。咱们用 rm -rf 命令,把其余的文件都清除干净。

1
2
3
cd /mnt
rm -rf bin boot etc home mnt opt root sbin srv usr var vml* ini* lib* med* snap*
cd /

删不掉的就算啦,等它在那里就是了。

之后就正是进入安装 pacstrap 环节啦

像正常安装 Arch Linux 一样使用 pacstrap 向目标挂载点安装系统底层的软件包,并生成 fstab 挂载配置文件,注意,这里用 cloudflare 源会出错。

1
2
pacstrap /mnt base base-devel linux linux-headers linux-firmware vim dhcpcd openssh grub
genfstab -U /mnt > /mnt/etc/fstab

这时候系统安装就已经完成了。

进入新系统

再通过 arch-chroot 切换到安装好的系统目录下,进入最后的系统配置和必备程序包的安装

1
arch-chroot /mnt

注意,要是在 chroot 的时候发生与 /etc/resolv.conf 挂载相关的问题,可以先执行

1
2
3
umount /etc/resolv.conf
arch-chroot /mnt
echo 'nameserver 223.5.5.5' > /etc/resolv.conf

否则可能会无法解析 IP。如果上面 chroot 时没有出现问题可以跳过这个

首先将时区设置为北京时间

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

/etc/hostname 中设置主机名,

1
vim /etc/hostname

设置你的主机名,如 newarch,然后修改 /etc/hosts

1
vim /etc/hosts

添加如下内容。注意,第三行需要修改为你自己的 IP,并将 newarch 修改为你刚刚设置的主机名。

1
2
3
127.0.0.1	localhost
::1 localhost
123.123.123.123 newarch.localdomain newarch

开启一下必要的服务,这样重启之后就有网并且能通过 SSH 连上啦.(这里可能会失败,重启后没有网)

1
2
systemctl enable dhcpcd
systemctl enable sshd

还需要给自己创建一个用户,Arch Linux 默认禁止以 root 身份远程登录。-m 的意思是为用户创建自己的主目录,wheel 是默认能执行 sudo 命令的用户组,

(将 sukanka 替换为你的用户名)

1
useradd sukanka -m -G wheel

然后切换到新创建的用户 (将 sukanka 替换为你的用户名),并且添加自己的公钥,这样重启之后就能直接公钥登录 SSH 啦

1
2
3
4
5
6
7
su sukanka
cd ~
mkdir .ssh
chmod 700 .ssh
cd .ssh
vim authorized_keys # 添加你的公钥,你可以在本地机器上面生成一个。
chmod 600 authorized_keys

回到 root 用户,保险起见,给 root 以及自己的用户设置好密码,这样要是无法公钥登录还能以密码登录

1
2
passwd root
passwd sukanka

编辑 sudo 配置文件,取消 %wheel ALL=(ALL) NOPASSWD: ALL 这一行的注释

1
EDITOR=vim visudo

最后创建引导文件,准备重启啦

如果你是 BIOS 引导

1
2
grub-install --target=i386-pc /dev/vda
grub-mkconfig -o /boot/grub/grub.cfg

如果是 UEFI 引导

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

差不多了,进控制台重启服务器。

同时,我们连接上 VNC, 查看服务器的状态与启动的过程。

确保服务器启动成功之后,尝试在本地通过 ssh 连接服务器。密码连接方式如下

1
ssh sukanka@123.123.123.123 -i ~/.ssh/oracle

其中 sukanka@123.123.123.123用户名@IP , ~/.ssh/oracle 是你在

vim authorized_keys # 添加你的公钥,你可以在本地机器上面生成一个。

添加的公钥对应的私钥。将它们替换为你自己的信息。

如果登录失败,尝试使用密码登录,并根据提示输入密码。

1
ssh sukanka@123.123.123.123

如果这个也没有任何反应,说明服务器没有连上网。

进入 VNC, 输入用户名,密码(注意密码没有回显)

image-20220214022726919

登录上去之后,执行

1
2
systemctl status dhcpcd.service 
systemctl status sshd.service

查看 dhcpcdsshd 的状态,正常两者都应该有显示 Active: **active (running)**,否则就是两者没能成功启动。

因此我们需要重新让他们自启动‘

1
2
sudo systemctl enable --now dhcpcd.service 
sudo systemctl enable --now sshd.service

然后再次运行

1
2
systemctl status dhcpcd.service 
systemctl status sshd.service

看看两者的状态,都已经成功运行起来啦。

我们可以从本地通过 ssh 连接服务器了。


在 Oracle 免费 VPS 上安装 Archlinux
https://blog.askk.cc/2022/02/14/install-ArchLinux-On-Oracle-VPS/
作者
sukanka
发布于
2022年2月14日
许可协议