CentOS7のVMwareイメージを作成

CentOS7が7月7日にリリースされた。
これまでLinux系のテスト他は、CentOS6.5のVMwareイメージでやっていたのだけれど、ようやく CentOS7 のイメージも作成したので、その時のメモ。
関連して、RHEL7系のNIC port名の決定ルールも記載しておく。

大まかな流れ

  1. 最小構成の仮想マシンを作成
  2. 準仮想化ドライバ向けマシン設定(SCSIとNIC)
  3. CentOS7のインストール
  4. 不要パッケージの削りこみ
  5. アップデート
  6. NIC port名を旧仕様(ethN)に戻す
  7. VMware Tools のインストール
  8. 公開鍵の登録
  9. 仮想マシンの調整とテンプレート化

NIC port名について

CentOS7では、Systemdとudevの仕組みによって、ハードウェア情報からNIC port名(eth0など)を固定的に決めている。
一方、VMをクローンすると、普通は仮想NICのMACアドレスが変化する。そうしないと、クローンしたVM間で通信できないから。
すると、CentOS7のデフォルト動作では、仮想NICとNIC設定ファイル(/etc/sysconfig/network-scripts/ifcfg-eno16780032など)の対応関係が取れなくなり、NICにIPアドレスが設定されない、といったことになる。
対策は色々と考えられるけど、今回は単純にNIC port名を旧仕様に戻すことにした。
そうすれば、最初に見つけたNIC port に対して昔ながらのeth0というNIC Port名が使われ、”DEVICE=eth0” の指定を持つ設定ファイルを単純に参照するようになる。
仮想NICは、勝手に壊れることはないので、今回の利用目的には十分。

ダウンロードISO

以下のサイトにあるミラーから、ISOファイルを取得。
その他、こんなISOイメージもあるけれど
ISO 内容物
CentOS-7.0-1406-x86_64-DVD.iso インストーラがインストールできる全パッケージを含む
CentOS-7.0-1406-x86_64-Everything.iso インストーラが直接インストールできないパッケージも含む
足りないパッケージは必要に応じて yum すれば良いので、今回は Minimal を使う。

CentOS7 リリースメモ(参考)

以下の場所にあり。

1. 最小構成の仮想マシンを作成

以下の構成で作成。さくらのマイクロサーバやAmazon EC2のt2.microと同じ程度。
要素 補足
CPU プロセッサ数1、コア数1 後で増やせる
メモリ 1GB 普通に使えるレベルの最少値
HDD 20GB SCSI 5GBでもインストールは可能
手順の詳細:
  1. 新規仮想マシン作成ウィザード
    “カスタム(C) (上級)” を選択
  2. 仮想マシンのハードウェア互換性の選択
    “Workstation 10.0” を選択(デフォルト)
  3. ゲストOSのインストール
    インストーラディスクイメージファイル(M)(iso):
    ダウンロードしたファイル “CentOS-7.0-1406-x86_64-Minimal.iso” を選択
  4. ゲストOSの選択
    Linux|”Red Hat Enterprise Linux 6 64 ビット” を選択(CentOS7推奨値)
  5. 仮想マシンの名前
    “CentOS7 x86_64 Micro Basic Server” と入力
    VMイメージの格納場所も指定
  6. プロセッサ構成
    プロセッサ数(P): “1”、プロセッサごとのコアの数(C): “1” を選択
  7. 仮想マシンのメモリ
    “1024MB” を指定
  8. ネットワークの種類
    “NATを使用(E)” を選択
  9. I/Oコントローラタイプの選択
    “LSI Logic(L) (推奨)” を選択
  10. ディスクタイプの選択
    “SCSI(S) (推奨)” を選択
  11. ディスクの選択
    “仮想ディスクの新規作成(V)” を選択
  12. ディスク容量の指定
    • ディスク最大サイズ(GB)(S): “20.0GB” を指定(VMwareによる推奨値)
    • 今すぐ全ディスク容量を割り当てる(A) をチェック
    • 仮想ディスクを単一ファイルとして格納(O) を選択
  13. ディスクファイルの指定
    デフォルトでOK
  14. 仮想マシンを作成する準備完了
    「ハードウェアをカスタマイズ(C)…」ボタンをクリック
  15. ハードウェア
    • プロセッサ|”Intel VT-x/EPTまたはAMD-V/RVIを仮想化(V)” をチェック
    • プロセッサ|”CPUパフォーマンスカウンタを仮想化(U)” をチェック
    • USBコントローラ|削除
    • サウンドカード|削除
    • プリンタ|削除
    • ディスプレイ|”3Dグラフィックのアクセラレーション(3)” をチェック
以上で仮想マシンを作成完了。
一旦、VMware Workstation を閉じる。

2. 準仮想化ドライバ向けマシン設定

SCSIとNICに準仮想化ドライバ(Paravirtual Driver)を利用するため、仮想マシンのコントローラの種類を変える。
VMware Workstationでは、GUIによる変更はできないため、直接エディタで変更する。
編集するファイルは、作成したVMイメージの格納ディレクトリ内にある vmx ファイル。
前述の手順の通りなら、ファイル名はこれ。
  • “CentOS7 x86_64 Micro Basic Server.vmx”
変更は2点(イメージのオレンジ色部分)
- scsi0.virtualDev = "lsilogic"
+ scsi0.virtualDev = "pvscsi"
- ethernet0.virtualDev = "e1000"
+ ethernet0.virtualDev = "vmxnet3"

3. CentOS7のインストール

仮想マシンをPower Onして、CentOS7のインストールを開始。
  • Language: “English” を選択
  • DATE&TIME: “Asia/Tokyo timezone” を選択
  • KEYBOARD: “Japanese(OADG 109A)” を選択
  • INSTALLATION DESTINATION
    • Local Standard Disks: “VMware, VMware Virtual S” をチェック
    • Other Storage Options: “I will configure partitioning” を選択
Doneを選ぶと、パーティション作成画面に入る。以下のように切る。
  • New mount points will use the following partitioning scheme
    “Standard Partition” を選択
  • 「+」ボタンでパーティションを入力
Mount Point Desired Capacity
swap 1GB
/boot 1GB
/ 空欄(=残り全部)
その後「Done」ボタン→「Accept Changes」ボタン→「Begin Installation」ボタンへ。
インストールは1~2分で完了(速い!)。その間に”Root Password”を入力しておく。
Rebootボタンを押すと、約10秒ほどで再起動した。CentOS6と較べて、速いね!

起動確認

rootでログインし、SCSIとNICに、ちゃんと準仮想化ドライバが利用されているか確認。
[root@localhost ~]# dmesg | egrep 'vmx|pv|SCSI'
[    0.312693] SCSI subsystem initialized
[    0.612189] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252)
[    0.876010] VMware PVSCSI driver - version 1.0.2.0-k
[    0.876321] vmw_pvscsi: using 64bit dma
[    0.905027] vmw_pvscsi 0000:03:00.0: vmw_pvscsi: host->max_id: 16
[    0.905462] vmw_pvscsi 0000:03:00.0: irq 73 for MSI/MSI-X
[    0.905541] vmw_pvscsi: using MSI-X
[    0.905621] scsi0 : VMware PVSCSI storage adapter rev 2, req/cmp/msg rings: 8/8/1 pages, cmd_per_lun=64
[    0.905826] vmw_pvscsi 0000:03:00.0: VMware PVSCSI rev 2 host #0
[    1.046887] sd 0:0:0:0: [sda] Attached SCSI disk
[    5.055713] VMware vmxnet3 virtual NIC driver - version 1.1.30.0-k-NAPI
[    5.055822] vmxnet3 0000:0b:00.0: # of Tx queues : 1, # of Rx queues : 1
[    5.073693] vmxnet3 0000:0b:00.0: irq 76 for MSI/MSI-X
[    5.073776] vmxnet3 0000:0b:00.0: irq 77 for MSI/MSI-X
[    5.074981] vmxnet3 0000:0b:00.0 eth0: NIC Link is Up 10000 Mbps
[   10.387881] vmxnet3 0000:0b:00.0 eno16777728: intr type 3, mode 0, 2 vectors allocated
[   10.388222] vmxnet3 0000:0b:00.0 eno16777728: NIC Link is Up 10000 Mbps
vmxファイルを編集したとおり、pvscsiとvmxnet3になっている。
この時点で、Root領域(”/“ パーティション)の使用量は 800MB 程度だった。Mininalはさすがに小さい。

4. 不要パッケージの削りこみ

この仮想マシンでは使わないパッケージを削除。
削ったパッケージは、もし必要になったら、その段階で yum で組み込むことにする。

4.1. kdump

kexec-tools(kdump)は、メモリを1GBに設定したのと(=1GB以下だとデフォルトでは無効化されている)、たぶんカーネルダンプを見ることは、しばらく無いので削除。
[root@localhost ~]# rpm -e iprutils alsa-tools-firmware alsa-lib alsa-firmware btrfs-progs fxload-2002_04_11 postfix kexec-tools biosdevname

4.2. NetworkManager

CentOS7で導入された NetworkManager も、当面利用しないので削除してしまう。
関連パッケージは意外に多い。
[root@localhost ~]# rpm -e NetworkManager NetworkManager-tui NetworkManager-glib avahi avahi-libs avahi-autoipd dnsmasq gsettings-desktop-schemas glib-networking libsoup ModemManager-glib ppp

5. アップデート

先週水曜の 9/24 に、20年モノの、とっても怖いBashバグ Shellshock が公表された。今後もいつ何が公表されるかわからないし、OSインストールした後は、必ずアップデートもしておく。

5.1. IPアドレスの仮設定

下準備として、IPアドレスを仮設定する。
まず、NIC port名を調べる。
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno16777728: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
NIC port名は eno16777728 (enはEtherNet、oはOn-board、数字は様々)なので、これに仮IPを設定する。デフォルトゲートウェイとDNSサーバも。
[root@localhost ~]# ip addr add 192.168.170.64/24 dev eno16777728
[root@localhost ~]# ip route add default via 192.168.170.2
[root@localhost ~]# echo "nameserver 192.168.170.2" > /etc/resolv.conf
導通確認:
[root@localhost ~]# curl -s --get http://www.google.co.jp | head -1 | cut -b-70
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage"

5.2. yum update

[root@localhost ~]# yum update
...
Install   1 Package
Upgrade  61 Packages

Total download size: 88 M
Is this ok [y/d/N]: y
...
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-0.1406.el7.centos.2.3.x86_64 (@anaconda)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Is this ok [y/N]: y
...
Complete!

おまけ1:カーネル

新カーネル kernel-3.10.0-123.8.1.el7.x86_64 もインストールされた。
[root@localhost ~]# rpm -q kernel
kernel-3.10.0-123.el7.x86_64
kernel-3.10.0-123.8.1.el7.x86_64

おまけ2: Shellshock

Shellshockもパッチがあたった(10/1時点では、水平展開中なので完全Fix版ではないらしい)
Bashのチェンジログ:
[root@localhost ~]# rpm -q --changelog bash | head
* Thu Sep 25 2014 Ondrej Oprala <ooprala@redhat.com> - 4.2.45-5.4
- CVE-2014-7169
  Resolves: #1146324

* Thu Sep 25 2014 Ondrej Oprala <ooprala@redhat.com> - 4.2.45-5.3
- amend patch to match upstream's
  Related: #1146324

* Mon Sep 15 2014 Ondrej Oprala <ooprala@redhat.com - 4.2.45-5.2
- Fix-up the patch
実際にバグを試してみると…
アップデート前のBashの動作:
[root@localhost ~]# env x='(){ :;};echo Vulnerable' bash -c "echo this is a test"
Vulnerable
this is a test
アップデート後のBashの動作:
[root@localhost ~]# env x='(){ :;};echo Vulnerable' bash -c "echo this is a test"
this is a test
“Vulnerable” という文字列が表示されなくなって、無事に修正された。

6. NIC port名を旧仕様に戻す

やることは3つ。
  • /etc/default/grubを編集して “net.ifnames=0” をカーネルに渡す
  • /etc/sysconfig/network-scripts/ifcfg-eth0 を作成する
  • 再起動して動作を確認

6.1. /etc/default/grubを編集

以下のように変更した。”net.ifnames=0” を渡す。ついでに “rhgb” も削除している。
--- grub.bak    2014-10-01 18:47:06.089423340 +0900
+++ /etc/default/grub   2014-10-01 18:47:23.068425001 +0900
@@ -5,3 +5,3 @@
 GRUB_TERMINAL_OUTPUT="console"
-GRUB_CMDLINE_LINUX="vconsole.keymap=jp106 crashkernel=auto  vconsole.font=latarcyrheb-sun16 rhgb quiet"
+GRUB_CMDLINE_LINUX="vconsole.keymap=jp106 crashkernel=auto  vconsole.font=latarcyrheb-sun16 net.ifnames=0 quiet"
 GRUB_DISABLE_RECOVERY="true"
initramfsへ反映。grub2-mkconfigコマンドを使う。
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-123.8.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-123.8.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-5a1329a865ac45aa959bb41cf24662cf
Found initrd image: /boot/initramfs-0-rescue-5a1329a865ac45aa959bb41cf24662cf.img
done

6.2. ifcfg-eth0 を作成

/etc/sysconfig/network-scripts/ifcfg-eth0 を作成する。
[root@localhost ~]# cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
TYPE=Ethernet
DEVICE="eth0"
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.170.64
NETMASK=255.255.255.0
GATEWAY=192.168.170.2
EOF

6.3. 再起動して動作確認

仮想マシンを “shutdown -r now” で再起動し、rootで再びログイン。

新カーネル(ついで)

せっかく再起動するので、grub のブート画面で新カーネルを選び、新カーネルが起動できることも確認。
[root@localhost ~]# uname -r
3.10.0-123.8.1.el7.x86_64
特にエラーなどなければ、旧カーネルは削除。
[root@localhost ~]# rpm -e kernel-3.10.0-123.el7.x86_64

syslog

/var/log/messagesに変なエラーが出ていないことを確認。特に eth 周り。

NIC port名、通信

設定の反映状況の確認と、導通確認する。
[root@localhost ~]# ip addr show | grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.170.64/24 brd 192.168.170.255 scope global eth0

[root@localhost ~]# curl -s --get http://www.google.co.jp | head -1 | cut -b-70
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage"
www.google.co.jp からデータを取ってこれている。

クローン後の通信(気になる場合)

この仮想マシンを一旦落とし、VMware で仮想マシンをクローンして、同じIPアドレスで同様に通信できることを確認。

6.4. NIC port命名ルール(補足)

RHEL7では、次のようにNIC port名は決まる仕様とのこと。
1から順に、どれかのルールに該当したら命名が完了する。
  1. もし ifcfg-xxxx に HWADDR 指定があり、NICのMACアドレスとマッチすれば、そのファイルの DEVICE に指定した名前になる。ファイル名の xxxx 部分は何でもOK
    • 関連ファイル /usr/lib/udev/rules.d/60-net.rules
  2. もし kernel cmdline に biosdevname=0 の指定がなく、かつ “biosdevname” コマンドの結果を利用できるなら、その結果が名前となる
    • 関連ファイル /usr/lib/udev/rules.d/71-biosdevname.rules
  3. もし kernel cmdline に net.ifnames=0 の指定がないなら、変数ID_NET_{ONBOARD, SLOT, PATH} をこの順に見て、値があれば、その名前になる
    • 関連ファイル
      /usr/lib/udev/rules.d/75-net-description.rules
      /usr/lib/udev/rules.d/80-net-name-slot.rules
  4. 以上のどれにも該当しなければ、昔ながらの ethN を使う。
今回、ifcfg-eth0 に HWADDR を書いておらず(ルール1適用外)、biosdevname をアンインストールしており(ルール2適用外)、kernel cmdlineに net.ifnames=0 を指定したから(ルール3適用外)、結局、NIC port名は eth0 となった。
ルール3で使われる変数の値は、以下のように調べることができる。
[root@localhost ~]# ls /sys/class/net/ | while read f
> do { echo "$f:"; udevadm info /sys/class/net/$f|grep ID_NET_; } done
eno16777728:
E: ID_NET_LABEL_ONBOARD=enEthernet0
E: ID_NET_NAME_MAC=enx000c299129d8
E: ID_NET_NAME_ONBOARD=eno16777728
E: ID_NET_NAME_PATH=enp2s0
E: ID_NET_NAME_SLOT=ens32
lo:
参考にした資料は以下。udevルールを工夫すると、もっと色々とできるみたい。
CentOS6.5の実装(70-persistent-net.rules)より、筋が良くなっていると思う。

7. VMware Tools のインストール

VMware Workstation “10.0.3 build-1895310” が提供する VMware Tools は、RHEL7 に対応していない(今後も対応するのか不明)。
以下の公式ページをみると、Open-vmware-toolsを使えとのこと。
また、次のページのFAQには、各OSディストリビューションに含まれるものを使えば良いとあるので、yumで入れる。

7.1. yumでインストール

[root@localhost ~]# yum install open-vm-tools
...
================================================================================
 Package               Arch           Version                Repository    Size
================================================================================
Installing:
 open-vm-tools         x86_64         9.4.0-3.el7            base         429 k
Installing for dependencies:
 libdnet               x86_64         1.12-13.1.el7          base          31 k
 libicu                x86_64         50.1.2-11.el7          base         6.9 M
...
Total download size: 7.3 M
Installed size: 25 M
Is this ok [y/d/N]: y
...
Complete!
インストール完了!
systemctl status vmtoolsd でサービスを確認できる。

7.2. パワーオン スクリプトが正常に実行されません

しかし今度は、仮想マシンの起動時に以下のメッセージで怒られるようになる。
この仮想マシンで VMware Tools パワーオン スクリプトが正常に実行されませんでした。カスタム パワーオン スクリプトをこの仮想マシンで構成している場合は、スクリプトにエラーがないことを確認してください。サポート リクエストを提出してこの問題を報告することもできます。
この辺りを参考に調べると、ifconfig コマンドが存在しないことが原因↓と判明。
[root@localhost ~]# /etc/vmware-tools/poweron-vm-default
Wed Oct 1 12:01:55 JST 2014 : Executing '/etc/vmware-tools/poweron-vm-default'
Wed Oct 1 12:01:55 JST 2014 : Executing '/etc/vmware-tools/scripts/vmware/network'

Oct 01 12:01:55 network: ifconfig not in search path.
それはそうだ、CentOS7だもん。
準仮想化ドライバを導入した時のように、vmxファイルを編集して、機能を無効化できるようだけど、今回は素直に ifconfig コマンド(net-tools)を入れます。
[root@localhost ~]# yum install net-tools
...
Total download size: 304 k
Installed size: 917 k
Is this ok [y/d/N]: y
...
Installed:
  net-tools.x86_64 0:2.0-0.17.20131004git.el7

Complete!
今度は、同じスクリプトでエラーがでなくなった。OS起動での文句も無くなった。
[root@localhost ~]# /etc/vmware-tools/poweron-vm-default
Wed Oct 1 12:07:16 JST 2014 : Executing '/etc/vmware-tools/poweron-vm-default'
Wed Oct 1 12:07:16 JST 2014 : Executing '/etc/vmware-tools/scripts/vmware/network'

8. 公開鍵の登録

この仮想マシンはテンプレート化するので、クローンしたもの全て、手元の秘密鍵でログインできるようにし、今後のSSHログインを簡単にする。
SSHクライアントの公開鍵を転送して ~/.ssh/authorized_keys に登録しておく。
終わったら shutdown -h now でOSを落とす。

9. 仮想マシンの調整とテンプレート化

仮想マシンの最終調整をして、テンプレート化する。
  • ハードウェア|CD/DVD(SATA)
    “起動時に接続(O)”をチェックOFF、物理ドライブを使用する(P):”自動検出” を選択
  • ハードウェア|ディスプレイ
    モニタ設定を指定(S):各モニタの最大解像度(N): 640x480
    ※ ほとんどリモートログインでしか利用しないので。
  • オプション|VMware Tools
    “ホストとゲスト時間を同期(S)”をチェック
  • オプション|詳細
    デバッグ情報を収集(O): “なし”
    “クローン作成に使用するテンプレートモードを有効にする(T)”をチェック
VMware WorkstationのUIを使い、テンプレートとなるスナップショットを作成する。
Ctrl-Mからスナップショットマネージャを起動。スナップショット名は「OS基本設定済み2014/10/1」など。詳細にはIPアドレスなどを書いておく。
以上で、クローンして直ぐ使えるイメージができた。大団円。

1 コメント:

Centos7のvmwareイメージを作成 >>>>> Download Now

>>>>> Download Full

Centos7のvmwareイメージを作成 >>>>> Download LINK

>>>>> Download Now

Centos7のvmwareイメージを作成 >>>>> Download Full

>>>>> Download LINK

Reply

コメントを投稿