基于 Parallels 尝鲜 CentOS-8
Table of Contents
之前为了应对在跨语言开发过程中,需要折腾各种开发环境,我做了一个工具包 runX 来自动化环境部署的过程, 当全新的 CentOS-8 可用后,我就一直想折腾一把,毕竟 7 的内核版本实在太低了。因为最近又对环境部署和自动化工具有些新的想法, 干脆一气呵成,直接在工具集中把这些想法实现出来,但是考虑到变化比较大,而且 runX 本身其实已经是稳定状态, 所以索性搞一个 runX 的全新升级版 Lego。
Lego,旨在想搭积木一样来组合各种部署功能,因为在 runX 这几年的使用过程中,发现经常还是会有些复用的功能, 在 k8s-start 项目中我试验了这种积木的思想,发现很受用。重新整理 runX 到 Lego,主要包含以下几个方面:
- 最核心的当然是积木的思想,所有的方法和模块都是可组合的。
- 新装虚拟机当前可能无法做到完全自动化,但是可以通过组合的方式实现半自动化。
下面是装机初始的一些步骤,相关的代码会逐步整理到 Lego 这个项目中。
Base 装机步骤
- 修改运行级别,CentOS 7 通过修改 /etc/inittab 已经过时,CentOS 8 使用 Target,见下
- 通网,往后的各种操作都需要联网进行(设置免密登陆,后续操作都可以通过 ssh 完成)
- 更换阿里云的 yum 源,阿里云已经建了 CentOS 8 的 yum 源,因为安装 Parallels Tools 依赖的包需要
- 安装 Parallels Tools(否则无法共享目录,以及使用命令行 prlctl 命令控制 pvm)
- 关机,设置共享文件夹等通用设置(关机后,在 Parallels 图形界面进行设置较为方便,目前尚未研究通过 prlctl 命令来设置)
- 安装 Parallels Tools 后,就可以将 Mac 宿主机中的 runX 项目挂载到 pvm 中,运行相关自动化脚本,比如一些基础设置(/etc/profile,/etc/sudoers 等)
修改运行级别,关闭图形界面
systemctl set-default multi-user.target # run level 3
systemctl set-default graphical.target # run level 5
Removed /etc/systemd/system/default.target
Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target
通网
目前 CentOS 8 默认的网络设备为 enp0s5,而不是 eth0,管理工作也由 nmcli 来完成
修改 /etc/sysconfig/network-scripts/ifcfg-enp0s5
文件的内容,然后运行 nmcli c reload
重启
这里主要将 IP 的获取方式由 dhcp
方式修改为静态 IP,相关设置列举如下:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s5
UUID=xxx-334e-4f70-a808-66b097fd4ba1
DEVICE=enp0s5
ONBOOT=yes
IPADDR="10.xxx.xxx.xxx"
NETMASK="255.255.255.0"
GATEWAY="10.xxx.xxxx.1"
更换 yum 源
这里选择阿里云的 yum 源(阿里云率先支持了 CentOS 8 的 yum 源)
首先备份原始源:sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
修改 /etc/yum.repos.d/CentOS-Base.repo
的 baseurl 为 baseurl=https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/
修改 /etc/yum.repos.d/CentOS-AppStream.repo
的 baseurl 为 baseurl=https://mirrors.aliyun.com/centos/$releasever/AppStream/$basearch/os/
最后更新缓存使 yum 源的变更生效:
sed -i 's/#baseurl=.*/baseurl=https:\/\/mirrors.aliyun.com\/centos\/$releasever\/BaseOS\/$basearch\/os\//g' /etc/yum.repos.d/CentOS-Base.repo
sed -i 's/#baseurl=.*/baseurl=https:\/\/mirrors.aliyun.com\/centos\/$releasever\/AppStream\/$basearch\/os\//g' /etc/yum.repos.d/CentOS-AppStream.repo
sudo yum clean all
sudo yum makecache
安装 Parallels Tools
Parallels Tools 的安装依赖 epel 和 dkms,而当前 dkms 仅提供了 src.rpm 包,需要下载后自行编译。下面是安装步骤:
- 安装 epel 和 rpm-build(后面编译安装 src.rpm 包需要)
- rpm-build 编译安装 dkms src.rpm 包
Parallels 图形界面挂载 Parallels Tools 安装包,进行安装
sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm \ rpm-build curl -fSL https://linux.itecs.ncsu.edu/redhat/ncsu/rhel8-beta-needed/8/SRPMS/dkms-2.6.1-1.el8.src.rpm -o dkms-2.6.1-1.el8.src.rpm rpmbuild --rebuild --clean dkms-2.6.1-1.el8.src.rpm # 从编译结果中找到生成的 RPM 包,/home/z/rpmbuild/RPMS sudo yum install -y /home/z/rpmbuild/RPMS/noarch/dkms-2.6.1-1.el8.noarch.rpm [ ! -d /media/cdrom ] && sudo mkdir /media/cdrom sudo mount | grep iso9660 sudo umount /dev/cdrom \ mount -o exec /dev/cdrom /media/cdrom \ cd /media/cdrom/ \ ./install
免密登陆 mac -> pvm
免密登陆的 2 个关键:
- 在于目标机器的
~/.ssh/authorized_keys
文件中是否包含当前机器用户的~/.ssh/id_rsa.pub
文件中的内容。 - 限制
~/.ssh
目录的权限为 700,~/.ssh/authorized_keys
文件的权限为 600。
如下:
mkdir -m 700 -p ~/.ssh
sudo su - && mkdir -m 700 -p ~/.ssh
# 将 id_rsa.pub 的内容 添加到要登陆机器的 authorized_keys 中
STATIC_IP="目的 IP 地址"
scp ~/.ssh/id_rsa.pub z@${STATIC_IP}:~/.ssh/authorized_keys
scp ~/.ssh/id_rsa.pub root@${STATIC_IP}:~/.ssh/authorized_keys
反向免密登陆 pvm -> mac
设置方式与正向免密是一个道理,但其实并不需要设置,直接退出就回来了。
# ssh-keygen -t rsa 生成 id_rsa id_rsa.pub
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
过程中遇到如下问题
- Parallels 15 才能正常安装(怀疑是 Parallels 14 与 MacOSX Catania 的兼容问题)
- 手动安装 Parallels Tools(1. 需要先通网;2. 手动编译安装 dkms)
- 通网,默认网络设备不再是 eth0
- prlctl 执行 pvm 命令报错:How to fix ‘sudo: no tty present and no askpass program specified’ error?
这个错误是因为
/etc/sudoers
文件中尚未设置当前用户拥有 root 权限