Vagrantのディスク容量を増やす
開発の過程で、開発用のVagrantのディスク容量が足りなくなったので、増やすことにした。
VirtualBoxのゲストOSのディスク容量を増やすでまとめた方法は、ディスクイメージがVDI形式の場合。VagrantのディスクイメージはVMDKなので、この手順では増やせない。
そこでこのエントリでは、VMDK形式のディスクイメージを増やす手順をまとめた。
手順は以下のとおり。
- 容量を増やすVMDK形式の仮想ディスクから、VDI形式の仮想ディスクを作成する。
- 作成したディスクの容量を増やす。
- 容量を増やしたVDI形式の仮想ディスクから、VMDK形式の仮想ディスクを作成する。
- ゲストOSの仮想ディスクを差し替える。
- 後処理
今回は、容量を8GiBから20GiBに増やす。
ゲストOSを停止する
対象のゲストOSを停止する。
$ vagrant halt
==> default: Attempting graceful shutdown of VM...
VDI形式の仮想ディスクを作成する
ゲストOSの仮想マシンディレクトリに移動する。
$ cd ~/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811
$ ls
Logs/ blog-sample_default_1438086650392_98811.vbox-prev
blog-sample_default_1438086650392_98811.vbox box-disk1.vmdk
VBoxManage clonehd
でVDI形式の仮想ディスクを作成する。
$ VBoxManage clonehd "box-disk1.vmdk" "clone-disk1.vdi" --format vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'vdi'. UUID: 05b1c324-01fe-462c-9834-78de2c46a5a3
作成した仮想ディスクの情報。
$ VBoxManage showhdinfo clone-disk1.vdi
UUID: 05b1c324-01fe-462c-9834-78de2c46a5a3
Parent UUID: base
State: created
Type: normal (base)
Location: /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/clone-disk1.vdi
Storage format: VDI
Format variant: dynamic default
Capacity: 8192 MBytes
Size on disk: 1508 MBytes
作成したディスクの容量を増やす
VBoxManage modifyhd
で容量を増やす。--resize
で指定した値は、20(GB) * 1024(MB) = 20480。
$ VBoxManage modifyhd clone-disk1.vdi --resize 20480
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
容量を増やした仮想ディスクの情報。
$ VBoxManage showhdinfo clone-disk1.vdi
UUID: 05b1c324-01fe-462c-9834-78de2c46a5a3
Parent UUID: base
State: created
Type: normal (base)
Location: /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/clone-disk1.vdi
Storage format: VDI
Format variant: dynamic default
Capacity: 20480 MBytes
Size on disk: 1508 MBytes
Capacity
が、8192から20480に変わっていることを確認する。
VMDK形式の仮想ディスクを作成する
VBoxManage clonehd
でVMDK形式の仮想ディスクを作成する。
$ VBoxManage clonehd "clone-disk1.vdi" "box-disk2.vmdk" --format vmdk
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'vmdk'. UUID: d224e6fc-5b52-438b-9f95-b9310276ca75
作成した仮想ディスクの情報。
$ VBoxManage showhdinfo box-disk2.vmdk
UUID: d224e6fc-5b52-438b-9f95-b9310276ca75
Parent UUID: base
State: created
Type: normal (base)
Location: /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/box-disk2.vmdk
Storage format: VMDK
Format variant: dynamic default
Capacity: 20480 MBytes
Size on disk: 1482 MBytes
ゲストOSの仮想ディスクを差し替える
VBoxManage showvminfo
で、仮想マシンの仮想ディスクの情報を確認する。
$ VBoxManage showvminfo blog-sample_default_1438086650392_98811 | grep ".vmdk"
SATA (0, 0): /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/box-disk1.vmdk (UUID: 550be626-6968-4c71-b34b-23023fceb55f)
VBoxManage storageattach
で仮想ディスクを差し替える。
$ VBoxManage storageattach blog-sample_default_1438086650392_98811 \
--storagectl "SATA" --port 0 --device 0 \
--type hdd --medium box-disk2.vmdk
VBoxManage showvminfo
で、仮想マシンの仮想ディスクが変更されていることを確認する。
$ VBoxManage showvminfo blog-sample_default_1438086650392_98811 | grep -i vmdk
SATA (0, 0): /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/box-disk2.vmdk (UUID: d224e6fc-5b52-438b-9f95-b9310276ca75)
入れ替えた仮想ディスクをVBoxManage showhdinfo
で確認する。
$ VBoxManage showhdinfo box-disk2.vmdk
UUID: d224e6fc-5b52-438b-9f95-b9310276ca75
Parent UUID: base
State: created
Type: normal (base)
Location: /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/box-disk2.vmdk
Storage format: VMDK
Format variant: dynamic default
Capacity: 20480 MBytes
Size on disk: 1482 MBytes
In use by VMs: blog-sample_default_1438086650392_98811 (UUID: 4ee3a11c-bab7-4069-9831-a4b59208d0df)
In use by VMs
の項目が増えていることを確認する。
ゲストOSを起動して確認する
Vagrantfileのあるディレクトリに移動し、vagrant up
を実行してゲストOSが起動することを確認する。
$ vagrant up
今回試したゲストOS(CentOS 7.1 x86_64)で、変更後の状態。
[vagrant@localhost ~]$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/mapper/centos-root 6.7G 1.3G 5.5G 19% /
devtmpfs 236M 0 236M 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/sda1 497M 126M 371M 26% /boot
none 232G 51G 182G 22% /vagrant
[vagrant@localhost ~]$ sudo fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x0009977c
デバイス ブート 始点 終点 ブロック Id システム
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 16777215 7875584 8e Linux LVM
Disk /dev/mapper/centos-root: 7159 MB, 7159676928 bytes, 13983744 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk /dev/mapper/centos-swap: 859 MB, 859832320 bytes, 1679360 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク全体は増えたがパーティションの容量は変わっていないので、それを増やす必要がある。 その手順はVirtualBoxのゲストOSのディスク容量を増やすにまとめているので、ここでは省略する。
後処理
ゲストOSを停止する。
$ vagrant halt
VDIの仮想ディスクと容量増加前の仮想ディスクをVirtualBoxの管理下から外す。
$ VBoxManage closemedium disk clone-disk1.vdi
$ VBoxManage closemedium disk box-disk1.vmdk
VBoxManage list hdds
で外した仮想ディスクが一覧に表示されないことを確認する。
$ VBoxManage list hdds
UUID: d224e6fc-5b52-438b-9f95-b9310276ca75
Parent UUID: base
State: created
Type: normal (base)
Location: /Users/te2u/misc/VirtualBoxVMs/blog-sample_default_1438086650392_98811/box-disk2.vmdk
Storage format: VMDK
Capacity: 20480 MBytes
VDIの仮想ディスクは削除する。
$ rm clone-disk1.vdi
参考
Pythonでコマンドの実行結果の標準出力を取得する
仕事で個人的に使用するコマンドをPythonで書いてみようと思い、Pythonでコマンドを実行してその標準出力を取得する方法を調べた。
$ cat test.py
#!/usr/bin/python
def main():
for line in exec_cmd('ls -l'):
print line
def exec_cmd(cmd):
from subprocess import Popen, PIPE
p = Popen(cmd.split(' '), stdout=PIPE, stderr=PIPE)
out, err = p.communicate()
return [ s for s in out.split('\n') if s ]
if __name__ == '__main__':
main()
subprocess.Popen
を使用する。subprocess.PIPE
は標準ストリームに指定するパイプ。
subprocess.Popen
では、コマンドを配列で表現する必要があるので、コマンドラインを文字列で表記して、それをsplit()
で分割。
p.communicate()
はプロセスと通信し、結果を取得する。返り値は、標準出力、標準エラー出力のタプル(stdout,stderr)
。
調べている過程でp.wait()
を使ってプロセスを実行し、p.stdout.readlines()
で取得する方法を先に見つけたが、デッドロックを起こす可能性があるようで、この方法に変更。ただし、この方法でもデータ量が多い場合は使用すべきでない、という注意が公式のドキュメントにあった。
プロセスを実行後、標準出力の結果を行ごとで分割。空行が含まれていたので、リスト内包表記で空行を除外した。
以下が、出力結果。
$ python test.py
total 16
-rw-r--r-- 1 te2u staff 2878 7 15 23:43 2015-07-15_230419.txt
-rw-r--r-- 1 te2u staff 319 7 15 23:48 test.py
参考
- Python の subprocess で返り値と標準 (エラー) 出力の内容を得る | CUBE SUGAR STORAGE
- pythonでコマンド実行するには - それマグで!
- TOLLE ET LEGE 屋根裏の備忘録 : Pythonで外部コマンドを実行させてその結果を受け取る方法
- Python の subprocess で出力を受け取るときは communicate() を使おう - Qiita
- 17.1. subprocess — サブプロセス管理 — Python 2.7ja1 documentation
- map, reduce, filterによるシーケンス操作 » Python Snippets
CentOS7.1でNetwork ManagerのCUIを使ってネットワーク設定をする
CentOS6から、Network Managerでネットワークを管理するようになっていたようだが、ずっと/etc/sysconfig/network-scripts
を直接編集して設定していた。
今回、CentOS7.1をインストールする機会があったので、Network ManagerのCUIを使って設定してみることにした。
Network ManagerのCUIはnmcli
。
ホスト名の設定
[root@localhost ~]# nmcli g hostname
localhost.localdomain
[root@localhost ~]# nmcli g hostname centos71.localdomain
[root@localhost ~]# nmcli g hostname
centos71.localdomain
[root@localhost ~]# hostname
centos71.localdomain
g
は、general
の略。nmcli
では、最初の引数に指定する値をオブジェクトと呼ぶ。そのオブジェクトに対してコマンドを実行するような体系になっている。
ホスト名の変更は、hostname
コマンドの後に変更後の名称を指定する。指定しなければその時のホスト名が表示される。
変更前の設定内容
今から変更するネットワークの設定内容の確認。
[root@centos71 ~]# nmcli c show
名前 UUID タイプ デバイス
enp0s3 4b7806c4-fe58-4f47-9e3b-768c7be5f4cc 802-3-ethernet enp0s3
c
はconnection
の略。show
で、Network Managerで管理しているコネクションの一覧を表示する。
[root@centos71 ~]# nmcli --fields connection c show enp0s3
connection.id: enp0s3
connection.uuid: 4b7806c4-fe58-4f47-9e3b-768c7be5f4cc
connection.interface-name: enp0s3
connection.type: 802-3-ethernet
connection.autoconnect: no
connection.autoconnect-priority: 0
connection.timestamp: 1436372715
connection.read-only: no
connection.permissions:
connection.zone: --
connection.master: --
connection.slave-type: --
connection.secondaries:
connection.gateway-ping-timeout: 0
一覧にある名前enp0s3
がコネクション名。show
にこの名前を指定すると、そのコネクションの設定内容が表示される。
--fields
はnmcli
のグローバルオプションと呼ばれているもの。特定のフィールドを表示するためのフィルタになる。
ここでは、コネクションenp0s3
の基本的な設定を表示している。
[root@centos71 ~]# nmcli --fields ipv4 c show enp0s3
ipv4.method: auto
ipv4.dns:
ipv4.dns-search:
ipv4.addresses:
ipv4.gateway: --
ipv4.routes:
ipv4.route-metric: -1
ipv4.ignore-auto-routes: no
ipv4.ignore-auto-dns: no
ipv4.dhcp-client-id: --
ipv4.dhcp-send-hostname: yes
ipv4.dhcp-hostname: --
ipv4.never-default: no
ipv4.may-fail: yes
--fields
をipv4
に変更して、 IPv4に関する設定を表示。DHCPを使用していることがわかる(ipv4.method: auto
)。
OS起動時にコネクションを有効化する
[root@centos71 ~]# nmcli c mod enp0s3 connection.autoconnect yes
[root@centos71 ~]# nmcli --fields connection c show enp0s3
connection.id: enp0s3
connection.uuid: 4b7806c4-fe58-4f47-9e3b-768c7be5f4cc
connection.interface-name: enp0s3
connection.type: 802-3-ethernet
connection.autoconnect: yes
connection.autoconnect-priority: 0
connection.timestamp: 1436372715
connection.read-only: no
connection.permissions:
connection.zone: --
connection.master: --
connection.slave-type: --
connection.secondaries:
connection.gateway-ping-timeout: 0
mod
はmodify
の略。この後にはコネクション名(enp0s3
)、フィールド名(connection.autoconnect
)、変更値(yes
)が続き、それらを指定して実行すると変更される。
OS起動時にコネクションを有効化するには、connection.autoconnect
をyes
にする。
IPを手動で登録する
[root@centos71 ~]# nmcli c mod enp0s3 ipv4.method manual ipv4.addresses 192.168.56.10/24 ipv4.gateway 192.168.56.1
[root@centos71 ~]# nmcli --fields ipv4 c show enp0s3
ipv4.method: manual
ipv4.dns:
ipv4.dns-search:
ipv4.addresses: 192.168.56.10/24
ipv4.gateway: 192.168.56.1
ipv4.routes:
ipv4.route-metric: -1
ipv4.ignore-auto-routes: no
ipv4.ignore-auto-dns: no
ipv4.dhcp-client-id: --
ipv4.dhcp-send-hostname: yes
ipv4.dhcp-hostname: --
ipv4.never-default: no
ipv4.may-fail: yes
IPを手動で登録するには、ipv4.method
をmanual
にし、ipv4.addresses
を所定のIP/prefix(192.168.56.10/24
)にする。
ここでは併せて、ゲートウェイも設定した(ipv4.gateway 192.168.56.1
)。このように、複数のフィールドを一緒に変更することもできる。
DNSの設定
[root@centos71 ~]# nmcli c mod enp0s3 ipv4.dns "192.168.56.1 8.8.8.8 8.8.4.4" ipv4.dns-search "example.com"
[root@centos71 ~]# nmcli --fields ipv4 c show enp0s3
ipv4.method: manual
ipv4.dns: 192.168.56.1,8.8.8.8,8.8.4.4
ipv4.dns-search: example.com
ipv4.addresses: 192.168.56.10/24
ipv4.gateway: 192.168.56.1
ipv4.routes:
ipv4.route-metric: -1
ipv4.ignore-auto-routes: no
ipv4.ignore-auto-dns: no
ipv4.dhcp-client-id: --
ipv4.dhcp-send-hostname: yes
ipv4.dhcp-hostname: --
ipv4.never-default: no
ipv4.may-fail: yes
DNSサーバはipv4.dns
で設定する。IPをスペースで区切り、全体をダブルクォートで囲むことで、DNSサーバを複数設定することができる。
検索ドメインはipv4.dns-search
を設定する。
設定の確認
[root@centos71 ~]# ip a show enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:d5:4c:8e brd ff:ff:ff:ff:ff:ff
inet 192.168.56.10/24 brd 192.168.56.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fed5:4c8e/64 scope link
valid_lft forever preferred_lft forever
ip
で設定内容を確認してみたところ。inet
が所定のIPになっている。
コマンドで指定したenp0s3
は、コネクション名ではなくデバイス名。上記のフィールド名connection.interface-name
の値と同じ。