最近学习了国内某公有云的linux云主机启动之后,在镜像内部的初始化过程,分享出来,仅供参看。
一、开机过程
可以看到开机时候按照数字顺序执行了一连串的脚本,其中也提示的该公有云厂商的名字的ucloud,最后一条显示做了清理工作。
进系统一看 果然找不到这些脚本了。
二、进单用户模式找出这些脚本 想让开机的时候不让最后一步 999-clwanup.sh执行的办法很多,我采取的的办法是单用户模式,简单上个图,具体方法大家谷歌下。
成功进入单用户模式,并复制他的初始化脚本
三 初始化过程分析 (一) 脚本执行的入口还是传统的/etc/rc.local,主程序是bootstrap.sh /ucloud_boot/bootstrap.sh 目录如下图(可耻的把uuid匿了,怕ucloud的人来砍我)
主程序代码:注释我加的#!/bin/bash script_abs=$(readlink -m "$0") script_dir=$(dirname $script_abs) #这两行是获取执行目录,之所以搞得复杂我觉得可能有些镜像用了软连接) cd $script_dir . lib/utils.sh #导入几个函数 for module in $(ls modules/*.sh | sort) #按照数字排列执行 modules目录下sh文件 do $(. $module) if [[ $? != 0 ]]; then echo "[$module] failed" else echo "[$module] succeed" fi done if [[ -d "$BOOTSTRAP_DIR" ]]; then #估计是老的写法代码没删掉 rm -rf $BOOTSTRAP_DIR fi 每个模块 解释 050-sysprep.sh (删除系统存在过的网卡mac信息) 100-interface.sh (写入新的网卡信息到 ifcfg文件) 101-cleanup-ethX-bak.sh (清楚旧网卡备份) 110-dns.sh (设置dns) 120-hostname.sh(设置hostname) 150-fix-epel-key.sh (修改epel源配置) 200-password-root.sh (设置密码) 300-disk.sh (如果有新的硬盘 挂在到 /data) 700-add-rpmforge-repo.sh 701-add-remi-repo.sh 703-add-10gen-repo.sh 749-exclude-kernel-update.sh (更新yum设置) 750-localize-repo.sh 设置yum源 760-lock-minor-version.sh 设置yum源版本 799-clear-yum-repos.sh 清理yum目录 800-skip-fstab-check.sh 强制开机时候不检查硬盘 801-update-ntp-server.sh 设置ntp 803-disable-service.sh 如果没有装docker的话禁用iptables 810-disable-GSSAPIAuth.sh 修改sshd的配置 850-optimize-sysctl.sh 调整网络参数 ulimit 855-cp-syslog.sh 设置日志轮转 860-install-updates.sh 更新bash 和glibc 880-cp-set-irq-affinity.sh 996-install-sysstat.sh.disabled 997-install-kdump.sh.disabled 998-cleanup-last.sh 清理现场 999-cleanup.sh 清理历史记录 脚本文件展示到此结束,然后还发现了一点,history 和 bash_history 竟然没有清理 四 部分镜像制作过程 下面展示了ucloud虚拟机制作过程,概括起来有这么几件事情:改用他内核(不知道是不是他自己定制的);禁用防火墙;禁用常规服务以节约内存,修改串口日志输出,设置yum源 1 2016-07-21 12:52:26 ls 2 2016-07-21 13:14:33 ll /etc/grub.conf 3 2016-07-21 13:16:22 rm -f /etc/grub.conf ;ln -s /boot/grub/grub.conf /etc/grub.conf 4 2016-07-21 13:16:27 ll /etc/grub.conf 5 2016-07-21 13:16:43 rz 6 2016-07-21 13:19:11 ll /etc/grub.conf 7 2016-07-21 13:21:20 wget http://static.ucloud.cn/kernel/2.6.32-431.11.25.el6.ucloud.x86_64.tar.gz 8 2016-07-21 13:22:53 tar -zxvf 2.6.32-431.11.25.el6.ucloud.x86_64.tar.gz 9 2016-07-21 13:23:02 ls 10 2016-07-21 13:25:19 cd 2.6.32-431.11.25.el6.ucloud.x86_64 11 2016-07-21 13:25:28 ls 12 2016-07-21 13:31:00 /sbin/iptables -P INPUT ACCEPT && /sbin/iptables -F ; service iptables stop 13 2016-07-21 13:31:18 ls 14 2016-07-21 13:31:25 bash install.sh 15 2016-07-21 13:48:17 ls 16 2016-07-21 13:50:04 yum -y install lsof iotop sysstat 17 2016-07-21 13:51:34 chkconfi --list 18 2016-07-21 13:51:39 chkconfig --list 19 2016-07-21 13:53:43 getenforce 20 2016-07-21 13:59:06 chkconfig --level auditd 123456 0ff 21 2016-07-21 13:59:26 chkconfig --level auditd 123456 0ff 22 2016-07-21 14:00:18 chkconfig auditd --level 123456 0ff 23 2016-07-21 14:01:05 chkconfig auditd --level 123456 off 24 2016-07-21 14:04:23 chkconfig blk-availability --level 123456 off 25 2016-07-21 14:04:23 chkconfig cgconfig --level 123456 off 26 2016-07-21 14:04:23 chkconfig cgred --level 123456 off 27 2016-07-21 14:04:23 chkconfig dnsmasq --level 123456 off 28 2016-07-21 14:04:23 chkconfig fcoe --level 123456 off 29 2016-07-21 14:04:23 chkconfig ip6tables --level 123456 off 30 2016-07-21 14:04:23 chkconfig iptables --level 123456 off 31 2016-07-21 14:04:23 chkconfig iscsi --level 123456 off 32 2016-07-21 14:04:23 chkconfig iscsid --level 123456 off 33 2016-07-21 14:04:23 chkconfig kdump --level 123456 off 34 2016-07-21 14:04:23 chkconfig lldpad --level 123456 off 35 2016-07-21 14:04:23 chkconfig lvm2-monitor --level 123456 off 36 2016-07-21 14:04:23 chkconfig mdmonitor --level 123456 off 37 2016-07-21 14:04:23 chkconfig multipathd --level 123456 off 38 2016-07-21 14:04:23 chkconfig netconsole --level 123456 off 39 2016-07-21 14:04:23 chkconfig netfs --level 123456 off 40 2016-07-21 14:04:23 chkconfig nfs --level 123456 off 41 2016-07-21 14:04:23 chkconfig nfslock --level 123456 off 42 2016-07-21 14:04:23 chkconfig pppoe-server --level 123456 off 43 2016-07-21 14:04:23 chkconfig rdisc --level 123456 off 44 2016-07-21 14:04:23 chkconfig restorecond --level 123456 off 45 2016-07-21 14:04:23 chkconfig rpcbind --level 123456 off 46 2016-07-21 14:04:23 chkconfig rpcgssd --level 123456 off 47 2016-07-21 14:04:23 chkconfig rpcidmapd --level 123456 off 48 2016-07-21 14:04:23 chkconfig rpcsvcgssd --level 123456 off 49 2016-07-21 14:04:23 chkconfig saslauthd --level 123456 off 50 2016-07-21 14:04:23 chkconfig sendmail --level 123456 off 51 2016-07-21 14:04:23 chkconfig udev-post --level 123456 off 52 2016-07-21 14:04:24 chkconfig wpa_supplicant --level 123456 off 53 2016-07-21 14:04:49 chkconfig --list | grep ":on" 54 2016-07-21 14:05:50 cd 55 2016-07-21 14:06:02 ll /etc/grub.conf 56 2016-07-21 14:07:17 rm -rfv /root/.ssh/* /tmp/* ; rm -fv /root/* 57 2016-07-21 14:07:31 ls 58 2016-07-21 14:07:48 rpm -qa | grep kernel 59 2016-07-21 14:26:35 rpm -e kernel-firmware-2.6.32-431.11.21.el6.ucloud.x86_64 60 2016-07-21 14:26:36 rpm -e kernel-headers-2.6.32-431.11.21.el6.ucloud.x86_64 61 2016-07-21 14:26:36 rpm -e kernel-2.6.32-431.11.22.el6.ucloud.x86_64 62 2016-07-21 14:26:37 rpm -e kernel-devel-2.6.32-431.11.22.el6.ucloud.x86_64 63 2016-07-21 14:26:39 rpm -e kernel-2.6.32-431.11.15.el6.ucloud.x86_64 64 2016-07-21 14:26:39 rpm -e kernel-devel-2.6.32-431.11.15.el6.ucloud.x86_64 65 2016-07-21 14:26:41 rpm -e kernel-firmware-2.6.32-431.11.22.el6.ucloud.x86_64 66 2016-07-21 14:26:41 rpm -e kernel-headers-2.6.32-431.11.22.el6.ucloud.x86_64 67 2016-07-21 14:26:41 rpm -e kernel-firmware-2.6.32-431.11.15.el6.ucloud.x86_64 68 2016-07-21 14:26:42 rpm -e kernel-headers-2.6.32-431.11.15.el6.ucloud.x86_64 69 2016-07-21 14:26:42 rpm -e kernel-2.6.32-431.11.21.el6.ucloud.x86_64 70 2016-07-21 14:26:45 rpm -e kernel-devel-2.6.32-431.11.21.el6.ucloud.x86_64 71 2016-07-21 14:26:52 rpm -qa | grep kernel 72 2016-07-21 14:27:48 rpm -qa | grep kernel |grep 431 | wc -l 73 2016-07-21 14:29:00 rm -f /etc/grub.conf ;ln -s /boot/grub/grub.conf /etc/grub.conf 74 2016-07-21 14:29:11 ll /etc/grub.conf 75 2016-07-21 14:30:05 rm -rfv /root/.ssh/* /tmp/* ; rm -fv /root/* 76 2016-07-21 14:30:19 ls 77 2016-07-21 14:31:18 yum check all 78 2016-07-21 14:31:54 yum -y install yum-utils 79 2016-07-21 14:33:26 yum-complete-transaction 80 2016-07-21 14:33:59 cd 81 2016-07-21 14:34:01 ls 82 2016-07-21 14:34:14 package-cleanup --dupes (清理yum安装软件剩余的缓存) 83 2016-07-21 14:34:32 package-cleanup --cleandupes 84 2016-07-21 14:42:13 cd /etc/yum.repos.d/ 85 2016-07-21 14:42:14 ls 86 2016-07-21 14:43:37 chkconfig --list | grep ":on" | wc -l 87 2016-07-21 14:43:47 chkconfig --list | grep ":on" 88 2016-07-21 14:45:11 ll 89 2016-07-21 14:46:42 ll /etc/yum.repos.d/ 90 2016-07-21 14:46:47 ll /etc/yum.repos.d/ | wc -l 91 2016-07-21 14:49:00 more CentOS-Base.repo 92 2016-07-21 14:50:01 sed -i 's/centos.mirror.ucloud.cn/mirrors.ucloud.cn/g' /etc/yum.repos.d/CentOS-Base.repo 设置yum源 93 2016-07-21 14:50:33 sed -i 's/centos.mirrors.ucloud.cn/mirrors.ucloud.cn/g' /etc/yum.repos.d/CentOS-Base.repo 94 2016-07-21 14:50:51 more CentOS-Base.repo 95 2016-07-21 14:51:57 more epel.repo 96 2016-07-21 14:53:13 sed -i 's/epel.mirror.ucloud.cn/mirrors.ucloud.cn/g' /etc/yum.repos.d/epel.repo 设置epel源 97 2016-07-21 14:53:27 more epel.repo 98 2016-07-21 15:00:16 more /boot/grub/grub.conf 99 2016-07-21 15:03:50 cat /boot/grub/grub.conf | grep title | wc -l 100 2016-07-21 15:07:25 cat /boot/grub/grub.conf | grep 'console=tty1 console=ttyS0,115200n8' | wc -l 101 2016-07-21 15:07:55 cd 102 2016-07-21 15:08:36 cat /etc/securetty | grep ttyS0 | wc -l 103 2016-07-21 15:10:35 ls / 104 2016-07-21 15:10:54 rm -rf /boot_ucloud/ 105 2016-07-21 15:10:58 ls / 106 2016-07-21 15:12:02 reboot 107 2016-07-21 15:41:22 poweroff 108 2016-09-13 15:03:31 ll 109 2016-09-13 15:03:41 tail /var/log/secure 110 2016-09-13 15:04:49 cat /root/.bash_history 111 2016-09-13 15:05:01 vim /root/.bash_history 112 2016-09-13 15:06:32 sz /root/.bash_history 113 2016-09-13 15:07:13 history 114 2016-09-13 15:07:52 history >history.txt 五 总结: 从表面看,ucloud的镜像启动过程和制作镜像过程做的比较粗糙,脚本写的比较乱,前后风格完全不一致,基本没有对centos本身调优。
附件为本文中所有提到的文件,ucloud的朋友要是看到了别来砍我哦。
另外windows没有单用户模式,安全模式也是要密码的,其实也是有办法的,等有空了我来搞一把。
题外话,连aws现在都采用cloud-init来初始化虚拟机了,再用传统的脚本是不是有点low啊。
