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のパスワードを設定。
- 本家のドキュメントに従い、
vagrant
にした。
- 本家のドキュメントに従い、
- 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の作成は完了。