0. 背景 由于工作环境是 ESXi 虚拟化,需要经常用一些模板开部署一些虚拟机,由于我的机器没有连接上 vCenter,只能靠上传 OVA 等虚拟机模板来部署,因此需要搓一些虚拟机模板出来。宿主机系统有 Debian 10、Debian 9、Ubuntu1804、Ubuntu 1604、CentOS7.6、Alpine 3.10、OpenWrt/LEDE ,还有 Windows 😂。一般最小化安装之后还是有可以精简的余地,删除掉一些不用的软件包,系统一般情况下都能精简到 700MB 左右,再使用 dd 暴力清零剩余空间,最后导出的 OVA 虚拟机模板在 450MB 左右。这样部署和上传的速度大大加快了。
1. Ubuntu 1804 1. 安装镜像 ubuntu-18.04.3-server-amd64.iso
安装过程就不赘述了,主要是懒,安装过程图还要截图什么的,麻烦😂。建议使用 lvm 分区,安装上 openssh-server 就行,其他的组件一概不用安装,这样能减少系统占用空间的而大小。以后需要安装的话再安装就行。
安装进入系统后使用 sudo passwd
来重置 root 的密码
安装 ncdu 工具结合 du 用来分析系统根分区占用大小情况
1 apt update && apt install ncdu -y
2.默认安装后的系统分区占用情况,虽然在安装的过程中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 root@ubuntu:~ Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 393M 1.1M 392M 1% /run /dev/mapper/ubuntu--vg-ubuntu--lv 28G 5.7G 21G 22% / tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/sda2 976M 76M 834M 9% /boot /dev/loop0 91M 91M 0 100% /snap/core/6350 tmpfs 393M 0 393M 0% /run/user/1000 root@ubuntu:~ total used free shared buff/cache available Mem: 3.8G 213M 2.9G 1.1M 759M 3.3G Swap: 3.8G 0B 3.8G
3.默认给分配了个 swap 文件,使用 swapoff -a 关闭 swap 就行,再修改 fstab 文件,删除 swap 那一行,或注释掉
1 2 3 root@ubuntu:~ root@ubuntu:~ root@ubuntu:~
4.删除 swap file 之后的分区情况,占用的 1.8GB ,如果直接导出的话,OVA 文件至少得 2GB。我们接下来精简系统不需要得包和文件,最终 OVA 大小缩小到 450MB
1 2 3 4 5 6 7 8 9 10 11 root@ubuntu:~ Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 393M 1.1M 392M 1% /run /dev/mapper/ubuntu--vg-ubuntu--lv 28G 1.8G 25G 7% / tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/sda2 976M 76M 834M 9% /boot /dev/loop0 91M 91M 0 100% /snap/core/6350 tmpfs 393M 0 393M 0% /run/user/1000
2. 卸载不用的软件包 1 2 3 rm /etc/cloud apt purge usbutils wireless-regdb linux-modules-extra-4.15.0-58-generic vim-tiny vim-common ubuntu-advantage-tools cloud-* linux-firmware snapd lxd* linux-headers-* git-man landscape-common ubuntu-release-upgrader-core
1 2 3 4 5 6 7 8 9 10 11 12 13 snapd: snapd 从不使用果断卸载 lxd*: 历史遗留下来得容器虚拟化,我有 docker 要你何用? vim-tiny: 默认安装得 vim 死难用,卸载重新装个 vim 就行 cloud-*: 公有云用来导入私钥获取 IP 等等部署虚拟机用到得,自己用不到果断卸载 usbutils: USB 驱动,从不使用,果断卸载。如果你使用 USB 设备得话就保留它 wireless-regdb: 一个无线相关的,用不到 linux-firmware: 里面大部分是网卡蓝牙USB之类得固件,虚拟机用不到 linux-headers-*: 内核源码之类的头文件,用到的时候再安装就行 ubuntu-advantage-tools: 用不到果断卸载 linux-modules-extra-4.15.0-58-generic: 内核模块扩展驱动等,虚拟机很少能用到 git-man: git 的 man 手册,一般用不到 landscape-common: landscape 管理,用不到 ubuntu-release-upgrader-core: 用不到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 The following packages were automatically installed and are no longer required: amd64-microcode eatmydata gdisk intel-microcode iucode-tool libdbus-glib-1-2 libeatmydata1 libuv1 python3-blinker python3-jinja2 python3-json-pointer python3-jsonpatch python3-jsonschema python3-jwt python3-markupsafe python3-oauthlib thermald Use 'apt autoremove' to remove them. The following additional packages will be installed: python3-update-manager Suggested packages: python3-launchpadlib The following packages will be REMOVED: cloud-guest-utils* cloud-init* cloud-initramfs-copymods* cloud-initramfs-dyn-netconf* crda* git* git-man* landscape-common* linux-firmware* linux-generic* linux-headers-4.15.0-58* linux-headers-4.15.0-58-generic* linux-headers-generic* linux-image-generic* linux-modules-extra-4.15.0-58-generic* lxd* lxd-client* snapd* ubuntu-advantage-tools* ubuntu-minimal* ubuntu-release-upgrader-core* ubuntu-server* ubuntu-standard* update-manager-core* update-notifier-common* usbutils* vim* vim-common* vim-tiny* wireless-regdb* The following packages will be upgraded: python3-update-manager 1 upgraded, 0 newly installed, 30 to remove and 75 not upgraded. Need to get 35.1 kB of archives. After this operation, 723 MB disk space will be freed. Do you want to continue ? [Y/n] y
清理卸载后的占用大小
1 2 3 4 5 6 7 8 9 10 11 12 13 root@ubuntu:~ root@ubuntu:~ root@ubuntu:~ Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 393M 1.1M 392M 1% /run /dev/mapper/ubuntu--vg-ubuntu--lv 28G 685M 26G 3% / tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/sda2 976M 41M 868M 5% /boot tmpfs 393M 0 393M 0% /run/user/1000 root@ubuntu:~
3. 清理日志和缓存 1 2 3 rm -rf /var/lib/apt/lists/* rm -rf /var/cache/apt/* rm -rf /var/log /journal/*
4. 清理不用的文件 剩下来能精简的只有 /usr/share
里面的 doc 和 locale 文件里,减小大概 40 MB
1 2 3 4 5 6 7 8 rm -rf /usr/share/doc cd /usr/share/localels | grep -v zh | grep -v en | grep -v us | grep -v @ | grep -v local | xargs rm -rf root@ubuntu:/usr/share/locale 1.5M
最后完毕
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 root@ubuntu:/usr/share/locale Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 393M 1.1M 392M 1% /run /dev/mapper/ubuntu--vg-ubuntu--lv 28G 660M 26G 3% / tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/sda2 976M 41M 868M 5% /boot tmpfs 393M 0 393M 0% /run/user/1000 root@ubuntu:/usr/share/locale ncdu 1.12 ~ Use the arrow keys to navigate, press ? for help --- / -------------------------------------------------------------------------------------------------------------- 407.4 MiB [ 109.6 MiB [ 38.2 MiB [ ] /boot 27.5 MiB [ ] /var 14.9 MiB [ ] /bin 14.4 MiB [ ] /sbin 5.0 MiB [ ] /etc 1.1 MiB [ ] /run 52.0 KiB [ ] /tmp 32.0 KiB [ ] /home 20.0 KiB [ ] /root e 16.0 KiB [ ] /lost+found 4.0 KiB [ ] /lib64 e 4.0 KiB [ ] /srv e 4.0 KiB [ ] /opt e 4.0 KiB [ ] /mnt e 4.0 KiB [ ] /media . 0.0 B [ ] /proc 0.0 B [ ] /sys 0.0 B [ ] /dev @ 0.0 B [ ] initrd.img.old @ 0.0 B [ ] initrd.img @ 0.0 B [ ] vmlinuz.old @ 0.0 B [ ] vmlinuz
5. 置零剩余空间 1 2 3 4 5 6 7 8 9 10 root@ubuntu:/usr/share/locale Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 393M 1.1M 392M 1% /run /dev/mapper/ubuntu--vg-ubuntu--lv 28G 660M 26G 3% / tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/sda2 976M 41M 868M 5% /boot tmpfs 393M 0 393M 0% /run/user/1000
经过上面的精简之后,根分区占用 660MB 加上 boot 分区刚好 700 MB 左右。如果现在直接导出 ova 模板的话,vmdk 的体积是很大的,至少 1GB( 1.3G Aug 28 15:48 Ubuntu1804.ova
) ,因此在导出 ova 模板之前需要把磁盘的剩余空间置零,这样导出的 vmdk 文件大小更小,450MB 左右哈。
直接使用 dd 暴力清零就行啦 dd if=/dev/zero of=/zero bs=4M || rm -rf /zero
这个过程比较长,时间取决于你安装虚拟机的时候给定的根分区大小,以及你的磁盘速度
1 2 3 4 5 6 root@ubuntu:~ dd: error writing '/zero' : No space left on device 6860+0 records in 6859+0 records out 28771078144 bytes (29 GB, 27 GiB) copied, 445.634 s, 64.6 MB/s
6. 导出 OVA 虚拟机模板 经过置零后我们再导出 OVA 模板
1 2 464M Aug 28 16:15 Ubuntu1804-2.ova 1.3G Aug 28 15:48 Ubuntu1804.ova
经过置零后,导出的 ova 虚拟机模板体积 460M 左右,骤然减少了接近 2 倍的大小😂
2. Debian 10 1. 安装镜像 安装镜像选用 Debian 的网络版安装镜像,debian-10.0.0-amd64-netinst.iso 其实选择 debian-10.0.0-amd64-netinst.iso 版的也行,在最后不要安装桌面环境就可以。
2. 卸载不用的软件包 1 2 3 4 5 6 7 8 9 sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list sed -i 's|security.debian.org/debian-security|mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list apt update apt install --no-install-recommends --no-install-suggests -y wget ncdu apt purge emacsen-common firmware-linux-free gcc-8-base linux-image-amd64
3. 清理日志和缓存 1 2 3 rm -rf /var/lib/apt/lists/* apt autoclean apt autoremove
4. 清理不用的文件 1 2 3 cd /usr/share/local du -sh * | grep -v en | grep -v zh | grep -v cn | grep -v us | awk '{print $2}' | xargs rm -rf rm -rf /usr/share/doc/*
5. 置零剩余空间 直接使用 dd 暴力清零就行啦 dd if=/dev/zero of=/zero bs=4M || rm -rf /zero
1 2 3 4 5 6 7 8 9 10 11 ╭─root@debian ~ ╰─ Filesystem Size Used Avail Use% Mounted on udev 2.0G 0 2.0G 0% /dev tmpfs 395M 11M 385M 3% /run /dev/mapper/debian--vg-root 26G 698M 24G 3% / tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/sda1 236M 48M 176M 22% /boot tmpfs 395M 0 395M 0% /run/user/0
6. 导出 OVA 虚拟机模板 最终导出的 vmdk 模板为 351M ,棒棒哒😂
1 351M Sep 1 16:17 disk-0.vmdk
3. CentOS 7.6 1. 安装镜像 安装镜像就选择使用CentOS-7-x86_64-Minimal-1810.iso 版的 iso 就行,安装过程就不再赘述啦。磁盘分区建议为 lvm ,因为这个是虚拟机模板文件,并不清楚以后的用途和所占用的空间。使用 lvm 可以很方便地扩展根分区。
2. 卸载不用的软件包 1 2 3 4 5 6 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum install -y wget curl ncdu yum remove linux-firmware NetworkManager mariadb-libs NetworkManager alsa-lib centos-logos.noarch yum list installed | grep firmware | xargs yum remove -y
3. 清理日志和缓存 1 2 3 yum clean all rm -rf /var/cache
4. 清理不用的文件 1 2 3 4 5 6 7 8 9 10 localedef --list-archive | grep -v zh | grep -v us | grep -v en | grep -v cn | xargs localedef --delete-from-archive mv /usr/lib/locale/locale-archive /usr/lib/locale/locale-archive.tmpl build-locale-archive rm -rf /usr/share/doc cd /usr/share/localels | grep -v zh | grep -v en | grep -v us | grep -v @ | grep -v local | xargs rm -rf rm -rf /usr/share/backgrounds
5. 置零剩余空间 直接使用 dd 暴力清零就行啦 dd if=/dev/zero of=/zero bs=4M || rm -rf /zero
最后看一下磁盘空间,占用不到 700M ,还是可以的哈
1 2 3 4 5 6 7 8 9 10 ╭─root@centos ~ ╰─ Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 29G 594M 27G 3% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 9.3M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 488M 113M 340M 25% /boot tmpfs 378M 0 378M 0% /run/user/0
6. 导出 OVA 虚拟机模板 1 348M Sep 1 09:00 disk-1.vmdk
最后导出的虚拟机模板大小不到 350M
4. Alpine 3.10 Alpine 虚拟机本来就很精简啦,其实不用搓也行