这两天 KS-4 搞特价,4T 硬盘只要 9o,是公网保种机的绝佳配置,于是买买买。下机以后发现默认的系统模板沙雕了,/ 分区不能使用 SoftRaid0 方式挂载,虽然可以曲线救国把 /root 分一大块出来做 R0,但是我不喜欢这种分区方式,于是就想办法重装这个系统。
一开始我测试了 Airium 修改的 Vicer 重装脚本,这个脚本可以把 iKoula 的机器重装成 Raid0,然而不知道为什么一重装就 SSH 不通,遂放弃。在考察了 KS 的后台分区以后,发现 / 分区只能做成 Raid1,并且无法在上面配置 LVM,看来走官方模板的路子是走不通了。于是就剩下一个方法,在 Rescue 模式下手动安装系统。
KS 的机器在 Rescue 下安装系统主要有两个方法,一是使用 dd 安装 Windows,这不是我想要的,而且我也没有 Ubuntu 的 dd 镜像;二是下载系统镜像的 iso 安装包,使用 QEMU 将硬盘挂载以后在虚拟环境中完成安装。奈何 N2800 这个 CPU 过于古老,没有 VT-x 指令集,因而无法运行 QEMU,只好另辟蹊径。
在寻找如何在 Linux 下安装一个 ISO 文件的过程中,偶然发现了 Debian 系的 debootstrap 脚本,这个脚本可以在任何 Linux 环境下安装 Debian 系的 Linux。作为 Debian 的下游,Ubuntu 也有这个脚本,在一些文档的帮助下,我感觉这条路是可行的。
从一个比较 high-level 的角度来看,使用 debootstrap 安装系统需要如下几步:
- 备份原系统的网络配置(不然等下 SSH 连不上)
- 硬盘分区,配置 SoftwareRAID
- 挂载硬盘
- 在挂载文件夹下运行 debootstrap
- chroot 进入新系统
- 在 debootstrap 完成的基础系统中完成硬盘挂载、SSH、网络和引导的配置
- 将启动方式还原为 local disk,重启
接下来是详细的步骤
备份网络配置
由于我要安装的是 Ubuntu 18.04,因此知道 OVH 的网络配置的最佳方法就是用官方模板装一遍,然后把配置弄出来。在安装之后,发现 OVH 并没使用 netplan,也没有使用之前的 ifupdown 文件,而是直接写了 systemd-networkd 的配置文件。需要备份的是这两个文件:
- /etc/systemd/network/50-default.network
- /etc/systemd/network/50-public-interface.link
文件名可能不同,但是基本就是在这个目录下。对于老版本的系统,备份 /etc/network/interfaces。
硬盘分区
理想的分区情况是这样的,两块盘 /dev/sda 和 /dev/sdb,分一个 512M 的区做 R1 挂载在 /boot,剩下的挂载在 /,swap 这里不考虑,装好了以后写一个文件作为 swap 是很方便的事情。
分区使用命令 fdisk,比如 fdisk /dev/sda,之后进入命令行交互环境。一个典型的配置情况如下:
root@rescue:/mnt# fdisk /dev/sda
Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xc1d78def.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-3907029167, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-3907029167, default 3907029167): +512M
Created a new partition 1 of type 'Linux' and of size 512 MiB.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2):
First sector (1050624-3907029167, default 1050624):
Last sector, +sectors or +size{K,M,G,T,P} (1050624-3907029167, default 3907029167):
Created a new partition 2 of type 'Linux' and of size 1.8 TiB.
按 n 增加分区,然后输入 p 作为 primary 分区,然后指定大小,默认是全部,因此第一个分区输入 +512M,第二个保持默认就好。
之后用 fdisk -l 可以看到当前的分区情况:
root@rescue:/mnt# fdisk -l /dev/sda
Disk /dev/sda: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc1d78def
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 1050623 1048576 512M 83 Linux
/dev/sda2 1050624 3907029167 3905978544 1.8T 83 Linux
/dev/sdb 如法炮制即可。
创建 RAID 设备
使用命令 mdadm,先删除之前所有创建的 md,之后再创建新的,命令如下:
mdadm --stop /dev/mdX
mdadm --remove /dev/mdX
mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sda1 /dev/sdb1
mdadm --create --verbose /dev/md1 --level=stripe --raid-devices=2 /dev/sda2 /dev/sdb2
前两行多运行几遍直到所有的都被删除,之后创建 /dev/md0 RAID1 作为 /boot,/dev/md1 RAID0 作为 /。
使用 lsblk 可以看到当前的分区情况:
root@rescue:/mnt# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 1.8T 0 disk
├─sdb2 8:18 0 1.8T 0 part
│ └─md1 9:1 0 3.7T 0 raid0
└─sdb1 8:17 0 512M 0 part
└─md0 9:0 0 511.4M 0 raid1
sda 8:0 0 1.8T 0 disk
├─sda2 8:2 0 1.8T 0 part
│ └─md1 9:1 0 3.7T 0 raid0
└─sda1 8:1 0 512M 0 part
└─md0 9:0 0 511.4M 0 raid1
然后格式化成 ext4 文件系统:
mkfs.ext4 /dev/md0
mkfs.ext4 /dev/md1
安装 debootstrap
在这里下载 Ubuntu 的 debootstrap 脚本,应该会获得一个类似于 debootstrap_1.0.112ubuntu1_all.deb 的 deb 文件,使用 ar 释放后再解压至根目录下。ar 后会看到一个 data.tar.gz,释放到根目录下。
ar -x debootstrap_1.0.112ubuntu1_all.deb
cd /
zcat /pat/to/data.tar.gz|tar xv
运行 debootstrap
接下来才是重头戏,挂载之前分好区的硬盘并安装系统。我们假定 /dev/md1 挂载在 /mnt/ubuntu 下,然后对 /mnt/ubuntu 运行 debootstrap 安装系统。
mkdir /mnt/ubuntu
mount /dev/md1 /mnt/ubuntu
debootstrap --arch amd64 bionic /mnt/ubuntu http://fr.archive.ubuntu.com/ubuntu/
debootstrap 的命令中,要求安装 amd64 架构的 Ubuntu bionic,也就是 18.04,系统在 /mnt/ubuntu 下,需要的包从 http://fr.archive.ubuntu.com/ubuntu/ 获得。
稍等一会儿, 看到 I: Base system installed successfully. 就安装完成了。
chroot 准备
debootstrap 完成以后,在 /mnt/ubuntu 下就可以看到熟悉的 Linux 根目录结构了,然后我们做一些准备以方便 chroot 运行。
mount /dev/md0 /mnt/ubuntu/boot
mount --bind /dev /mnt/ubuntu/dev
mount --bind /dev/pts /mnt/ubuntu/dev/pts
mount -t proc proc /mnt/ubuntu/proc
mount -t sysfs sys /mnt/ubuntu/sys
第一行是将 /dev/md0 挂载在 /boot 下,这是和我们的分区意图相一致,2 3 两行是将当前系统的 /dev 映射进去,方便之后配置 fstab 文件,4 5 两行是将 proc 和 sysfs 挂载进去,方便配置时进行交互。
之后 chroot 进入新的环境:
LANG=C.UTF-8 chroot /mnt/ubuntu /bin/bash
locale-gen en_US.UTF-8
export TERM=xterm-color
如果进去以后报错 “bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)” 则运行第二行,如果不报错就不用管了,第三行是为了 Terminal 好看点。
系统配置
首先配置一下软件包的源,编辑 /etc/apt/sources.list 写入如下几行:
deb http://fr.archive.ubuntu.com/ubuntu bionic main restricted
deb http://fr.archive.ubuntu.com/ubuntu bionic universe
deb http://fr.archive.ubuntu.com/ubuntu bionic multiverse
deb http://fr.archive.ubuntu.com/ubuntu bionic-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ bionic-security main restricted
deb http://security.ubuntu.com/ubuntu/ bionic-security universe
deb http://security.ubuntu.com/ubuntu/ bionic-security multiverse
并且 apt update。完成后先安装 mdadm 和 lvm2,方便之后挂载。
apt-get install mdadm lvm2
编辑 /etc/fstab 写入挂载方式:
# file system mount point type options dump pass
/dev/md0 /boot ext4 defaults 0 2
/dev/md1 / ext4 defaults 0 1
运行 mount -a 自动挂载,此时使用 df 命令应该可以看到正确的硬盘占用了。
运行 passwd 命令配置 root 用户密码,如果需要加用户,此时使用 adduser 即可。
之后安装内核和 OpenSSH Server:
apt-get install openssh-server linux-generic linux-tools-generic
正常情况下,在安装时会弹出 grub 的配置窗口,选择将 GRUB 安装在 /dev/sda 和 /dev/sdb,如果没有询问的话,安装完成以后运行如下两行:
grub-install /dev/sda
grub-install /dev/sdb
之后写回最开始备份的网络配置文件,并且启动相关服务:
vi /etc/systemd/network/50-default.network
vi /etc/systemd/network/50-public-interface.link
systemctl enable systemd-networkd
systemctl enable systemd-resolved
注意如果只有 root 用户的话,去 /etc/ssh/sshd_config 中修改 PermitRootLogin 为 yes,不然可能无法登录。
这时候就安装完成了,去 KS 后台用本地硬盘重启即可。在登录后记得配置 Public Key,然后将 PermitRootLogin 改为 PermitRootLogin prohibit-password。
最后在安装好的系统中使用 df 和 lsblk 命令查看分区情况:
root@rescue:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 393M 676K 393M 1% /run
/dev/md1 3.6T 1.3G 3.4T 1% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/md0 488M 73M 386M 16% /boot
tmpfs 393M 0 393M 0% /run/user/0
root@rescue:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.8T 0 disk
|-sda1 8:1 0 512M 0 part
| `-md0 9:0 0 511.4M 0 raid1 /boot
`-sda2 8:2 0 1.8T 0 part
`-md1 9:1 0 3.7T 0 raid0 /
sdb 8:16 0 1.8T 0 disk
|-sdb1 8:17 0 512M 0 part
| `-md0 9:0 0 511.4M 0 raid1 /boot
`-sdb2 8:18 0 1.8T 0 part
`-md1 9:1 0 3.7T 0 raid0 /
参考资料
系统安装相关:
https://www.codejam.info/2015/12/installing-nixos-on-a-kimsufi.html
https://help.ubuntu.com/community/Installation/MinimalCD
https://www.pozzo-balbi.com/help/Remote_install_OS_-_Qemu
https://help.ubuntu.com/community/Installation/FromLinux
https://help.ubuntu.com/lts/installation-guide/powerpc/apds04.html
http://ports.ubuntu.com/ubuntu-ports/pool/main/d/debootstrap/
分区相关:
https://wiki.archlinux.org/index.php/Fdisk_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
https://raid.wiki.kernel.org/index.php/RAID_setup#Create_RAID_device
https://wiki.archlinux.org/index.php/Fstab_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
配置相关:
https://help.ubuntu.com/community/Installation/SoftwareRAID
https://wiki.archlinux.org/index.php/systemd-networkd#Basic_usage
https://unix.stackexchange.com/questions/158400/etc-shadow-how-to-generate-6-s-encrypted-password