在进行一些独立服务器运维的时候,我们有可能遇到一些后台面板功能不正常,或者后台功能不完整,导致我们无法自定义安装 Linux 系统的时候,就可以通过进入 Rescue 模式重新部署系统。Rescue 模式只涉及到 PXE 网启,通常来说大部分的服务商都会提供,且不容易出现问题。
首先你需要准备好一份网络配置,这通常可以通过老的系统提取,或者直接从 Rescue 模式的 Linux 系统中直接提取,接着你需要准备好一个合适的镜像源,后续的安装都完全依赖这个镜像源,因此一个稳定高速的镜像尤为重要。
在执行安装之前请打开 screen/tmux 等终端复用器以保证安全的安装。
下面以 Debian/Ubuntu 为例进行安装
Contents
处理分区
安装必要的软件
apt-get update && apt-get install parted mdadm fdisk binutils -y
假设老旧系统中的重要文件已经完成了备份,我们就可以开始重新分区。
清理掉老旧分区
mdadm --stop /dev/md* mdadm --zero-superblock /dev/sd* wipefs --all --force /dev/sd[a-z] wipefs --all --force /dev/nvme[0-9]n[1-9] for i in /dev/sd[a-z]; do dd if=/dev/zero of=$i bs=1m count=2k; done for i in /dev/nvme[0-9]n[1-9]; do dd if=/dev/zero of=$i bs=1m count=2k; done sync
以上的操作将会删除原有的所有分区,包括软阵列。
为第一块磁盘创建分区表作为模板
parted -s /dev/sda mklabel gpt parted -s /dev/sda mkpart primary 1 2M parted -s /dev/sda mkpart primary 2M 512M parted -s /dev/sda mkpart primary 512M 8G parted -s /dev/sda mkpart primary 8G 100%
如果是单盘大于 3TB 需要使用 GPT 分区表。这里我计划使用 500M 空间作为 /boot
,7.5G 空间作为 Swap
剩余空间均分配给 /
你可以在这里使用更为复杂的分区,将/home
,/data
等分开。
激活分区
parted -s /dev/sda set 1 bios_grub on parted -s /dev/sda set 2 raid on parted -s /dev/sda set 3 raid on parted -s /dev/sda set 4 raid on
启动分区需要激活才可以被正常识别
复制分区表
sfdisk -d /dev/sda | sfdisk /dev/sdb sfdisk -d /dev/sda | sfdisk /dev/sdc sfdisk -d /dev/sda | sfdisk /dev/sdd
由于我准备使用软阵列,因此需要完全一致的分区表信息,这里直接使用 sfdisk
即可
新建软阵列
mdadm --create /dev/md1 --level=1 --raid-devices=4 /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2 --metadata 1.2 --chunk=256 --bitmap=internal mdadm --create /dev/md2 --level=1 --raid-devices=4 /dev/sda3 /dev/sdb3 /dev/sdc3 /dev/sdd3 --metadata 1.2 --chunk=512 mdadm --create /dev/md3 --level=0 --raid-devices=4 /dev/sda4 /dev/sdb4 /dev/sdc4 /dev/sdd4 --metadata 1.2 --chunk=512
这里为了安全,将 /boot
和 Swap
空间均设为 Raid 1,其他空间为了速度和容量考虑做 Raid 0 分配给 /
Step 2 安装准备
创建文件系统
mkfs.ext4 /dev/md1 mkswap /dev/md2 mkfs.ext4 /dev/md3
挂载主分区
mount /dev/md3 /mnt
写入软阵列配置
mkdir -p /mnt/etc/mdadm /usr/share/mdadm/mkconf > /mnt/etc/mdadm/mdadm.conf
处理自动挂载
my_array=() while IFS= read -r line; do my_array+=( "$line" ) done < <( blkid | grep md | awk '{print $1,$2}' | sort ) md1=`echo ${my_array[0]} | awk '{print $2}'`" /boot ext2 rw,relatime,block_validity,barrier,user_xattr,acl 0 2 #"`echo ${my_array[0]} | awk '{print $1}' |cut -f1 -d:` md2=`echo ${my_array[1]} | awk '{print $2}'`" none swap defaults,pri=1 0 0 #"`echo ${my_array[1]} | awk '{print $1}' |cut -f1 -d:` md3=`echo ${my_array[2]} | awk '{print $2}'`" / ext4 defaults,errors=remount-ro 0 1 #"`echo ${my_array[2]} | awk '{print $1}' |cut -f1 -d:` echo 'proc /proc proc defaults 0 0' > /mnt/etc/fstab echo $md1 >> /mnt/etc/fstab echo $md2 >> /mnt/etc/fstab echo $md3 >> /mnt/etc/fstab
Step 3 使用 debootstrap 安装系统
安装 debootstrap
mkdir work cd work wget http://ftp.de.debian.org/debian/pool/main/d/debootstrap/debootstrap_1.0.123_all.deb ar -xf debootstrap_*_all.deb tar -xf data.tar.gz -C /
安装一个系统
sudo debootstrap --arch=amd64 focal /mnt http://de.archive.ubuntu.com/ubuntu
这里以 ubuntu 20.04 为例。如果安装 Debian 则需要修改安装的版本名称以及下载镜像。 Debian 的下载镜像为
http://deb.debian.org/debian/
,它可以自动寻找最近的镜像站。
挂载设备
mkdir -p /mnt/{boot,var,tmp,home,proc,sys,dev} mount /dev/md1 /mnt/boot for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
想要继续安装系统,还需要将剩余的两个分区以及系统的一部分资源挂载到新建的系统中(Linux 系统的设备也是作为文件来对待的)
apt 下载源
cat > /mnt/etc/apt/sources.list <<EOF deb http://de.archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse #deb-src http://de.archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse deb http://de.archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse #deb-src http://de.archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse deb http://de.archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse #deb-src http://de.archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse deb http://de.archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse #deb-src http://de.archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse #deb http://archive.canonical.com/ubuntu focal partner #deb-src EOF
同之前的 debootstrap 安装, apt 下载镜像也会影响后续更新与安装的速度,请选择较快的源。
Step 4 初始化新系统
chroot
chroot /mnt /usr/bin/bash
将 Root 修改为新系统的路径,并使用 bash 作为默认的脚本解释器。
locale
export LANGUAGE=en_US.UTF-8 export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 locale-gen en_US.UTF-8 DEBIAN_FRONTEND=noninteractive dpkg-reconfigure locales
为系统设定一个默认语言。
timezone
dpkg-reconfigure tzdata
为系统配置时区
更新并安装基本的软件
apt-get update && apt-get upgrade -y apt-get install locales grub2 mdadm udev ssh openssh-server host pciutils vim nano locate systemd dbus keyboard-configuration linux-generic linux-firmware net-tools man netplan.io -y
设置密码
passwd
允许密码登录 Root *
sed -i 's|#PermitRootLogin prohibit-password|PermitRootLogin yes|g' /etc/ssh/sshd_config
这一步操作仅针对没有密钥登录的状况,更推荐直接写入公钥以登录系统
配置网络
cat >> /etc/netplan/01-netcfg.yaml << EOF # This file describes the network interfaces available on your system # For more information, see netplan(5). network: version: 2 renderer: networkd ethernets: eno1: dhcp4: no dhcp6: no addresses: [aa.bb.cc.dd] gateway4: aa.bb.cc.254 nameservers: addresses: [28.8.8.8,8.8.4.4] eno2: dhcp4: yes mtu: 9000 EOF systemctl enable systemd-networkd.service systemctl enable systemd-resolved.service
这个配置是 netplan 使用的格式,如果还在使用 ifconfig
则写法不同,这由你的新系统决定,你可以直接复制 Rescue 模式下系统的网络配置。
修改主机名
hostnamectl set-hostname myserver cat > /etc/hosts << EOF 127.0.0.1 myserver localhost ::1 myserver localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters EOF
Step 5 安装启动项
grub-install /dev/sda grub-install /dev/sdb grub-install /dev/sdc grub-install /dev/sdd grub-mkconfig update-grub
你需要至少将 Grub 启动信息安装到其中一个盘,由它引导系统启动。
Step 6 重启系统
exit reboot
在确认安装配置无误后,即可退出 chroot 并重启
参考
https://gist.github.com/aeris/1872233
https://186526.club/2020/06/ubuntu-smallest/