从 CentOS 到 CentOS 之无媒介重装云服务器

2018-12-03 1702点热度 2人点赞 0条评论

AliCloud 出了一款轻量应用服务器,很便宜,然而如何洗掉 AliCloud 著名的云盾,就需要重装云服务器了。


1 、前言

重装系统很多人都会,但是现在没有任何的媒介(U 盘,光盘)也没有任何的其他分区,你需要在这个分区内安装新的系统并且清空原有数据,这时候就很麻烦了。

本文在源环境为 CentOS7 的情况下,重装 CentOS7 最小化安装版,文章内采用联网的方式制作,实际你完全可以离线实施。


2 、实施准备

准备工具

Linux Server SSH Client CentOS Minimal Install ISO (离线安装时)

前提要素

在线安装时保证网络不会中断
建议提前创建磁盘快照防止失误


3 、实施流程

操作流程比较多,请坐和放宽
如果采用离线安装,请先上传 CentOS.iso 镜像源文件到根目录下(本例为 /root/ 目录下)


3.1 、准备临时系统

首先我们创建一个临时系统所需要的文件夹

mkdir /templinux/

接着我们需要向里面安装系统,我们可以采用 yum 安装 ( util-linux 为 mount 挂载命令所需的组件包)
输入完命令后,会显示需要安装 131 个数据包 Install 3 Packages (+128 Dependent packages)

yum --installroot=/templinux --releasever=7 -y install yum centos-release util-linux

如果说你由于其他原因不能使用 yum,你可以使用 rpm 安装(如果安装校验报错可以在后面添加上 --force --nodeps  强制安装)

rpm --root /templinux -i http://mirror.centos.org/centos/7.6.1810/os/x86_64/Packages/centos-release-7-6.1810.2.el7.centos.x86_64.rpm

复制网络相关的配置文件

cp /etc/resolv.conf /templinux/etc/
cp /etc/fstab /templinux/etc/ mkdir -p /templinux/etc/sysconfig/network-scripts/ cp /etc/sysconfig/network-scripts/ifcfg-e* /templinux/etc/sysconfig/network-scripts/

为虚拟系统挂载设备等文件夹

mount --bind /dev/ /templinux/dev/
mount -t proc procfs /templinux/proc/
mount -t sysfs sysfs /templinux/sys/

如果你的系统是 UEFI 引导的,你需要额外挂载 EFI 相关文件

mount -t efivarfs efivarfs /templinux/sys/firmware/efi/efivars/

操作完毕后,就可以进入临时系统了


3.2 、进入临时系统并删除原盘文件

进入临时系统,注意进入后你的 Shell 界面将变成 bash-4.2#

chroot /templinux

创建新目录,将磁盘挂载到此目录方便操作

mkdir /newlinux
mount $(df -a / | grep -o "/dev/[a-z]\{3\}[0-9]") /newlinux

进入新系统,删除所有文件(注意一定要排除临时系统所在的目录)
此命令同时排除了 selinux 文件夹是为了防止系统本身运行 selinux 导致的权限问题,一般用不到。

chroot /newlinux
find / \( ! -path '/dev/*' -and ! -path '/proc/*' -and ! -path '/sys/*' -and ! -path '/selinux/*' -and ! -path "/templinux/*" \) -delete 2>/dev/null || true
exit

操作完毕后的 exit 将退回临时系统,此时请不要再退出一次否则将直接死机
新系统与临时系统的 Shell 都一模一样,只能通过 ls  命令并依据根目录是否有临时系统的文件夹来判断。


3.3 、开始部署新系统

首先我们和第一步一样,需要向里面安装系统,我们仍然使用 yum 安装

yum --installroot=/newlinux --releasever=7 -y install yum centos-release util-linux

依然复制网络相关的配置文件

cp /etc/resolv.conf /newlinux/etc/
cp /etc/fstab /newlinux/etc/ mkdir -p /newlinux/etc/sysconfig/network-scripts/ cp /etc/sysconfig/network-scripts/ifcfg-e* /newlinux/etc/sysconfig/network-scripts/

为虚拟系统挂载设备等文件夹

mount --bind /dev/ /newlinux/dev/
mount -t proc procfs /newlinux/proc/
mount -t sysfs sysfs /newlinux/sys/

如果你的系统是 UEFI 引导的,你需要额外挂载 EFI 相关文件

mount -t efivarfs efivarfs /newlinux/sys/firmware/efi/efivars/

操作完毕后,就可以准备进入新系统配置了,但是为了防止有误操作请不要使用 exit 退回而是 chroot 进入。


3.4 、对新系统进行简单配置


3.4.1 、安装基础软件

新的系统,首先我们就要在里面安装系统所需的基本软件

chroot /newlinux
yum install -y yum centos-release @core @base

如果你的磁盘分区是 Raid,LVM,XFS 等格式,则需要这些格式的软件包

yum install -y mdadm lvm2 xfsprogs

如果你想使用一些命令,比如 lsb_release cat ls 等命令,在标准镜像包中你可以安装这些软件

yum install -y coreutils redhat-lsb-core dracut-tools dracut-config-generic dracut-config-rescue

如果你想使用一些命令,比如 cat ifconfig 等命令,在最小化镜像包中你可以安装这些

yum install -y net-tools openssl curl

如果你还想使用一些命令,比如 epel 源 vim wget  等命令,在标准镜像包中你可以安装这些

yum install -y epel-release git vim wget unzip screen bind-utils

以上操作完毕后,请注意如果你是软 Raid 用户,你需要运行下面的命令

mdadm --detail --scan > /etc/mdadm.conf

安装好这些基本的 RPM 包后,则开始手动安装一个 Linux 系统的其他内容


3.4.2 、制作 Grub 引导

首先需要了解一下安装 GRUB 相关的 RPM 包

yum install -y grub2 grub2-efi efibootmgr

然后我们可以制作 grub 文件

cat > /etc/default/grub << EOF
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.auto rhgb quiet consoleblank=0"
GRUB_DISABLE_RECOVERY="true"
EOF

然后我们生成正式的 GRUB2 引导,注意替换为你的磁盘名称(本例为 vda)
查看根分区磁盘名称命令为 df -a / | grep -o "/dev/[a-z]\{3\}[0-9]" 

grub2-install /dev/vda
grub2-mkconfig -o /boot/grub2/grub.cfg

如果你是 UEFI 引导的系统,则你需要运行下面命令(同样需要注意替换)

efibootmgr -c -p 1 -d /dev/vda -L "centos vda" -l '\EFI\centos\grubx64.efi'
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

操作完毕后你的引导就做好了


3.4.3 、网络设置

首先我们需要配置开机启动网络

echo "NETWORKING=yes" > /etc/sysconfig/network

然后我们可以查看网络设备虚拟名,并在/etc/sysconfig/network-scripts/中修改配置名称

[[email protected] ~]# udevadm test-builtin net_id /sys/class/net/* 2> /dev/null
ID_NET_NAME_MAC=enx000c2970505e
ID_OUI_FROM_DATABASE=VMware, Inc.
ID_NET_NAME_PATH=enp2s1
ID_NET_NAME_SLOT=ens33

输入此命令后就可以看到本机所有网卡的 ID_NET_NAME_SLOT 名字,本例则对应的 ifcfg-ens33.cfg


3.4.4 、启用 journald 日志系统
mkdir /var/log/journal
chgrp systemd-journal /var/log/journal
chmod 2755 /var/log/journal
systemctl enable systemd-journald

3.4.5 、配置 SElinux 开关

重建 Selinux 相关条目

genhomedircon

重建 Selinux 安全标签

fixfiles -f relabel
touch /.autorelabel

重建 Selinux 配置文件指向

rm -f /etc/sysconfig/selinux
ln -s ../selinux/config /etc/sysconfig/selinux

3.4.6 、配置 fstab 并挂载根分区

查看设备分区清单

lsblk

查看每个分区的 UUID

blkid

根据 UUID  添加根目录挂载到 fstab,请注意 修改 UUID 并且 保证分区格式正确
(还可以根据磁盘名挂载,比如 /dev/vda1 / ext4 defaults 0 0

vim /etc/fstab

UUID=026f00e4-cc0e-466d-af91-f36e247325a2 / ext4 defaults 0 0

3.5 、完成安装

配置主机密码

exit
exit
passwd

取消挂载所有设备

mount |grep target |awk '{ print $3 }' |xargs umount -lf

设置 SSH 开机启动和防火墙规则允许

systemctl enable sshd
systemctl enable firewalld
firewall-cmd --add-service=ssh --per

准备重启

reboot

(可选) 重启后配置语言环境和 hostname

hostnamectl set-hostname linux.example.com
localectl set-locale LANG=en_US.utf8

在系统中关闭 selinux(以下两个命令都可以)

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

实际上的/etc/sysconfig/selinux 文件是指向于/etc/selinux/config 的

[[email protected] ~]# ll /etc/sysconfig/selinux
lrwxrwxrwx. 1 root root 17 Mar 13 2017 /etc/sysconfig/selinux -> ../selinux/config

4 、实施讲解

简单讲解一些操作注意的地方


4.1 、挂载 ISO 到本地作为本地镜像源

本地源镜像的优点就是可以离线部署,并且免除了下载速度慢的烦恼
默认 CentOS 自带了本地镜像源的配置,但是没有启动罢了。
所以我们直接调用本地镜像源即可使用。

mkdir /etc/yum.repos.d/backup/
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
cp /etc/yum.repos.d/backup/CentOS-Media.repo /etc/yum.repos.d/CentOS-Media.repo
sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/CentOS-Media.repo

yum 源配置好了,接下来我们就要把镜像挂载到对应的文件夹下

mkdir /media/CentOS
mount -o loop CentOS-7-x86_64-Minimal-1804.iso /media/CentOS

当两个都配置好了时,我们就可以使用 yum 本地源了。

yum clean all
yum update

当然,如果你觉得本地源用完了想恢复回去,也很简单

rm -f /etc/yum.repos.d/*.repo
mv /etc/yum.repos.d/backup/*.repo /etc/yum.repos.d/
rm -rf /etc/yum.repos.d/backup/
umount -v /media/CentOS/
rm -rf /media/CentOS/
yum clean all

如果你不想要默认的位置挂载 yum 源,可以直接自己配置路径 (下方配置路径为/templinux/localyum/)

echo "[local-yum]
name=CentOS-$releasever - Media
baseurl=file:///templinux/localyum/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7" > /etc/yum.repos.d/centos-localyum.repo

请注意如果你想在上面的操作里使用本地源挂载,你需要注意在临时系统和新系统下,文件路径的不同问题。


4.2 、网络配置文件的说明

对于 CentOS,网络配置文件默认在/etc/sysconfig/network-scripts/中,以 ifcfg 为前缀的文件名。

关于系统网卡设备的信息,可以以下命令查看,下方我们可以查看到我们的网卡设备名为 ens33
关于 NetworkManager 相关的更多信息,可以参阅 [ 链接 ]

[[email protected] ~]# ls /sys/class/net/
ens33  lo
[[email protected] ~]# udevadm test-builtin net_id /sys/class/net/eth0 2> /dev/null
ID_NET_NAME_MAC=enx000c2970505eID_OUI_FROM_DATABASE=VMware, Inc.ID_NET_NAME_PATH=enp2s1ID_NET_NAME_SLOT=ens33
[[email protected] ~]# nmcli dev show ens33
GENERAL.DEVICE: ens33GENERAL.TYPE: ethernetGENERAL.HWADDR: 00:0C:29:70:50:5EGENERAL.MTU: 1500GENERAL.STATE: 100 (connected)GENERAL.CONNECTION: UpLink-ens33GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/2WIRED-PROPERTIES.CARRIER: onIP4.ADDRESS[1]: 192.168.188.129/24IP4.GATEWAY: 192.168.188.2IP4.DNS[1]: 192.168.188.2IP4.DOMAIN[1]: localdomainIP6.ADDRESS[1]: fe80::5630:67a0:6589:e171/64IP6.GATEWAY: --
[[email protected] ~]# nmcli con show
NAME UUID TYPE DEVICEUpLink-ens33 07773715-e357-4e62-866c-afeb9731f992 802-3-ethernet ens33

首先放一份标准的静态 IP 的配置文档 ( /etc/sysconfig/network-scripts/ifcfg-eth0 )  参考文章 [链接]
请注意下方配置中的"**网络设备关联**"的配置至少关联一个,用于配置文件对应网络设备。

TYPE=Ethernet 
网络类型=以太网
EthernetNAME=UpLink-ens33
网络显示名称=UpLink-ens33(这个备注的名字只是方便管理用的)
UUID=07773715-e357-4e62-866c-afeb9731f992
**网络设备关联**UUID=(注意参考上访的网卡设备 UUID)
HWADDR=00:0C:29:70:50:5E
**网络设备关联**MAC 地址=00:0C:29:70:50:5E(物理地址)
DEVICE=ens33
**网络设备关联**设备名=ens33
ONBOOT=yes 是否开机加载配置=是

BOOTPROTO=none
网络地址状态=none 不启用协议 (可以视作静态地址),static 是静态地址,dhcp 是自动获取地址
IPADDR=10.1.0.25
IPV4 网络地址=10.1.0.25
PREFIX=24
IPV4 掩码长度=24(表示网络位和位数),另一种表示子网掩码的方式为 NETMASK=255.255.255.0
GATEWAY=10.1.0.1
IPV4 网关地址=10.1.0.1
DEFROUTE=yes
是否为默认 IPV4 网关=是
PEERDNS=no
是否自动获取 IPV4 的 DNS=否 (开启会刷新/etc/resolv.conf)
PEERROUTES=no
是否自动获取 IPV4 网关=否
IPV4_FAILURE_FATAL=no
IPV4 配置失败是否关闭端口=否,(配置失败后不关闭端口, 比如使用 IPV6)
DNS1=1.1.1.1
配置第 1 个 DNS 解析服务器地址 (添加此配置会刷新/etc/resolv.conf)

IPV6INIT=yes
是否启用 IPV6=是
IPV6_AUTOCONF=yes
是否启用 IPV6 的自动配置=是
IPV6ADDR="2001::2001/64"
IPV6ADDR="2001::2002/64"
IPV6 网络地址=(IPV6 可以配置多个 IPV6 地址)
IPV6_DEFROUTE=yes
是否为默认 IPV6 网关=是
IPV6_PEERDNS=yes
是否自动获取 IPV6 的 DNS=是 (开启会刷新/etc/resolv.conf)
IPV6_PEERROUTES=yes
是否自动获取 IPV6 网关=是
IPV6_FAILURE_FATAL=no
IPV6 配置失败是否关闭端口=否,(配置失败后不关闭端口,比如使用 IPV4)
DNS2=2606:4700:4700::1111DNS3=2606:4700:4700::1001
配置第 2 个 DNS 解析服务器地址 (添加此配置会刷新/etc/resolv.conf)

4.3 、 NTP 服务 Chronyd 的使用

CentOS7 自带了 Chronyd 时间同步服务,一些 Linux 发行版还会使用 systemd-timedated 作为默认的 NTP [ 链接 ]

vim /etc/chrony.conf

#在国内可以替换为 aliyun 的 NTP 服务器,前两个是安徽中科大和北京中科院
#server time.ustc.edu.cn iburst
#server ntp.ntsc.ac.cn iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
server ntp4.aliyun.com iburst
server ntp5.aliyun.com iburst
server ntp6.aliyun.com iburst
server ntp7.aliyun.com iburst

#作为服务端允许其他终端来此同步时间
allow 192.168.0.0/24

最后还需要启动服务和运行

systemctl enable chronyd
systemctl start chronyd

Windows 测试 NTP 服务器的命令如下

w32tm /stripchart /computer:time.windows.com

5 、后期修订

20181203 、应他人需求添加一份自动脚本,推荐 Vicer 的 Linux 脚本地址 [ 链接脚本如出现问题请联系作者

20181214 、添加阿里云官方的卸载安骑士的方法 [  链接 ]

20181220 、应他人需求添加阿里云轻量服务器的购买地址,国外支持香港和新加坡, 1C1G=24 元/月、 2C2G=67 元/月 [  链接 ]


6 、相关链接

CentOS 7 镜像站列表 [ 链接 ]

CentOS 7 RPM 包文件列表 [ 链接 ]

Linux RPM 包信息查询站点 [ 链接 ]

CentOS 7 WIKI  手动安装说明 [ 链接 ]

Vps2Arch Github  脚本地址 [ 链接 ]

NMCLI 网卡管理工具自动生成的配置文件讲解 [  链接 ]

使用 NETWORKMANAGER 命令行工具 NMCLI [ 链接 ]

Ubuntu 时间同步 [ 链接 ]

StarryVoid

Have a good time