Packer で CentOS 5.8 デスクトップ環境の仮想マシンを作る
必要に迫られて、CentOS 5.8 のレガシーなデスクトップ環境を VirtualBox VM で作った。
kickstart + Packer + Vagrant でサクッと構築。
改めて感じる、HashiCorp の偉大さ。
Packer で CentOS 5.8 デスクトップ環境の仮想マシンを作る
必要に迫られて、CentOS 5.8 のレガシーなデスクトップ環境を VirtualBox VM で作った。
kickstart + Packer + Vagrant でサクッと構築。
改めて感じる、HashiCorp の偉大さ。
AWS: 米国東部リージョンの EC2 インスタンスを Vagrant で作成する
AWS を日常的に使うなら、やはり単価の安い米国リージョンを選びたいもの。
しかし安易に日本のインスタンス作成で使った Vagrantfile を使い回すと、以下のような落とし穴にハマる。
InvalidParameterValue => Invalid availability zone: [us-east-1a]
何も考えず、リージョン名に「a」を付けるといきなりハマる。
現在、存在するのは「us-east-1b」「us-east-1c」「us-east-1d」のみ。EC2 -> Dashboard で最新情報を確認できる。
The security group 'vagrant' does not exist
リージョン単位で定義を作成する必要がある。一方、IAM のグループ・ユーザは全リージョン共通。
The image id '[ami-29dc9228]' does not exist
これも、リージョンごとに異なるイメージIDを持っているので、調べ直す必要がある。
InvalidParameterCombination => VPC security groups may not be used for a non-VPC launch
セキュリティグループを作るとき、適当な VPC を選ぶとこうなる。
米国東部リージョンの場合、「サブネットID」または「ネットワーク・インタフェースID」の指定がない場合、そのインスタンスは non-VPC、つまり EC2-Classic 環境に作成されるようだ。
これに対する正しい対応は、正しい「サブネットID」を Vagrantfile の中で指定すること。
AWS Management Console の Services -> Compute & Networking -> VPC -> Subnets の画面で確認できる。
目的の「VPC」および「アベイラビリティゾーン」に対応したサブネットの「Subnet ID」を控え、以下のような記述を Vagrantfile に追加する。
aws.subnet_id = "subnet-xxxxxxxx"
VPCResourceNotSpecified => The specified instance type can only be used in a VPC. A subnet ID or network interface ID is required to carry out the request.
セキュリティグループを作るとき、No VPC を選んでしまうとこうなる。
t2.micro インスタンスを立ち上げるためには、VPC に所属させないといけない。
InvalidParameterCombination => The parameter groupName cannot be used with the parameter subnet
aws.security_groups には、セキュリティグループの「Group Name」ではなく「Group ID」(sg-xxxxxxxx) を指定する必要があるようだ。
The key pair 'vagrant' does not exist
キーペアもリージョン単位で作成する必要がある。これが最後の難関。
デフォルトの VPC を使えば Public IP が自動的に割り振られるが、これはインスタンスを起動するたびに
変わる可能性がある。
Vagrantfile に次の1行を書けば、自動的に新規の Elastic IP を取得し、立ち上げたインスタンスと紐付けてくれる。
素晴らしい。
aws.elastic_ip = true
New Relic で EC2 インスタンスを監視する方法
Amazon EC2 の新規インスタンスを立ち上げ、New Relic でリソース監視をする。
これを vagrant up コマンド一発で実現したい。
プロビジョニングには Ansible を使う。
$ vagrant plugin install vagrant-aws $ vagrant plugin install dotenv
Vagrantfile と同じディレクトリに「.env」というファイルを作成する。
以下のように認証情報を適宜設定すること。
# default provider VAGRANT_DEFAULT_PROVIDER="aws" # credentials AWS_SSH_USERNAME="ec2-user" AWS_SSH_KEY="path/to/your/vagrant.pem" AWS_ACCESS_KEY_ID="your access key id" AWS_SECRET_ACCESS_KEY="your secret" AWS_KEYPAIR_NAME="vagrant" AWS_SECURITY_GROUP="vagrant" # new relic NEWRELIC_LICENSE_KEY="your license key"
$ vagrant up Bringing machine 'aws-newrelic-test' up with 'aws' provider... [aws-newrelic-test] Warning! The AWS provider doesn't support any of the Vagrant high-level network configurations (`config.vm.network`). They will be silently ignored. [aws-newrelic-test] Launching an instance with the following settings... [aws-newrelic-test] -- Type: t2.micro [aws-newrelic-test] -- AMI: ami-29dc9228 [aws-newrelic-test] -- Region: ap-northeast-1 [aws-newrelic-test] -- Availability Zone: ap-northeast-1a [aws-newrelic-test] -- Keypair: vagrant [aws-newrelic-test] -- Security Groups: ["vagrant"] [aws-newrelic-test] -- Block Device Mapping: [] [aws-newrelic-test] -- Terminate On Shutdown: false [aws-newrelic-test] -- Monitoring: false [aws-newrelic-test] -- EBS optimized: false [aws-newrelic-test] -- Assigning a public IP address in a VPC: false [aws-newrelic-test] Waiting for instance to become "ready"... [aws-newrelic-test] Waiting for SSH to become available... [aws-newrelic-test] Machine is booted and ready for use! [aws-newrelic-test] Running provisioner: ansible... PLAY [all] ******************************************************************** GATHERING FACTS *************************************************************** ok: [aws-newrelic-test] TASK: [newrelic | check if repository is installed] *************************** *snip* PLAY RECAP ******************************************************************** aws-newrelic-test : ok=9 changed=6 unreachable=0 failed=0
AWSインスタンス作成、起動、Ansible によるプロビジョニングが一気通貫で実行される。
暫くすると、New Relic の画面で EC2 サーバの情報が見られるようになった。
AWS課金には注意。
VirtualBox: CentOS 仮想ディスクの容量拡張について
VirtualBox で立てた Docker ホストの中でコンテナを作り続けていたら、いつしか仮想ディスクの容量が
full になってしまっていた。
VirtualBox のゲストOSで使っているストレージ容量を増やす手順をメモしておく。
こちらの Dockerfile で構築した CentOS (ベースは opscode 提供イメージ) のディスクを
40GB から 80GB へ拡張する。
尚、物理ディスクの空き容量は十分にあるものとする。
こちらのブログポストの内容に従って作業。
$ vagrant halt
ストレージが VMDK 形式の場合、VBoxManage コマンドで直接その容量を変えることはできない。(※1)
いったん VDI 形式のクローンを作ってから、その容量を拡張する。
以下は packer-centos-6.5-x86_64-disk1 というストレージの場合の例。
$ cd ~/VirtualBox\ VMs/ゲストOSの名前 $ VBoxManage clonehd packer-centos-6.5-x86_64-disk1.vmdk packer-centos-6.5-x86_64-disk1.vdi --format VDI 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% Clone hard disk created in format 'VDI'. UUID: 32e9d2f1-d30c-4dfc-84dd-24ba96e3be31 $ VBoxManage modifyhd packer-centos-6.5-x86_64-disk1.vdi --resize 81920 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
clonehd コマンドの所要時間は実ディスクの使用量やI/O性能に依存。数十分かかる場合もある。
変換し終わったらVMDK形式のファイルは削除してよいが、バックアップとして暫く残しておくことをお勧めする。
VirtualBox の GUI 上で作業した。
設定画面を開いて、IDE Controller 配下の Primary Master ディスクを VDI 形式のものに付け替え。
$ Vagrantfileのあるディレクトリ $ vagrant up $ vagrant ssh
fdisk コマンドで 80GB (+α) が認識されていることを確認。
$ sudo fdisk -l |head -20 ディスク /dev/sda: 85.9 GB, 85899345920 バイト ヘッド 255, セクタ 63, シリンダ 10443 Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x0004a286 デバイス ブート 始点 終点 ブロック Id システム /dev/sda1 * 1 64 512000 83 Linux パーティション 1 は、シリンダ境界で終わっていません。 /dev/sda2 64 5222 41430016 8e Linux LVM ディスク /dev/mapper/VolGroup-lv_root: 41.4 GB, 41448112128 バイト ヘッド 255, セクタ 63, シリンダ 5039 Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x00000000
fdisk または parted で実行。以下は parted の例。
最初に unit cyl でシリンダ単位で操作するようにしている。ハイライトした行が parted 内での入力。
$ sudo parted (parted) unit cyl (parted) p モデル: ATA VBOX HARDDISK (scsi) ディスク /dev/sda: 10443cyl セクタサイズ (論理/物理): 512B/512B BIOS シリンダ、ヘッド、セクタ geometry: 10443,255,63. 1シリンダは 8225kB。 パーティションテーブル: msdos 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 0cyl 63cyl 63cyl primary ext4 boot 2 63cyl 5221cyl 5157cyl primary lvm (parted) rm 2 警告: WARNING: the kernel failed to re-read the partition table on /dev/sda (デバイスもしくはリソースがビジー状態です). As a result, it may not reflect all of your changes until after reboot. (parted) p モデル: ATA VBOX HARDDISK (scsi) ディスク /dev/sda: 10443cyl セクタサイズ (論理/物理): 512B/512B BIOS シリンダ、ヘッド、セクタ geometry: 10443,255,63. 1シリンダは 8225kB。 パーティションテーブル: msdos 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 0cyl 63cyl 63cyl primary ext4 boot (parted) mkpart primary 63 10443 警告: 63cyl から 10443cyl までのパーティションを指定されました。 可能な中で最も近いものは 63cyl から 10443cyl になります。 それでもかまいませんか? はい(Y)/Yes/いいえ(N)/No? y 警告: WARNING: the kernel failed to re-read the partition table on /dev/sda (デバイスもしくはリソースがビジー状態です). As a result, it may not reflect all of your changes until after reboot. (parted) p モデル: ATA VBOX HARDDISK (scsi) ディスク /dev/sda: 10443cyl セクタサイズ (論理/物理): 512B/512B BIOS シリンダ、ヘッド、セクタ geometry: 10443,255,63. 1シリンダは 8225kB。 パーティションテーブル: msdos 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 0cyl 63cyl 63cyl primary ext4 boot 2 63cyl 10443cyl 10379cyl primary (parted) set 2 lvm on 警告: WARNING: the kernel failed to re-read the partition table on /dev/sda (デバイスもしくはリソースがビジー状態です). As a result, it may not reflect all of your changes until after reboot. (parted) p モデル: ATA VBOX HARDDISK (scsi) ディスク /dev/sda: 10443cyl セクタサイズ (論理/物理): 512B/512B BIOS シリンダ、ヘッド、セクタ geometry: 10443,255,63. 1シリンダは 8225kB。 パーティションテーブル: msdos 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 0cyl 63cyl 63cyl primary ext4 boot 2 63cyl 10443cyl 10379cyl primary lvm (parted) q 通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。
設定が終わったら、ssh から抜けてリブート(vagrant halt; vagrant up)する。
pvscan で確認、pvresize で変更。
$ sudo pvscan PV /dev/sda2 VG VolGroup lvm2 [39.51 GiB / 0 free] Total: 1 [39.51 GiB] / in use: 1 [39.51 GiB] / in no VG: 0 [0 ] $ sudo pvresize /dev/sda2 Physical volume "/dev/sda2" changed 1 physical volume(s) resized / 0 physical volume(s) not resized $ sudo pvscan PV /dev/sda2 VG VolGroup lvm2 [79.51 GiB / 40.00 GiB free] Total: 1 [79.51 GiB] / in use: 1 [79.51 GiB] / in no VG: 0 [0 ]
vgdisplay コマンドで状態を確認。
$ sudo vgdisplay --- Volume group --- VG Name VolGroup System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 4 VG Access read/write VG Status resizable MAX LV 0 Cur LV 2 Open LV 2 Max PV 0 Cur PV 1 Act PV 1 VG Size 79.51 GiB PE Size 4.00 MiB Total PE 20354 Alloc PE / Size 10114 / 39.51 GiB Free PE / Size 10240 / 40.00 GiB VG UUID Iv3nnF-GabP-gmv5-sU9W-iGtb-y5yg-9MA68g
Total PE 20354 に対して、Alloc PE が 10114 であることがわかった。
lvdisplay で確認、lvextend で変更。
空き領域を全て使用する場合には -l +100%FREE オプションが便利だ。
$ sudo lvdisplay --- Logical volume --- LV Path /dev/VolGroup/lv_root (略) LV Size 38.60 GiB (略) $ sudo lvextend -l +100%FREE /dev/VolGroup/lv_root Extending logical volume lv_root to 78.60 GiB Logical volume lv_root successfully resized $ sudo lvdisplay --- Logical volume --- LV Path /dev/VolGroup/lv_root (略) LV Size 78.60 GiB (略)
最後に、resize2fs で対象のファイルシステムのサイズを変更。
$ sudo resize2fs /dev/VolGroup/lv_root resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/VolGroup/lv_root is mounted on /; on-line resizing required old desc_blocks = 3, new_desc_blocks = 5 Performing an on-line resize of /dev/VolGroup/lv_root to 20604928 (4k) blocks. The filesystem on /dev/VolGroup/lv_root is now 20604928 blocks long. $ df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 78G 38G 36G 52% /
無事、ファイルシステム上で使えるディスク容量を 40GB 増やすことに成功した。
※1 現バージョンでは対応していないフォーマットだと表示される。
$ VBoxManage modifyhd packer-centos-6.5-x86_64-disk1.vmdk --resize 81920 0%... Progress state: VBOX_E_NOT_SUPPORTED VBoxManage: error: Resize hard disk operation for this format is not implemented yet!