使用packer制作vagrant centos box


使用packer制作vagrant box:centos

制作vagrant box,網上有教程,可以自己step by step的操作。不過直接使用虛擬在VirtualBox中制作vagrant box非常的費勁。網上有操作debian/ubuntu相關的文章,放2篇在這里供參考:

做到快結束的時候,就不知道如何解決了。后來發現有個Packer工具。就簡單多了。

下面基於packer來操作centos7的box。所有操作在Mac下完成。對於一個devops,Mac自然是最好的工作環境,而centos則是線上的流行版本。

1 准備工具和文件

mkdir -p /Users/user/myVagrant/packer/src/
cd /Users/user/myVagrant/packer/src/

下載如下文件:

1.1 鏡像 centos7.2

http://mirrors.163.com/centos/7.2.1511/isos/x86_64/sha1sum.txt

http://mirrors.163.com/centos/7.2.1511/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso

注意驗證iso文件的sha1.

shasum CentOS-7-x86_64-Minimal-1511.iso
783eef50e1fb91c78901d0421d8114a29b998478  CentOS-7-x86_64-Minimal-1511.iso

1.2 packer工具

https://www.packer.io/downloads.html

https://www.packer.io/intro/getting-started/setup.html

ls -l 
-rw-r--r--@  1 user  staff   10395909 12 17 23:49 packer_0.12.1_darwin_amd64.zip

unzip packer_0.12.1_darwin_amd64.zip

# 將解壓出來的packer文件移到$PATH可見的目錄,方便后繼操作
sudo mv packer /usr/local/sbin/

1.3 centos.json

這配置也是個神器,和packer配合,真是一對。不然很多工作都得按本文開始說的step by step操作了。先上github:

cd ../
pwd
/Users/user/myVagrant/packer
# 先上退一級目錄

git clone https://github.com/boxcutter/centos.git
cd centos
# 在這里,能看到各個centos版本的配置文件。而且有一個centos.json文件,是沒有版本的

ls -l centos.json centos72.json
-rw-r--r--  1 user  staff  6207 12 17 23:46 centos.json
-rw-r--r--  1 user  staff   459 12 18 09:03 centos72.json
# 這是我們關心的2個配置文件。第一個就預設了安裝的所有參數和命令。可以打開看看
# centos72.json則是用來給用戶填寫需要自定義的部分,用其覆蓋centos.json對應部分

2 准備工作

pwd
/Users/user/myVagrant/packer/centos

# 文件:/Users/user/myVagrant/packer/src/CentOS-7-x86_64-Minimal-1511.iso
# 命令:/usr/local/sbin/packer
# 配置:centos72.json, centos.json

修改centos72.json

這里就幾行配置,需要關心的就是兩類:

  • 系統資源:cpus, disk_size, memory
  • 鏡像文件:檢驗碼,檢驗碼類型,文件路徑

一般只需要修改一下檢驗碼和文件路徑即可。檢驗碼即上面使用shasum得到的串。

需要特別說明的是disk_size,預設的值是65536,單位是G。也就是整個虛機系統的磁盤空間是64G。根據實測的結果,根分區/將得到42G,而/home分區得到21G。

/dev/mapper/centos-root   42G  811M   42G   2% /
/dev/mapper/centos-home   21G   33M   21G   1% /home

這個結果我不太滿意,因此設置為128G,反正是動態分配磁盤空間的。也就不怕大,只怕后面用着對21G空間不夠就麻煩了。

git diff centos72.json

diff --git a/centos72.json b/centos72.json
index 83ed3d5..33d1a2e 100644
--- a/centos72.json
+++ b/centos72.json
@@ -2,11 +2,11 @@
   "_comment": "Build with `packer build -var-file=centos72.json centos.json`",
   "vm_name": "centos72",
   "cpus": "1",
-  "disk_size": "65536",
-  "iso_checksum": "4c6c65b5a70a1142dadb3c65238e9e97253c0d3a",
+  "disk_size": "131072",
+  "iso_checksum": "783eef50e1fb91c78901d0421d8114a29b998478",
   "iso_checksum_type": "sha1",
-  "iso_name": "CentOS-7-x86_64-DVD-1511.iso",
-  "iso_url": "http://mirrors.sonic.net/centos/7.2.1511/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso",
+  "iso_name": "CentOS-7-x86_64-Minimal-1511.iso",
+  "iso_url": "file:///Users/user/myVagrant/packer/src/CentOS-7-x86_64-Minimal-1511.iso",
   "kickstart": "ks7.cfg",
   "memory": "512",
   "parallels_guest_os_type": "centos7"

3 操作

3.1 說明

如https://github.com/boxcutter/centos首頁所說,生成box是調用的packer工具,可以有不同的方法:

  • with packer: packer build xxx
  • with box script: bin/box,是對packer的封裝。
  • with Makefile: 使用make命令

直接使用packer的命令更長,下面使用box命令來操作。其實

$ packer build -var-file=centos71.json centos.json
$ bin/box build centos71
# 這兩個配置是等價的。

因為默認只用於virtualBox虛機環境,因此下面的操作是指明了類型為virtualbox的。

在操作前需要再提醒一個關鍵事項:不要干預后繼命令及virtualBox環境的執行!!!讓它自動完成
你要做的事就是看着下面的注釋,與終端和virtualBox的顯示對比就是了。

3.2 action!!!

# 下面2個命令都可以
# packer build -only=virtualbox-iso -var-file=centos72.json centos.json
bin/box build centos72 virtualbox
 # 注意,在此命令啟動后,會調用virtualBox的啟動虛機。
 # 此時一定不要去點擊該虛機。它會自動向下執行!!!
 # 如果人工干預了,實測系統會中斷在那里。而且進入的是圖形模式
 # 你只有中斷了重來一遍
 
 # 如果你沒有指定virtualbox,則會生成多個虛機平台的box,下面只有virtualbox
virtualbox-iso output will be in this color.

==> virtualbox-iso: Downloading or copying Guest additions
    virtualbox-iso: Downloading or copying: file:///Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso
==> virtualbox-iso: Downloading or copying ISO
    virtualbox-iso: Downloading or copying: file:///Volumes/Storage/software/centos/CentOS-7-x86_64-Minimal-1511.iso
    virtualbox-iso: Error downloading: stat /Volumes/Storage/software/centos/CentOS-7-x86_64-Minimal-1511.iso: no such file or directory
    virtualbox-iso: Downloading or copying: file:///Users/user/myVagrant/packer/src/CentOS-7-x86_64-Minimal-1511.iso
# virtualBox中的虛機在字符模式下自動運行
# 上面是在讀取鏡像文件

==> virtualbox-iso: Starting HTTP server on port 8478
==> virtualbox-iso: Creating virtual machine...
==> virtualbox-iso: Creating hard drive...
==> virtualbox-iso: Creating forwarded port mapping for communicator (SSH, WinRM, etc) (host port 2224)
==> virtualbox-iso: Executing custom VBoxManage commands...
    virtualbox-iso: Executing: modifyvm centos72 --memory 512
    virtualbox-iso: Executing: modifyvm centos72 --cpus 1
    virtualbox-iso: Executing: modifyvm centos72 --paravirtprovider default
    virtualbox-iso: Executing: modifyvm centos72 --nictype1 virtio
==> virtualbox-iso: Starting the virtual machine...
==> virtualbox-iso: Waiting 10s for boot...
# 這時在等開機的安裝選擇,系統會自動處理。virtulBox已經啟動了

==> virtualbox-iso: Typing the boot command...
==> virtualbox-iso: Waiting for SSH to become available...
# 這里自動在自動的安裝加載中,直到系統裝好並重啟,日志都不會再變化

# 觀察這個文件,大小一直在增加,大概有1G左右 
ls -lh output-centos72-virtualbox-iso/centos72.vdi
-rw-------  1 user  staff   576M 12 18 09:13 output-centos72-virtualbox-iso/centos72.vdi
ls -lh output-centos72-virtualbox-iso/centos72.vdi
-rw-------  1 user  staff   867M 12 18 09:14 output-centos72-virtualbox-iso/centos72.vdi
ls -thrl output-centos72-virtualbox-iso/centos72.vdi
-rw-------  1 user  staff   915M 12 18 10:21 output-centos72-virtualbox-iso/centos72.vdi

# 系統主要執行如下相關操作:
# 	安裝包,執行post-install處理,安裝boot loader,配置用戶環境。。。
# 准備好后,會自動重啟,重啟時也不要去干預它!
# 重啟后,virtualBox進行等登陸的界面。這時該命令繼續運行了
==> virtualbox-iso: Connected to SSH!
==> virtualbox-iso: Uploading VirtualBox version info (5.1.10)
==> virtualbox-iso: Uploading VirtualBox guest additions ISO...

# 登陸進系統后,執行 script/fix-slow-dns.sh命令
==> virtualbox-iso: Provisioning with shell script: script/fix-slow-dns.sh
    virtualbox-iso: ==> Applying slow DNS fix
    virtualbox-iso: Restarting network (via systemctl):  [  OK  ]
    virtualbox-iso: ==> Slow DNS fix applied (single-request-reopen)

# 執行script/sshd.sh修改配置。
==> virtualbox-iso: Provisioning with shell script: script/sshd.sh
    virtualbox-iso: ==> Configuring sshd_config options
    virtualbox-iso: ==> Turning off sshd DNS lookup to prevent timeout delay
    virtualbox-iso: ==> Disablng GSSAPI authentication to prevent timeout delay
# 執行其它 腳本    
==> virtualbox-iso: Provisioning with shell script: script/update.sh
==> virtualbox-iso: Provisioning with shell script: script/vagrant.sh
    virtualbox-iso: ==> Configuring settings for vagrant
    virtualbox-iso: ==> Installing Vagrant SSH key
==> virtualbox-iso: Provisioning with shell script: script/desktop.sh
==> virtualbox-iso: Provisioning with shell script: script/vmware.sh
==> virtualbox-iso: Provisioning with shell script: script/virtualbox.sh
    virtualbox-iso: ==> Installing VirtualBox guest additions
    virtualbox-iso: mount: /dev/loop0 is write-protected, mounting read-only
    virtualbox-iso: Verifying archive integrity... All good.
    virtualbox-iso: Uncompressing VirtualBox 5.1.10 Guest Additions for Linux...........
    virtualbox-iso: VirtualBox Guest Additions installer
    virtualbox-iso: Copying additional installer modules ...
    virtualbox-iso: ./install.sh: line 349: bzip2: command not found
    virtualbox-iso: tar: This does not look like a tar archive
    virtualbox-iso: tar: Exiting with failure status due to previous errors
    virtualbox-iso: ./install.sh: line 362: bzip2: command not found
    virtualbox-iso: tar: This does not look like a tar archive
    virtualbox-iso: tar: Exiting with failure status due to previous errors
    virtualbox-iso: ==> Removing packages needed for building guest tools
    virtualbox-iso: Loaded plugins: fastestmirror
    virtualbox-iso: No Match for argument: gcc
    virtualbox-iso: No Match for argument: libmpc
    virtualbox-iso: No Match for argument: mpfr
    virtualbox-iso: No Match for argument: kernel-devel
    virtualbox-iso: No Match for argument: kernel-headers
    virtualbox-iso: No Packages marked for removal
    virtualbox-iso: Loaded plugins: fastestmirror
    virtualbox-iso: No Match for argument: cpp
    virtualbox-iso: No Match for argument: perl
    virtualbox-iso: No Packages marked for removal
==> virtualbox-iso: Provisioning with shell script: script/parallels.sh
==> virtualbox-iso: Provisioning with shell script: script/motd.sh
    virtualbox-iso: ==> Recording box generation date
    virtualbox-iso: ==> Customizing message of the day
==> virtualbox-iso: Provisioning with shell script: custom-script.sh
==> virtualbox-iso: Provisioning with shell script: script/cleanup.sh
    virtualbox-iso: ==> Clear out machine id
    virtualbox-iso: ==> Cleaning up temporary network addresses
    virtualbox-iso: ==> Remove unused man page locales
    virtualbox-iso: /usr/share/man /home/vagrant
    virtualbox-iso: mv: cannot stat ‘en’: No such file or directory
    virtualbox-iso: /home/vagrant
    virtualbox-iso: ==> Clean up yum cache of metadata and packages to save space
    virtualbox-iso: Loaded plugins: fastestmirror
    virtualbox-iso: Cleaning repos: C7.0.1406-base C7.0.1406-centosplus C7.0.1406-extras
    virtualbox-iso: : C7.0.1406-fasttrack C7.0.1406-updates C7.1.1503-base
    virtualbox-iso: : C7.1.1503-centosplus C7.1.1503-extras C7.1.1503-fasttrack
    virtualbox-iso: : C7.1.1503-updates base base-debuginfo base-source c7-media
    virtualbox-iso: : centosplus centosplus-source cr extras extras-source fasttrack
    virtualbox-iso: : updates updates-source
    virtualbox-iso: Cleaning up everything
    virtualbox-iso: ==> Clear core files
    virtualbox-iso: ==> Removing temporary files used to build box
    virtualbox-iso: ==> Rebuild RPM DB
    virtualbox-iso: ==> Clear out swap and disable until reboot
    virtualbox-iso: dd: error writing ‘/dev/dm-1’: No space left on device
    virtualbox-iso: 1025+0 records in
    virtualbox-iso: 1024+0 records out
    virtualbox-iso: 1073741824 bytes (1.1 GB) copied, 3.07468 s, 349 MB/s
    virtualbox-iso: dd exit code 1 is suppressed
    virtualbox-iso: Setting up swapspace version 1, size = 1048572 KiB
    virtualbox-iso: no label, UUID=3c9082d3-be31-4f58-8700-9ab428f5f052
    virtualbox-iso: ==> Zeroing out empty area to save space in the final image
# 上面在清除一些無用的文件,減少box的大小。並將空白區域置0

    virtualbox-iso: dd exit code 1 is suppressed
    virtualbox-iso: dd: error writing ‘/EMPTY’: No space left on device
    virtualbox-iso: 50365+0 records in
    virtualbox-iso: 50364+0 records out
    virtualbox-iso: 52811284480 bytes (53 GB) copied, 139.999 s, 377 MB/s
    virtualbox-iso: ==> Disk usage before cleanup
# 這里的dd命令,可以對應到:http://www.tuicool.com/articles/F7ZjQvy中的:
# 	sudo dd if=/dev/zero of=/EMPTY bs=1M
#	sudo rm -f /EMPTY    
    
    virtualbox-iso: Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 50G 777M 50G 2% / devtmpfs 235M 0 235M 0% /dev tmpfs 245M 0 245M 0% /dev/shm tmpfs 245M 4.3M 241M 2% /run tmpfs 245M 0 245M 0% /sys/fs/cgroup /dev/mapper/centos-home 77G 33M 77G 1% /home /dev/sda1 497M 60M 437M 13% /boot tmpfs 49M 0 49M 0% /run/user/1000
    virtualbox-iso: ==> Disk usage after cleanup
    virtualbox-iso: Filesystem               Size  Used Avail Use% Mounted on
    virtualbox-iso: /dev/mapper/centos-root   50G  811M   50G   2% /
    virtualbox-iso: devtmpfs                 235M     0  235M   0% /dev
    virtualbox-iso: tmpfs                    245M     0  245M   0% /dev/shm
    virtualbox-iso: tmpfs                    245M  4.3M  241M   2% /run
    virtualbox-iso: tmpfs                    245M     0  245M   0% /sys/fs/cgroup
    virtualbox-iso: /dev/mapper/centos-home   77G   33M   77G   1% /home
    virtualbox-iso: /dev/sda1                497M   64M  433M  13% /boot
    virtualbox-iso: tmpfs                     49M     0   49M   0% /run/user/1000
# 上面輸出了清理環境后,整個磁盤空間的大小情況。
# 根分區有50G,/home分區的77G。夠用了

==> virtualbox-iso: Gracefully halting virtual machine...
==> virtualbox-iso: Preparing to export machine...
    virtualbox-iso: Deleting forwarded port mapping for the communicator (SSH, WinRM, etc) (host port 4046)
==> virtualbox-iso: Exporting virtual machine...
    virtualbox-iso: Executing: export centos72 --output output-centos72-virtualbox-iso/centos72.ovf
==> virtualbox-iso: Unregistering and deleting virtual machine...
==> virtualbox-iso: Running post-processor: vagrant
==> virtualbox-iso (vagrant): Creating Vagrant box for 'virtualbox' provider
    virtualbox-iso (vagrant): Copying from artifact: output-centos72-virtualbox-iso/centos72-disk1.vmdk
    virtualbox-iso (vagrant): Copying from artifact: output-centos72-virtualbox-iso/centos72.ovf
    virtualbox-iso (vagrant): Renaming the OVF to box.ovf...
    virtualbox-iso (vagrant): Compressing: Vagrantfile
    virtualbox-iso (vagrant): Compressing: box.ovf
    virtualbox-iso (vagrant): Compressing: centos72-disk1.vmdk
    virtualbox-iso (vagrant): Compressing: metadata.json
Build 'virtualbox-iso' finished.

==> Builds finished. The artifacts of successful builds are:
--> virtualbox-iso: 'virtualbox' provider box: box/virtualbox/centos72-2.0.22.box
# 系統將output-centos72-virtualbox-iso/下的臨時文件處理壓縮為:
# box/virtualbox/centos72-2.0.22.box    
# 整個命令結束。

ls -hl box/virtualbox/centos72-2.0.22.box
-rw-r--r--  1 user  staff   363M 12 18 10:37 box/virtualbox/centos72-2.0.22.box
# box文件只有363M

至此,box成功生成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM