部分 VPS 商家只有少数几个系统可选,有的还会在提供的镜像中附带一些不必要的监测程序。这时大家可能想要自己安装特定的系统。
本文记录了仅通过 ssh 从 CentOS 7 重装到 Debian 11 的过程,以此为例提供一种只通过 ssh 操作安装系统的方式。安装过程中不需要使用 VNC, 也不需要挂载新的存储设备。



适用条件:

  • VPS使用KVM等完全虚拟化技术 (查看虚拟化类型:systemd-detect-virt)
  • 系统使用BIOS+GRUB引导,即
    • /sys/firmware/efi/ 目录不存在
    • /boot/grub/ 目录或/boot/grub2/目录存在
  • 服务器能够连接网络,用户具有root权限


概述


  • 下载linux(内核二进制文件)和initrd.gz(ramdisk image),在initrd.gz中添加自动安装配置文件;
  • 将这两个文件存放到合适位置,例如/boot/images/目录
  • 修改Grub配置并重启,Grub将两个文件加载到内存,安装程序自动格式化硬盘并从网络下载其他组件进行安装

参考:硬盘安装程序从 Linux 引导使用 GRUB–www.debian.org



文件下载


在netboot安装程序目录下载linuxinitrd.gz文件。以amd64架构为例:点此查看


自动安装配置


解压initrd.gz

1
gzip -d initrd.gz

新建并编辑preseed.cfg文件:

1
vim preseed.cfg

参考:预置文件的内容(bullseye)–www.debian.org

参考:腾讯云轻量在没有VNC的情况下重装Debian10–荒岛


完整预置文件示例可在 文末 查看或复制


下面简单介绍预置文件各部分的内容:

设置语言和键盘

1
2
d-i debian-installer/locale string en_US
d-i keyboard-configuration/xkb-keymap select us

网络设置

可参考原系统的设置:

  • ip addr

  • cat /etc/sysconfig/network-scripts/ifcfg-[网卡名] (CentOS)

  • cat /etc/network/interfaces (Debian)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 自动选择网卡
d-i netcfg/choose_interface select auto

# 手动配置网络,如果支持dhcp,则注释掉这几行
d-i netcfg/disable_autoconfig boolean true
d-i netcfg/get_ipaddress string 192.168.1.33
d-i netcfg/get_netmask string 255.255.255.0
d-i netcfg/get_gateway string 192.168.1.1
d-i netcfg/get_nameservers string 8.8.8.8
d-i netcfg/confirm_static boolean true

# 设置hostname和domain
d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string unassigned-domain
d-i netcfg/hostname string debian11

镜像源设置

选择距离服务器近的镜像站,Debian镜像站列表:https://www.debian.org/mirror/list

1
2
3
4
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.us.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

创建用户

1
2
3
4
# 仅创建root用户
d-i passwd/make-user boolean false
d-i passwd/root-password password [文本或crypt(3) hash]
d-i passwd/root-password-again password [文本或crypt(3) hash]

设置时区

1
2
3
d-i clock-setup/utc boolean true
d-i time/zone string Asia/Shanghai
d-i clock-setup/ntp boolean false

磁盘分区

/dev/vda是硬盘设备名,使用lsblk查看,如果是/dev/sda等请修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用lvm
d-i partman-auto/disk string /dev/vda
d-i partman-auto/method string lvm
d-i partman-auto-lvm/guided_size string max

d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true

# 自动分区
d-i partman-auto/choose_recipe select atomic

d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

软件安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# apt相关设置
d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/cdrom/set-next boolean false
d-i apt-setup/cdrom/set-failed boolean false

# 软件包选择,此处只选了standard
tasksel tasksel/first multiselect standard

# 安装openssh-server,不更新软件
d-i pkgsel/include string openssh-server
d-i pkgsel/upgrade select none

# 不返回报告
popularity-contest popularity-contest/participate boolean false

Grub安装

bootdev 按照实际情况修改

1
2
3
4
5
6
7
# grub安装
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
d-i grub-installer/bootdev string /dev/vda

# 安装完成
d-i finish-install/reboot_in_progress note

ssh允许root登录

1
d-i preseed/late_command string in-target sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config


包含到initrd


参见:Adding a Preseed File to the Initrd–wiki.debian.org


1
echo preseed.cfg | cpio -H newc -o -A -F initrd

重新压缩initrd:

1
gzip initrd

mkdir /boot/images/

将新的initrd.gzlinux移动到/boot/images/目录下



修改grub配置


/etc/grub.d/41_custom中的EOF之前添加:

1
2
3
4
5
menuentry 'Debian11 install' {
set root=(hd0,msdos1)
linux /boot/images/linux
initrd /boot/images/initrd.gz
}

注意set root=()设置为/boot所在的分区,

vda1是(hd0,msdos1),vda2是(hd0,msdos2),vdb1是(hd1,msdos1),以此类推


如果/boot单独在一个分区,那么后两行的路径就从/images/开始


此时41_custom应当类似这样:

1
2
3
4
5
6
7
#!/bin/sh
cat <<EOF
# 其他内容
menuentry 'Debian11 install' {
#......
}
EOF



更新Grub配置(CentOS 7):

1
grub2-mkconfig -o /boot/grub2/grub.cfg

(注:Debian用update-grub命令)




修改默认启动项:


首先查看启动项顺序(CentOS 7):

1
grep -E '^menuentry|^submenu'  /boot/grub2/grub.cfg | cut -d "'" -f 2

或者(Debian):

1
grep -E '^menuentry|^submenu'  /boot/grub/grub.cfg | cut -d "'" -f 2

查看刚才添加的Debian11 install排第几位,从0开始,也就是说,如果它在第三行,那么它就对应2


然后修改默认启动项配置:

1
vim /etc/default/grub

修改GRUB_DEFAULT=2 (按照查看的顺序)




再次更新Grub配置(CentOS 7):

1
grub2-mkconfig -o /boot/grub2/grub.cfg

(注:Debian用update-grub命令)


重启

重启vps,等待安装完成即可

ssh登录:用户名root,密码是preseed.txt中自己设置的密码

查看新系统版本:lsb_release -a


附: 完整预置文件示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# 设置语言和键盘
d-i debian-installer/locale string en_US
d-i keyboard-configuration/xkb-keymap select us

# 自动选择网卡
d-i netcfg/choose_interface select auto

# 手动配置网络,请自行修改;如果支持dhcp,则注释掉这几行
d-i netcfg/disable_autoconfig boolean true
d-i netcfg/get_ipaddress string 192.168.1.33
d-i netcfg/get_netmask string 255.255.255.0
d-i netcfg/get_gateway string 192.168.1.1
d-i netcfg/get_nameservers string 8.8.8.8
d-i netcfg/confirm_static boolean true

# 设置hostname和domain
d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string unassigned-domain
d-i netcfg/hostname string debian11

# 镜像源设置
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.us.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string

# 仅创建root用户,密码请自行设置
d-i passwd/make-user boolean false
d-i passwd/root-password password [文本或crypt(3) hash]
d-i passwd/root-password-again password [文本或crypt(3) hash]

# 设置时区
d-i clock-setup/utc boolean true
d-i time/zone string Asia/Shanghai
d-i clock-setup/ntp boolean false

# 硬盘分区,使用lvm,按实际情况设置
d-i partman-auto/disk string /dev/vda
d-i partman-auto/method string lvm
d-i partman-auto-lvm/guided_size string max

d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true

# 自动分区
d-i partman-auto/choose_recipe select atomic

d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

# apt相关设置
d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/cdrom/set-next boolean false
d-i apt-setup/cdrom/set-failed boolean false

# 软件包选择
tasksel tasksel/first multiselect standard

# 安装openssh-server,不更新软件
d-i pkgsel/include string openssh-server
d-i pkgsel/upgrade select none

# 不返回报告
popularity-contest popularity-contest/participate boolean false

# grub安装,位置请按实际情况修改
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
d-i grub-installer/bootdev string /dev/vda

# 避免弹出安装完成的消息
d-i finish-install/reboot_in_progress note

# ssh允许root登录
d-i preseed/late_command string in-target sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config