由于 CentOS 6 与 CentOS 7 的目录结构有一些差异,因此 CentOS 6 难以直接升级到 CentOS 7。本文提出一种在新分区上安装 CentOS 7,再修改启动项,以实现系统的升级。整个安装过程使用 ssh 远程操作,无需使用启动 U 盘。
创建新分区
系统分区结构
/dev/sda1 # boot 分区
/dev/sda2 # 根分区
/dev/sdb1 # 新系统根分区
格式化并挂载新系统的根分区
sudo yum -y install xfsprogs xfsdump
sudo mkfs.xfs /dev/sdb1
sudo mount /dev/sdb1 /mnt
安装 chroot 系统
sudo mkdir -p /mnt/var/lib/rpm
sudo rpm --rebuilddb --root=/mnt
curl -O 'http://mirrors.ustc.edu.cn/centos/7/os/x86_64/Packages/filesystem-3.2-25.el7.x86_64.rpm'
sudo rpm --root=/mnt --nodeps -i filesystem-3.2-25.el7.x86_64.rpm
curl -O 'http://mirrors.ustc.edu.cn/centos/7/os/x86_64/Packages/centos-release-7-7.1908.0.el7.centos.x86_64.rpm'
sudo rpm --root=/mnt --nodeps -i centos-release-7-7.1908.0.el7.centos.x86_64.rpm
sudo rpm --root=/mnt --import /mnt/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-*
sudo mount --bind /boot/ /mnt/boot/
sudo yum --installroot=/mnt update
sudo yum --installroot=/mnt reinstall -y filesystem
sudo yum --installroot=/mnt groupinstall -y "Core" "Minimal Install"
sudo yum --installroot=/mnt install -y lvm2 mdadm # Important!
修改 /etc/fstab
sudo cp /etc/fstab /mnt/etc/
查看磁盘 UUID。
$ sudo blkid
/dev/sda1: UUID="3dba5ca3-fd24-411c-bc87-4b44f0f78eea" TYPE="ext4"
/dev/sda2: UUID="p40eSj-OROh-yhan-OF7H-iOix-cGj3-cxdd3Y" TYPE="LVM2_member"
/dev/sdb1: UUID="244f600a-f457-4e53-b112-5cfd8ef79514" TYPE="xfs"
/dev/mapper/VolGroup00-LogVol01: UUID="ae11cc28-703e-4a98-ae59-cd3ee495189f" TYPE="swap"
/dev/mapper/VolGroup00-LogVol00: UUID="4028e39e-809e-40b8-8953-6655316b4238" TYPE="ext4"
复制 /dev/sdb1
的 UUID,编辑 /mnt/etc/fstab
,修改根分区挂载点。
即将
/dev/mapper/VolGroup00-LogVol00 / ext4 defaults 1 1
替换为
UUID=244f600a-f457-4e53-b112-5cfd8ef79514 / xfs defaults 1 1
网络配置
sudo cp /etc/sysconfig/network-scripts/ifcfg-* /mnt/etc/sysconfig/network-scripts/
Chroot 到 CentOS 7
sudo mount -t proc proc /mnt/proc
sudo mount --bind /dev /mnt/dev
sudo mount --rbind /sys /mnt/sys
sudo cp /etc/resolv.conf /mnt/etc
sudo chroot /mnt /bin/bash
更新 grub 菜单
sudo yum -y install grub2
sudo grub2-install /dev/sda # /boot 分区所在磁盘
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
SSH 服务配置
sudo yum install -y openssh-server openssh-clients
sudo systemctl enable sshd
用户配置
设置 root 密码(当前 root 密码处于未设置的状态,不设置 root 密码会导致无法以 root 用户登录)。
passwd
也可以创建一个新用户。
adduser test
passwd test
cat << EOF | sudo tee /etc/sudoers.d/test
test ALL=(ALL) ALL
EOF
禁用 selinux
编辑 /etc/selinux/config
,将 SELINUX=enforcing
改为 SELINUX=disabled
。
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
重启进入 CentOS 7
退出 Chroot 系统
exit
umount 和重启
sudo umount /mnt/boot /mnt/proc /mnt/sys /mnt/dev
sudo umount /mnt
sudo reboot
Problem
failed to connect to system bus
systemd-logind failed to connect to system bus no such file or directory
这是由于文件系统 layout 不对导致的错误。在 CentOS 7 中 /var/run
必须是指向 /run
的一个软链接。因此在安装其他软件包之前要安装 filesystem
。
https://forums.gentoo.org/viewtopic-t-1079204-start-0.html
lost lvm partitions
重启进入 CentOS 7 后,可能无法挂载磁盘上的 lvm 卷。
sudo yum install -y lvm2 mdadm
执行以下命令查看 lvm 卷情况,可以看出有一个 Volume Group,名为 VolGroup00
,它有两个 Logic Volume,处于 INACTIVE
的状态,并且在 /dev
下找不到它们对应的设备文件 (/dev/VolGroup00/LogVol01
, /dev/dm-0
, etc)。
$ sudo vgscan
Reading volume groups from cache.
Found volume group "VolGroup00" using metadata type lvm2
$ sudo lvscan
INACTIVE '/dev/VolGroup00/LogVol01' [1.50 GiB] inherit
INACTIVE '/dev/VolGroup00/LogVol00' [38.25 GiB] inherit
执行以下命令以启用 lvm 卷。
vgchange -a y VolGroup00
查看 lvm 卷情况,可以看到这两个 Logic Volume 都处于 ACTIVE
的状态了,并且在 /dev
目录下存在它们对应的设备文件 (/dev/VolGroup00/LogVol01
, /dev/dm-0
, etc)。
$ sudo lvscan
ACTIVE '/dev/VolGroup00/LogVol01' [1.50 GiB] inherit
ACTIVE '/dev/VolGroup00/LogVol00' [38.25 GiB] inherit
通过以下命令可以挂载 lvm 分区。
sudo mount /dev/VolGroup00/LogVol00 /mnt
Reference
- https://watchmysys.com/blog/2015/02/installing-centos-7-with-a-chroot/