Vagrant provision によりゲストOS(CentOS7)のディスク容量を拡張する方法です。
確認環境
Windows10
VirtualBox 5.2
Vagrant 2.2.0
ゲストOS CentOS 7.2
経緯
Vagrant でディスク容量を拡張する方法を調べていて以下の記事を見つけました。
Vagrantで初期にディスク拡張を自動化するプロビジョニングコードを作ってみた(制約あり)
この記事では作業途中にOS再起動を挟むため改善点として、OS再起動後に残りの処理を1回だけ自動実行する案が示されています。
さらに調べたところ以下の記事でOS起動時に1回だけ自動実行する方法がありました。
CentOS 7起動時にプログラムを1回だけ自動実行する(RunOnceのように)
この2つの記事の方法を組み合わせて1回のprovisionでディスク容量を拡張できるようにしてみました。
方法
準備
Vagrantを実行できる環境があること。
vagrant-disksize プラグインがインストール済みであること。
Vagrantfileと同じフォルダに以下のファイルを用意する。(内容は後述)
- resize.sh OS再起動後に行う処理スクリプト
- resize.service OS起動時にresize.shを実行するためのservice
スクリプトの内容
Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "centos7"
config.vm.network "private_network", ip: "192.168.33.16"
config.vm.hostname = "green"
config.disksize.size = '100GB'
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = 2
end
config.vm.provision "file", source: "resize.sh", destination: "/tmp/resize.sh"
config.vm.provision "file", source: "resize.service", destination: "/tmp/resize.service"
config.vm.provision "shell", inline: <<-SHELL
START=$(parted -l /dev/sda | grep lvm | head -1 | awk '{ print $3 }' || exit 1)
parted -s -a optimal /dev/sda -- mkpart primary ext4 $START 100G
chmod +x /tmp/resize.sh
cp /tmp/resize.service /etc/systemd/system/
systemctl enable resize.service
reboot
exit 0
SHELL
end
config.disksize.size = '100GB' でディスクサイズを指定する。今回の例では100GB。
config.vm.provision "file" でプロビジョン時にゲストOSに resize.sh resize.service を送り込む。
parted でパーティションの処理。
次回、OS起動時にresize.sh が実行されるように resize.service を設定する。
OS再起動。
# !/bin/bash
pvcreate /dev/sda3
vgextend centos /dev/sda3
lvextend -l +100%FREE /dev/mapper/centos-root
xfs_growfs /dev/mapper/centos-root
OS再起動後にファイルシステムの拡張などを行う。
[Unit]
After=network-online.target
[Service]
User=root
ExecStart=/bin/bash -c "/tmp/resize.sh \
&& /usr/bin/systemctl disable resize.service \
&& rm -f /etc/systemd/system/resize.service"
[Install]
WantedBy=multi-user.target
OS起動時にresize.shを起動する。その後、再度実行されないようにdisableにし、ファイルも削除する。(/tmp 配下の resize.sh などは削除していない)
実行
vagrant up
するだけ。一度、OS再起動が入るので少し待つ。
ゲストOSにログインして確認してみる。
[root@green ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 92G 1.5G 91G 2% /
devtmpfs 488M 0 488M 0% /dev
.....
参考
本文中にも書きましたが以下の記事を参考というかベースにさせていただきました。
Vagrantで初期にディスク拡張を自動化するプロビジョニングコードを作ってみた(制約あり)
CentOS 7起動時にプログラムを1回だけ自動実行する(RunOnceのように)