作業ノート

様々なまとめ、雑感など

CentOS 7.1にVNC Serverをインストールする

Oracleの環境を構築するために、RHEL7.1にGUIをインストールすることになったが、対象がリモートの環境になるのでVNCを使用する。

以下はRHELで構築することを考慮して、ひとまずCentOSを対象に調査したときのまとめ。

環境

自作したvagrant boxのCentOS 7.1。boxは最小構成でインストールしたもの。

[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

[vagrant@localhost ~]$ uname -ar
Linux localhost.localdomain 3.10.0-229.4.2.el7.x86_64 #1 SMP Wed May 13 10:06:09 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

手順

GUI環境の構築

GUIの環境として、GNOMEをインストールする。

[vagrant@localhost ~]$ LANG=C sudo yum groupinstall "GNOME Desktop"

VNC Serverのインストール

TigerVNCをインストールする。

[vagrant@localhost ~]$ sudo yum install tigervnc-server

VNCのパスワードを設定

接続時にvagrantユーザでログインするために、vncpasswdコマンドでパスワード設定する。

[vagrant@localhost ~]$ vncpasswd

serviceの設定

VNC Serverのservice unitファイルをコピーし、編集する。

[vagrant@localhost ~]$ sudo cp /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@.service
[vagrant@localhost ~]$ sudoedit /etc/systemd/system/vncserver@.service

編集したものがこちら。

[vagrant@localhost ~]$ diff -u /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@.service
--- /usr/lib/systemd/system/vncserver@.service  2014-06-10 15:15:02.000000000 +0900
+++ /etc/systemd/system/vncserver@.service  2015-05-21 23:43:46.153717683 +0900
@@ -37,8 +37,8 @@
 Type=forking
 # Clean any existing files in /tmp/.X11-unix environment
 ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
-ExecStart=/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"
-PIDFile=/home/<USER>/.vnc/%H%i.pid
+ExecStart=/sbin/runuser -l vagrant -c "/usr/bin/vncserver %i"
+PIDFile=/home/vagrant/.vnc/%H%i.pid
 ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

 [Install]

<USER>vagrantに変更した。

serviceの起動

systemctlコマンドでVNC Serverを起動する。自動起動の設定はしない。

[vagrant@localhost ~]$ sudo systemctl start vncserver@:1.service

起動後の確認。

[vagrant@localhost ~]$ sudo systemctl status vncserver@:1.service
vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/etc/systemd/system/vncserver@.service; disabled)
   Active: active (running) since 木 2015-05-21 23:44:28 JST; 6s ago
  Process: 1605 ExecStart=/sbin/runuser -l vagrant -c /usr/bin/vncserver %i (code=exited, status=0/SUCCESS)
  Process: 1602 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill %i > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
 Main PID: 1630 (Xvnc)
   CGroup: /system.slice/system-vncserver.slice/vncserver@:1.service
           ‣ 1630 /usr/bin/Xvnc :1 -desktop localhost.localdomain:1 (vagrant) -auth /home/vagrant/.Xauthority -geometry 1024x768 -rfbwait 30000 -rfbauth /home/vagrant/.vnc/passwd -rfbport 5901 -fp ...

 5月 21 23:44:25 localhost.localdomain systemd[1]: Starting Remote desktop service (VNC)...
 5月 21 23:44:28 localhost.localdomain systemd[1]: Started Remote desktop service (VNC).

firewallの設定

VNC Serverへの接続を許可する。永続的な設定はしない。

[vagrant@localhost ~]$ sudo firewall-cmd --add-service=vnc-server --zone=public
success

設定後の確認。

[vagrant@localhost ~]$ sudo firewall-cmd --list-service
dhcpv6-client ssh vnc-server

ちなみに、add-serviceオプションで指定した値と同名のファイルが/usr/lib/firewalld/servicesディレクトリにある。

[vagrant@localhost ~]$ sudo ls /usr/lib/firewalld/services
RH-Satellite-6.xml  dhcpv6-client.xml      http.xml        ipsec.xml     libvirt-tls.xml  mysql.xml    pmproxy.xml     proxy-dhcp.xml    smtp.xml         transmission-client.xml
amanda-client.xml   dhcpv6.xml             https.xml       kerberos.xml  libvirt.xml      nfs.xml      pmwebapi.xml    radius.xml        ssh.xml          vnc-server.xml
bacula-client.xml   dns.xml                imaps.xml       kpasswd.xml   mdns.xml         ntp.xml      pmwebapis.xml   rpc-bind.xml      telnet.xml       wbem-https.xml
bacula.xml          ftp.xml                ipp-client.xml  ldap.xml      mountd.xml       openvpn.xml  pop3s.xml       samba-client.xml  tftp-client.xml
dhcp.xml            high-availability.xml  ipp.xml         ldaps.xml     ms-wbt.xml       pmcd.xml     postgresql.xml  samba.xml         tftp.xml

このファイルの内容が、VNC Serverに関するfirewallの設定になる。

[vagrant@localhost ~]$ sudo cat /usr/lib/firewalld/services/vnc-server.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Virtual Network Computing Server (VNC)</short>
  <description>A VNC server provides an external accessible X session. Enable this option if you plan to provide a VNC server with direct access. The access will be possible for displays :0 to :3. If you plan to provide access with SSH, do not open this option and use the via option of the VNC viewer.</description>
  <port protocol="tcp" port="5900-5903"/>
</service>

VNC Clientからの接続

VNC Clientを起動して接続できることを確認する。

参考

bashのヒアドキュメントを使ったスクリプトの作成

仕事で行った作業を社内のwikiなどにまとめるとき、その作業で実行したコマンドを含めてまとめている。

最近ではスクリプトの作成手順を示す際に、catコマンドを使って

$ cat <<EOT > foo.sh
#!/bin/bash
set -eu

...

EOT

このように表記している。

これはbashのヒアドキュメントを利用したもので、これをコピペして実行するだけで必要なスクリプトが作成できるので、とても便利。

ただ、この記述ではドキュメント内にbashで解釈可能な変数があると、その変数が展開されてしまう。

例えば

$ cat <<EOT > foo.sh
#!/bin/bash
set -eu

PATH=$PATH:/path/to/bin
EOT

このようにして作成したスクリプトを確認すると

$ cat foo.sh
#!/bin/bash
set -eu

PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/X11/bin:/usr/X11R6/bin:/path/to/bin

変数($PATH)が展開されてしまう。

これを回避する方法の一つは、ヒアドキュメントのワード(最初のEOT)をクォートで囲む。

囲むのは単一引用符(')でも

$ cat <<'EOT' > foo-sq.sh
#!/bin/bash
set -eu

PATH=$PATH:/path/to/bin
EOT

$ cat foo-sq.sh
#!/bin/bash
set -eu

PATH=$PATH:/path/to/bin

二重引用符(")でも同じで

$ cat <<"EOT" > foo-dq.sh
#!/bin/bash
set -eu

PATH=$PATH:/path/to/bin
EOT

$ cat foo-dq.sh
#!/bin/bash
set -eu

PATH=$PATH:/path/to/bin

どちらもヒアドキュメント全体で、変数は展開されない。

別の方法としては、$をエスケープする(\)と、エスケープしたところは展開されない。

$ cat <<EOT > foo-es.sh
#!/bin/bash
set -eu

PATH=\$PATH:/path/to/bin
EOT

$ cat foo-es.sh
#!/bin/bash
set -eu

PATH=$PATH:/path/to/bin

変数の展開を限定的にしたい場合は、こちらを利用する。

参考

CentOS 6.6 x86_64 minimalのVagrant boxを作る

1年ほど前にCentOS 6.5 x86_64 minimalのVagrant boxを作った。今回はその方法を元にCentOS 6.6 x86_64 minimalのVagrant boxを作る。

前回とは以下の点が違う。

  • 本家のドキュメントに従い、以下の設定を行った。
    • OSインストール前に、仮想マシンのオーティオとUSBを無効化した。
    • root、vagrantのパスワードをvagrantに統一した。
  • yumリポジトリの登録は、RepoForgeのみにした。

作成環境は以下。

  • Mac OS X Yosemite (10.10.3)
  • VirtualBox 4.3.26
  • Vagrant 1.7.2

ISOのダウンロード

Download - CentOS WikiからCentOS-6.6-x86_64-minimal.isoをダウンロード。

仮想マシンの新規作成

VirtualBox上で仮想マシンを作成する。

  • 仮想マシン名はcentos66。
  • TypeはLinux。バージョンはRed Hat (64bit)。
  • メモリは512MB。ファイルタイプはVDI、可変サイズにして、容量を8GBにした。
  • ネットワークアダプタは、アダプター1のみでNATが割り当てられていることを確認。

仮想マシンの設定変更

OSをインストールする前に、オーディオとUSBを無効化する。

  • VirtualBoxマネージャーを起動し、左側から作成した仮想マシンを選択する。
  • 右側に表示された仮想マシンの詳細からオーディオを無効化する。
    • オーディオをクリックし、設定画面を開く。
    • オーディオ有効化のチェックをはずす。
  • 同様にUSBを無効化する。
    • USBをクリックし、設定画面を開く。
    • UBSコントローラを有効化のチェックをはずす。

OSインストール

作成した仮想マシンの設定で、ストレージのCD/DVDの項目の対象ドライブにダウンロードしたISOを指定し、仮想マシンを起動してOSをインストール。

  • 日本語環境を構築。
  • 英語キーボードを使っているのでキーボードはusを選択。
  • ハードディスクでドライブエラーのWarningが表示されるので、Re-initializeを選択。
  • Time ZoneはAsia/Tokyo。
  • rootのパスワードを設定。
  • Partitioning TypeでUse entire driveを選択してパーティションを作成。
  • Package Installationが完了するのを待つ。

インストール完了後、再起動してルートユーザでログイン。

eth0の有効化

OS起動時にネットワークカードが認識されるように設定を変更する。

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
...
# これをyesにする。
ONBOOT=yes

OSを一度再起動して認識されるか確認する。

# shutdown -r now

再起動後に

# ifconfig

eth0の項目があればOK。

ホスト側(Mac)からsshでログインする

今後の作業のために、一時的にMacのターミナルからsshでログインできるようにする。

以下は、VirtualBoxの仮想マシンの設定変更。

  • 仮想マシンの設定を開く。
  • ネットワークのアダプター1(NAT)を選択し、「高度」の内容を展開。
  • 下部に表示される「ポートフォワーディング」ボタンを押してメニューを表示。
  • 項目を新規追加。ホストポートに2222、ゲストポートに22を入力。他はそのままにしてOKボタンを押す。
  • 設定画面のOKボタンを押す。

設定が完了したら、Macのターミナルを開いてsshでログインする。

$ ssh localhost -p 2222 -l root

これでログインできればOK。

yumリポジトリの登録

Repoforgeを登録。該当rpmパッケージのインストールのみ。

# curl -L -O http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
# yum install rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

Vagrantユーザの作成と設定

ユーザ作成

# useradd -m vagrant
# passwd vagrant

パスワードは本家のドキュメントに従い、vagrantにした。

sshの設定

vagrant sshで必要な公開鍵を登録する。

# mkdir /home/vagrant/.ssh
# chmod 700 /home/vagrant/.ssh
# cd /home/vagrant/.ssh 
# curl -k -L -o authorized_keys 'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub'
# chmod 600 /home/vagrant/.ssh/authorized_keys
# chown -R vagrant.vagrant /home/vagrant/.ssh

sudoの設定

vagrant upコマンドで内部的にsudoコマンドを使用するので、TTYなしでsudoコマンドを実行できるようにし(1)、vagrantユーザがsudoコマンドをパスワードなしで使用できる(2)ように設定する。

# visudo
...
# (1) TTYなしでも実行できるようにする
# Defaults    requiretty
...
# (2) vagrantユーザがsudoコマンドをパスワードなしで実行できるようにする
vagrant ALL=(ALL)       NOPASSWD: ALL

vagrantユーザになって確認する。

# su - vagrant
$ sudo ls /root

rpmパッケージのインストール

インストール済パッケージを更新。

# yum update

kernelのアップデートが含まれていたので、ここでOSを再起動。

開発環境として必要なパッケージとVirtualBox Guest Additionsに必要なパッケージをインストール。

# LANG=C yum groupinstall "Development tools"
# yum install man man-pages man-pages-overrides man-pages-ja

gitは既存のバージョンが古いので、Repoforgeのgitに入れ替えた。

# yum remove git-1.7.1-3.el6_4.1.x86_64 perl-Git-1.7.1-3.el6_4.1.noarch
# yum --enablerepo=rpmforge-extras install git

selinuxの無効化

開発環境なのでselinuxは無効化。

# vi /etc/sysconfig/selinux

# disabledに変更
SELINUX=disabled

iptablesの無効化

こちらも同様の理由で無効化。

# service iptables stop
# service ip6tables stop

自動起動しないようにする。

# chkconfig iptables off
# chkconfig ip6tables off

VirtualBox Guest Additionsのインストール

まず、仮想マシン(VirtualBox VM)のメニューのDevicesからInsert Guest Additions CD image …を選択する。

そして、それをマウントしてCD内のコマンドを実行する。

# mkdir /media/cdrom
# mount -r /dev/cdrom /media/cdrom
# sh /media/cdrom/VBoxLinuxAdditions.run
# umount /media/cdrom

最後に、仮想マシン(VirtualBox VM)のメニューのDevicesからCD/DVD Devicesを選択し、Remove disk from virtual driveを選択してGuest Additions CD imageを取り出す。

udevのルールの削除

boxのOS起動時にネットワークデバイスのエラーが起きるのを避けるため、udevのルールを削除する。

# rm -f /etc/udev/rules.d/70-persistent-net.rules
# rm -rf /dev/.udev/
# rm -f /lib/udev/rules.d/75-persistent-net-generator.rules

box作成のための最適化

最終的なboxのサイズをできる限り小さくするために簡単な最適化を行う。

yum clean

# yum clean all

フラグメンテーションの解消

box作成時の圧縮効率を上げるため、ゼロ埋めしたファイルを作成し、削除する。

# dd if=/dev/zero of=/EMPTY bs=1M
# rm -f /EMPTY

OS シャットダウン

# shutdown -h now

NATのポートフォワーディング設定の削除

作業をしやすくするために行ったポートフォワーディングの設定を削除する。

  • 仮想マシンの設定を開く。
  • ネットワークのアダプター1(NAT)を選択し、「高度」の内容を展開。
  • 下部に表示される「ポートフォワーディング」ボタンを押してメニューを表示。
  • 作成した項目を選択してDelキーを押して削除。その後下部のOKボタンを押す。
  • 設定画面のOKボタンを押す。

以上でboxの作成準備が完了。

boxの作成

OS Xのターミナルから、Vagrantコマンドでboxを作成する。

$ vagrant package --base centos66

baseオプションは仮想マシン名を指定する。作成されたboxのサイズは482MBほど。

作成したboxの確認

作成したboxをVagrantに登録する。

$ vagrant box add --name CentOS-6.6-x86_64-minimal-ja-20150510 package.box
$ vagrant box list
CentOS-6.6-x86_64-minimal-ja-20150510 (virtualbox, 0)

Vagrantfileを作成して起動。sshでログインできるか確認する。

$ vagrant init CentOS-6.6-x86_64-minimal-ja-20150510
$ vagrant up
$ vagrant ssh

以上でboxの作成は完了。

参考