部分 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安装程序目录下载linux
和initrd.gz
文件。以amd64架构为例:点此查看
自动安装配置
解压initrd.gz
:
新建并编辑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
|
可参考原系统的设置:
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
|
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
|
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:
mkdir /boot/images/
将新的initrd.gz
和linux
移动到/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
然后修改默认启动项配置:
修改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
|