デスクトップ右上の「ja」をクリックする。
「地域と言語の設定」を選択する。
「地域と言語」の「設定」画面が表示される。
2014/09/09
CentOS 7でmozcを使う・その7・Emacsの設定
Emacsでmozcを利用できるよう設定する。
『その0・Fedora 19レポジトリの準備』
『その1・mozcのビルド#1/2』
『その2・protobufのビルドとインストール』
『その3・zinniaおよびtomoeのビルドとインストール』
『その4・gypのビルド・インストール』
『その5・mozcのビルド#2/2とインストール』
『その6・Emacsの設定』
『その7・デスクトップの設定』
[alice@centos02 SPECS]$ cd [alice@centos02 ~]$ cat >> .emacs <<'EOL' ;; for mozc (require 'mozc) (setq default-input-method "japanese-mozc") [alice@centos02 ~]$ emacs -nw EOL [alice@centos02 ~]$
『その0・Fedora 19レポジトリの準備』
『その1・mozcのビルド#1/2』
『その2・protobufのビルドとインストール』
『その3・zinniaおよびtomoeのビルドとインストール』
『その4・gypのビルド・インストール』
『その5・mozcのビルド#2/2とインストール』
『その6・Emacsの設定』
『その7・デスクトップの設定』
CentOS 7でmozcを使う・その6・mozcのビルド#2/2とインストール
mozcのビルドに必要なパッケージはすべて準備出来た。
mozcのビルドを試みる。
原因は、/usr/lib64/qt-3.3/bin/rccが存在しないため。
mozcのビルドを試みる。
[alice@centos02 SPECS]$ rpmbuild -ba mozc.spec 実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.hQQUlx + umask 022 + cd /home/alice/rpmbuild/BUILD + cd /home/alice/rpmbuild/BUILD <<略>> g++ '-DOS_LINUX' '-DMOZC_BUILD' '-DCHANNEL_DEV' '-DENABLE_GTK_RENDERER' '-DMOZC_ENABLE_UNITTEST' '-DNDEBUG' '-DQT_NO_DEBUG' '-DNO_LOGGING' '-DIGNORE_HELP_FLAG' '-DIGNORE_INVALID_FLAG' -I. -Iout_linux/Release/obj/gen -Wall -Wno-char-subscripts -Wno-sign-compare -Wno-deprecated-declarations -Wwrite-strings -fPIC -fno-exceptions -fmessage-length=0 -fno-strict-aliasing -funsigned-char -include base/namespace.h -pipe -pthread -fno-omit-frame-pointer -fstack-protector --param=ssp-buffer-size=4 -O2 -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Wno-deprecated -std=gnu++0x -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -MMD -MF out_linux/Release/.deps/out_linux/Release/obj.target/http_client/net/proxy_manager.o.d.raw -c -o out_linux/Release/obj.target/http_client/net/proxy_manager.o net/proxy_manager.cc net/http_client.cc:587:9: note: #pragma message: HTTPClient is disabled. MOZC_COMPILE_MESSAGE("HTTPClient is disabled."); ^ LD_LIBRARY_PATH=/home/alice/rpmbuild/BUILD/mozc-1.15.1814.102/out_linux/Release/lib.host:/home/alice/rpmbuild/BUILD/mozc-1.15.1814.102/out_linux/Release/lib.target:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH; cd gui; mkdir -p /home/alice/rpmbuild/BUILD/mozc-1.15.1814.102/out_linux/Release/obj/gen/gui/tool; /usr/lib64/qt-3.3/bin/rcc -o "/home/alice/rpmbuild/BUILD/mozc-1.15.1814.102/out_linux/Release/obj/gen/gui/tool/qrc_mozc_tool.cc" -name qrc_mozc_tool tool/mozc_tool.qrc /bin/sh: /usr/lib64/qt-3.3/bin/rcc: No such file or directory make: *** [out_linux/Release/obj/gen/gui/tool/qrc_mozc_tool.cc] Error 127 make: *** Waiting for unfinished jobs.... Traceback (most recent call last): File "build_mozc.py", line 1467, inビルドが失敗する。main() File "build_mozc.py", line 1463, in main procedure[1](cmd_opts, cmd_args, original_directory_name) File "build_mozc.py", line 1086, in BuildMain BuildOnLinux(options, targets, original_directory_name) File "build_mozc.py", line 1042, in BuildOnLinux RunOrDie([make_command] + build_args + target_names) File "/home/alice/rpmbuild/BUILD/mozc-1.15.1814.102/build_tools/util.py", line 97, in RunOrDie '=========='])) build_tools.util.RunOrDieError: ========== ERROR: make -j2 MAKE_JOBS=2 BUILDTYPE=Release builddir_name=out_linux V=1 ibus_mozc mozc_emacs_helper mozc_server mozc_tool mozc_renderer ========== エラー: /var/tmp/rpm-tmp.nwszNW の不正な終了ステータス (%build) RPM ビルドのエラー: /var/tmp/rpm-tmp.nwszNW の不正な終了ステータス (%build) [alice@centos02 SPECS]$
原因は、/usr/lib64/qt-3.3/bin/rccが存在しないため。
CentOS 7でmozcを使う・その5・gypのビルド・インストール
gypをビルドする。
展開する。
展開する。
[alice@centos02 SPECS]$ cd [alice@centos02 ~]$ rpm -ivh gyp-0.1-0.10.1617svn.fc19.src.rpm 警告: gyp-0.1-0.10.1617svn.fc19.src.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID fb4b18e6: NOKEY 更新中 / インストール中... 1:gyp-0.1-0.10.1617svn.fc19 ################################# [100%] 警告: ユーザー mockbuild は存在しません - root を使用します 警告: グループ mockbuild は存在しません - root を使用します 警告: ユーザー mockbuild は存在しません - root を使用します <<略>> 警告: グループ mockbuild は存在しません - root を使用します [alice@centos02 ~]$
CentOS 7でmozcを使う・その4・zinniaおよびtomoeのビルドとインストール
続いて、zinniaのビルドを試みる。
tomoeは、CentOS 7用レポジトリに存在していない。
[alice@centos02 SPECS]$ cd [alice@centos02 ~]$ rpm -ivh zinnia-0.06-16.fc19.src.rpm 警告: zinnia-0.06-16.fc19.src.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID fb4b18e6: NOKEY 更新中 / インストール中... 1:zinnia-0.06-16.fc19 ################################# [100%] 警告: ユーザー mockbuild は存在しません - root を使用します 警告: グループ mockbuild は存在しません - root を使用します 警告: ユーザー mockbuild は存在しません - root を使用します <<略>> 警告: グループ mockbuild は存在しません - root を使用します [alice@centos02 ~]$ cd rpmbuild/SPECS/ [alice@centos02 SPECS]$ rpmbuild -ba zinnia.spec 警告: %changelog に偽の日付: Fri Mar 04 2010 Liang Suilongパッケージtomoeが不足していることが判る。- 0.05-3 警告: %changelog に偽の日付: Wed Mar 02 2010 Liang Suilong - 0.05-2 エラー: ビルド依存性の失敗: tomoe は zinnia-0.06-16.el7.centos.x86_64 に必要とされています [alice@centos02 SPECS]$
tomoeは、CentOS 7用レポジトリに存在していない。
[alice@centos02 SPECS]$ cd [alice@centos02 ~]$ yum info tomoe 読み込んだプラグイン:fastestmirror, langpacks Loading mirror speeds from cached hostfile エラー: 表示するパッケージはありません [alice@centos02 ~]$
CentOS 7でmozcを使う・その3・protobufのビルドとインストール
まず、protobufのビルドを試みる。
基本的な手順は、mozcと同じ。
基本的な手順は、mozcと同じ。
[alice@centos02 ~]$ rpm -ivh protobuf-2.5.0-4.fc19.src.rpm 警告: protobuf-2.5.0-4.fc19.src.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID fb4b18e6: NOKEY 更新中 / インストール中... 1:protobuf-2.5.0-4.fc19 ################################# [100%] 警告: ユーザー mockbuild は存在しません - root を使用します 警告: グループ mockbuild は存在しません - root を使用します <<略>> 警告: グループ mockbuild は存在しません - root を使用します [alice@centos02 ~]$ cd rpmbuild/SPECS/ [alice@centos02 SPECS]$ rpmbuild -ba protobuf.spec Package emacs was not found in the pkg-config search path. Perhaps you should add the directory containing `emacs.pc' to the PKG_CONFIG_PATH environment variable No package 'emacs' found エラー: ビルド依存性の失敗: emacs-el >= 24.1 は protobuf-2.5.0-4.el7.centos.x86_64 に必要とされてい ます python-devel は protobuf-2.5.0-4.el7.centos.x86_64 に必要とされています java-devel >= 1.6 は protobuf-2.5.0-4.el7.centos.x86_64 に必要とされています maven-local は protobuf-2.5.0-4.el7.centos.x86_64 に必要とされています maven-compiler-plugin は protobuf-2.5.0-4.el7.centos.x86_64 に必要とされています maven-install-plugin は protobuf-2.5.0-4.el7.centos.x86_64 に必要とされ ています maven-jar-plugin は protobuf-2.5.0-4.el7.centos.x86_64 に必要とされてい ます maven-javadoc-plugin は protobuf-2.5.0-4.el7.centos.x86_64 に必要とされ ています maven-resources-plugin は protobuf-2.5.0-4.el7.centos.x86_64 に必要とさ れています maven-surefire-plugin は protobuf-2.5.0-4.el7.centos.x86_64 に必要とされています maven-antrun-plugin は protobuf-2.5.0-4.el7.centos.x86_64 に必要とされています [alice@centos02 SPECS]$不足しているパッケージについて、CentOS 7用レポジトリからインストールを試みる。
CentOS 7でmozcを使う・その2・mozcのビルド#1/2
mozcのSRPMをダウンロードし、ビルド(コンパイル)を試みる。
「rpm -ivh」で展開する。
~/rpmbuildに展開される。
[alice@centos02 ~]$ yumdownloader --source --enablerepo=fedora,fedora-updates mozc 読み込んだプラグイン:fastestmirror, langpacks Enabling base-source repository Enabling updates-source repository <<略>> 警告: /home/alice/mozc-1.15.1814.102-1.fc19.src.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID fb4b18e6: NOKEY mozc-1.15.1814.102-1.fc19.src.rpm の公開鍵がインストールされていません mozc-1.15.1814.102-1.fc19.src.rpm | 35 MB 02:40 [alice@centos02 ~]$
「rpm -ivh」で展開する。
~/rpmbuildに展開される。
[alice@centos02 ~]$ rpm -ivh mozc-1.15.1814.102-1.fc19.src.rpm 警告: mozc-1.15.1814.102-1.fc19.src.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID fb4b18e6: NOKEY 更新中 / インストール中... 1:mozc-1.15.1814.102-1.fc19 ################################# [100%] 警告: ユーザー mockbuild は存在しません - root を使用します 警告: グループ mockbuild は存在しません - root を使用します <<略>> 警告: グループ mockbuild は存在しません - root を使用します [alice@centos02 ~]$
CentOS 7でmozcを使う・その1・Fedora 19レポジトリの準備
Fedora 19用yumレポジトリを利用できるようにする。
RPMファイルを展開するために、rpmdevtoolsを導入する。
RPMパッケージをダウンロードする。
RPMファイルを展開するために、rpmdevtoolsを導入する。
[root@centos02 ~]# yum install -y rpmdevtools 読み込んだプラグイン:fastestmirror, langpacks Loading mirror speeds from cached hostfile 依存性の解決をしています <<略>> インストール: rpmdevtools.noarch 0:8.3-5.el7 完了しました! [root@centos02 ~]#
RPMパッケージをダウンロードする。
[alice@centos02 ~]$ wget 'http://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/19/Fedora/x86_64/os/Packages/f/fedora-release-19-2.noarch.rpm' --2014-09-08 21:54:53-- http://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/19/Fedora/x86_64/os/Packages/f/fedora-release-19-2.noarch.rpm ftp.jaist.ac.jp (ftp.jaist.ac.jp) をDNSに問いあわせています... 150.65.7.130, 2001:df0:2ed:feed::feed ftp.jaist.ac.jp (ftp.jaist.ac.jp)|150.65.7.130|:80 に接続しています... 接続しま した。 <<略>> 2014-09-08 21:54:54 (77.5 KB/s) - `fedora-release-19-2.noarch.rpm' へ保存完了 [32472/32472] [alice@centos02 ~]$
CentOS 7でmozcを使う・その0・概要
RHEL 7 (Red Hat Enterprise Linux 7)やCentOS 7などの互換OSでは、標準で日本語入力にkkcを利用できる。
しかし、このkkcは、非常に使いづらい。
この代替として、mozcを導入する方法を紹介する。
Mozcは、Google 日本語入力の流れを汲む、日本語IME(Input Method Editor)。
複数のUNIX系OSをはじめ、Windowsにも対応している。
しかし、このkkcは、非常に使いづらい。
この代替として、mozcを導入する方法を紹介する。
Mozcは、Google 日本語入力の流れを汲む、日本語IME(Input Method Editor)。
複数のUNIX系OSをはじめ、Windowsにも対応している。
2014/09/07
CentOS 7とvmware-tools
RHEL 7 (Red Hat Enterprise Linux 7)互換のCentOS 7をVMware ESXi上のゲストOSとして動かす場合、vmware-toolsを別途インストールする必要が無い。
CentOS 7には、標準パッケージにvmware-tools相等のものが入っている。
それを利用すれば、OS起動後にVMwareが提供するvmware-toolsを別途インストールする必要が無い。
パッケージグループとしては、guest-agentsおよびguest-desktop-agentsをインストールすればよい。
CentOS 7には、標準パッケージにvmware-tools相等のものが入っている。
それを利用すれば、OS起動後にVMwareが提供するvmware-toolsを別途インストールする必要が無い。
パッケージグループとしては、guest-agentsおよびguest-desktop-agentsをインストールすればよい。
$ yum --disablerepo=epel groups info guest-agents guest-desktop-agents 読み込んだプラグイン:fastestmirror, langpacks Loading mirror speeds from cached hostfile グループ: ゲストエージェント グループ ID: guest-agents 説明: ハイパーバイザー配下で稼働する場合に使用するエージェントです。 強制的なパッケージ: =hyperv-daemons =open-vm-tools =qemu-guest-agent グループ: ゲストデスクトップエージェント グループ ID: guest-desktop-agents 説明: 仮想化したデスクトップとして稼働する場合に使用するエージェントです。 強制的なパッケージ: =open-vm-tools-desktop qemu-guest-agent =spice-vdagent $なお、上の実行例では、yumコマンドで非標準レポジトリであるepelを無効化するために、disablerepoオプションを使用している。
2014/08/24
CentOS 7のKickstartファイル中でrepoコマンドのnameオプションを使う場合の注意
Red Hat Enterprise Linux 7 (RHEL7)互換OS、CentOS 7のインストールをAnaconda Kickstartで自動化する場合、CentOS 6までとは、異なる動作をする場合がある。
Kickstartファイルでrepoコマンドを使う場合、CentOS 6までは、
ところが、CentOS 7では、このように指定した場合、このレポジトリは無視されてしまう。
従って例えば、
Kickstartファイルでrepoコマンドを使う場合、CentOS 6までは、
repo --name="CentOS Update (Local)" --baseurl=http://centos.repository.local/centos/6/updates/x86_64 --cost=1
の様に、nameオプションに空白を含んだ文字列を指定しても問題なく動作したと思う。ところが、CentOS 7では、このように指定した場合、このレポジトリは無視されてしまう。
従って例えば、
repo --name=CentOS-Update-Local --baseurl=http://centos.repository.local/centos/7/updates/x86_64 --cost=1
の様に、空白を含まない文字列を指定する必要がある。
2012/09/28
SSL/TLSポートの試験にopenssl s_client・gnutls-cliを使う
通常のTCPポート試験には、nc(1)コマンドを使う(以前はtelnet(1)コマンドがよく使われていた)。例えば、POP(110/tcp)は、以下の様に試験できる。
[user01@rhel01 ~]$ nc localhost 110 +OK Dovecot ready. USER user01 +OK PASS password +OK Logged in. LIST +OK 1 messages: 1 448 . QUIT +OK Logging out. [user01@rhel01 ~]$
では、SSL/TLSで暗号化されたTCPポートのテストはどうすればよいか?
まず、openssl(1)コマンドを用いる方法がある。このopensslコマンドのサブコマンドs_clientに、接続先を指定するオプション「-connect host:port」を与えて試験すればよい。例えば、POP3S(995/tcp)は、以下の様に試験できる。
[user01@rhel01 ~]$ openssl s_client -connect localhost:pop3s CONNECTED(00000003) depth=0 /OU=IMAP server/CN=imap.example.com/emailAddress=postmaster@example.com verify error:num=18:self signed certificate verify return:1 depth=0 /OU=IMAP server/CN=imap.example.com/emailAddress=postmaster@example.com verify return:1 --- Certificate chain 0 s:/OU=IMAP server/CN=imap.example.com/emailAddress=postmaster@example.com i:/OU=IMAP server/CN=imap.example.com/emailAddress=postmaster@example.com --- Server certificate -----BEGIN CERTIFICATE----- MIICQzCCAaygAwIBAgIJALDUM09AsGlJMA0GCSqGSIb3DQEBBQUAMFgxFDASBgNV <<略>> Mk2FmzapbpeX11HSqprCX984Ofn00Ou8/AS2d9yEeJ/fsbB6UO9L8DZb0gL9nrkL L7oDAsrwYg== -----END CERTIFICATE----- subject=/OU=IMAP server/CN=imap.example.com/emailAddress=postmaster@example.com issuer=/OU=IMAP server/CN=imap.example.com/emailAddress=postmaster@example.com --- No client certificate CA names sent --- SSL handshake has read 1154 bytes and written 319 bytes --- New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA Server public key is 1024 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1 Cipher : DHE-RSA-AES256-SHA Session-ID: 69F38BFB461D7E2CA1ED16CD1F7CA61B0CEEE69E9EB6AB64A45FDEC3BC4EE710 Session-ID-ctx: Master-Key: 77544FE452E4FE2E1D735F023CD36BB5C8F6BD91BB62FB7A12C105144FB85A6F6FD2D2442B97F8DA96E753C21E7FB78A Key-Arg : None Krb5 Principal: None Start Time: 1348815266 Timeout : 300 (sec) Verify return code: 18 (self signed certificate) --- +OK Dovecot ready. USER user01 +OK PASS password +OK Logged in. LIST +OK 1 messages: 1 448 . QUIT DONE [user01@rhel01 ~]$
別法として、gnutls-cli(1)コマンドを使う方法もある。
[user01@rhel01 ~]$ gnutls-cli --port pop3s localhostResolving 'localhost'... Connecting to '127.0.0.1:995'... - Certificate type: X.509 - Got a certificate list of 1 certificates. - Certificate[0] info: # The hostname in the certificate does NOT match 'localhost'. # valid since: Fri Sep 28 14:51:09 JST 2012 # expires at: Sat Sep 28 14:51:09 JST 2013 # fingerprint: E4:CB:D0:E4:F7:78:E8:59:20:45:0F:33:D4:4C:DB:01 # Subject's DN: OU=IMAP server,CN=imap.example.com,EMAIL=postmaster@example.com # Issuer's DN: OU=IMAP server,CN=imap.example.com,EMAIL=postmaster@example.com - Peer's certificate issuer is unknown - Peer's certificate is NOT trusted - Version: TLS 1.0 - Key Exchange: DHE RSA - Cipher: AES 256 CBC - MAC: SHA - Compression: DEFLATE - Handshake was completed - Simple Client Mode: +OK Dovecot ready. USER user01 +OK PASS password +OK Logged in. LIST +OK 1 messages: 1 448 . QUIT +OK Logging out. *** Fatal error: A TLS packet with unexpected length was received. *** Server has terminated the connection abnormally. [user01@rhel01 ~]$
なお、Red Hat系であれば、openssl(1)・gnutls-cli(1)両コマンドはそれぞれ、openssl・gnutls-utilsの両パッケージに含まれる。
[user01@rhel01 ~]$ rpm -qf $(which openssl) openssl-0.9.8e-20.el5 openssl-0.9.8e-20.el5 [user01@rhel01 ~]$ rpm -qf $(which gnutls-cli) gnutls-utils-1.4.1-3.el5_4.8 [user01@rhel01 ~]$
2012/01/28
Red Hat 6系でLLDPを使う・その2
前回の補足。 「lldptool set-tlv」 コマンドの「-V」オプションで指定できる項目にはどう言うものがあるだろう?調べてみよう。
『Red Hat 6系でLLDPを使う・その2』
[root@sl01 ~]# lldptool -h Usage: lldptoolサービスlldpadの設定ファイルは、/var/lib/lldpad/lldpad.conf。この設定ファイルは、lldpadデーモン起動時に存在していなければ、デーモンが自動的に作成する。[options] [arg] general command line usage format lldptool go into interactive mode [options] [arg] general interactive command format Options: -i [ifname] network interface -V [tlvid] TLV identifier may be numeric or keyword (see below) -n "neighbor" option for command -a "add" option for command -d "remove" option for command -r show raw message -R show only raw messages Commands: license show license information -h|help show command usage information -v|version show version -q|quit exit lldptool (interactive mode) -S|stats get LLDP statistics for ifname -t|get-tlv get TLVs from ifname -T|set-tlv set arg for tlvid to value -l|get-lldp get the LLDP parameters for ifname -L|set-lldp set the LLDP parameter for ifname TLV identifiers: chassisID : Chassis ID TLV portID : Port ID TLV TTL : Time to Live TLV portDesc : Port Description TLV sysName : System Name TLV sysDesc : System Description TLV sysCap : System Capabilities TLV mngAddr : Management Address TLV macPhyCfg : MAC/PHY Configuration Status TLV powerMdi : Power via MDI TLV linkAgg : Link Aggregation TLV MTU : Maximum Frame Size TLV LLDP-MED : LLDP-MED Settings medCap : LLDP-MED Capabilities TLV medPolicy : LLDP-MED Network Policy TLV medLoc : LLDP-MED Location TLV medPower : LLDP-MED Extended Power-via-MDI TLV medHwRev : LLDP-MED Hardware Revision TLV medFwRev : LLDP-MED Firmware Revision TLV medSwRev : LLDP-MED Software Revision TLV medSerNum : LLDP-MED Serial Number TLV medManuf : LLDP-MED Manufacturer Name TLV medModel : LLDP-MED Model Name TLV medAssetID : LLDP-MED Asset ID TLV DCBXv1 : PRE-CEE DCBX TLV DCBX : CEE DCBX TLV evbCfg : EVB Configuration TLV vdp : VDP protocol configuration [root@sl01 ~]#
[root@sl01 ~]# service lldpad stop Shutting down lldpad: [done] [ OK ] [root@sl01 ~]# rm /var/lib/lldpad/lldpad.conf rm: remove 通常ファイル `/var/lib/lldpad/lldpad.conf'? y [root@sl01 ~]# ls -l /var/lib/lldpad/lldpad.conf ls: cannot access /var/lib/lldpad/lldpad.conf: そのようなファイルやディレクトリ はありません [root@sl01 ~]# service lldpad start Starting lldpad: [done] [ OK ] [root@sl01 ~]# ls -l /var/lib/lldpad/lldpad.conf -rw-------. 1 root root 213 1月 28 11:02 2012 /var/lib/lldpad/lldpad.conf [root@sl01 ~]#中身はテキストファイルだ。
[root@sl01 ~]# cat /var/lib/lldpad/lldpad.conf dcbx : { version = "1.0"; dcbx_version = 2; }; lldp : { em1 : { tlvid00000001 : { info = "04D4AE52724ADD"; }; tlvid00000002 : { info = "03D4AE52724ADD"; }; }; }; [root@sl01 ~]#デーモン起動時にリンクアップしているインターフェースに関する定義が自動的に追加されている。 この設定ファイルは、前回までに見たとおり、lldptool(8)コマンドを使い間接的に編集するが、手で編集できないわけでもない。
[root@sl01 ~]# service lldpad stop Shutting down lldpad: [done] [ OK ] [root@sl01 ~]# rm /var/lib/lldpad/lldpad.conf rm: remove 通常ファイル `/var/lib/lldpad/lldpad.conf'? y [root@sl01 ~]# cp lldpad.conf /var/lib/lldpad/ [root@sl01 ~]# cat /var/lib/lldpad/lldpad.conf dcbx : { version = "1.0"; dcbx_version = 2; }; lldp : { common : { adminStatus = 3; tlvid00000005 : { enableTx = true; }; tlvid00000006 : { enableTx = true; }; tlvid00000004 : { enableTx = true; }; tlvid00000007 : { enableTx = true; }; tlvid00120f01 : { enableTx = true; }; tlvid00120f03 : { enableTx = true; }; tlvid00120f04 : { enableTx = true; }; tlvid00000008 : { enableTx = true; }; }; }; [root@sl01 ~]#この状態でデーモンを起動すると、期待通りLLDPの送受信が有効となっている。
[root@sl01 ~]# service lldpad start Starting lldpad: [done] [ OK ] [root@sl01 ~]# lldptool get-tlv -i em1 Chassis ID TLV MAC: d4:ae:52:72:4a:dd Port ID TLV MAC: d4:ae:52:72:4a:dd Time to Live TLV 120 Port Description TLV Interface 4 as em1 System Name TLV sl01.mynetwork.local System Description TLV Linux sl01.mynetwork.local 2.6.32-220.2.1.el6.x86_64 #1 SMP Thu Dec 22 11:15:52 CST 2011 x86_64 System Capabilities TLV System capabilities: Station Only Enabled capabilities: Station Only Management Address TLV IPv6: f246:4000:: Ifindex: 4 MAC/PHY Configuration Status TLV Auto-negotiation supported and enabled PMD auto-negotiation capabilities: 0x8037 MAU type: 1000 BaseTFD Link Aggregation TLV Aggregation not capable Currently not aggregated Aggregated Port ID: 0 Maximum Frame Size TLV 1522 End of LLDPDU TLV [root@sl01 ~]#ただし、デーモン起動時にリンクアップしていたインターフェースの設定が自動的に追加されている。
[root@sl01 ~]# diff lldpad.conf /var/lib/lldpad/lldpad.conf 43a44,58 > em1 : > { > tlvid00000001 : > { > info = "04D4AE52724ADD"; > }; > tlvid00000002 : > { > info = "03D4AE52724ADD"; > }; > tlvid00000008 : > { > ipv6 = "f246:4000::"; > }; > }; [root@sl01 ~]#『Red Hat 6系でLLDPを使う・その1』
『Red Hat 6系でLLDPを使う・その2』
Red Hat 6系でLLDPを使う・その1
Red Hat Enterprise Linux 6 (RHEL6)およびその互換ディストリビューションでは、LLDPがサポートされている。今回の記事では、これを使ってみる。
LLDP (Link Layer Discovery Protocol)は、ネットワークインターフェースに直接接続されている対向機器が何かを知ることができる仕組み。Cisco製品を使ったことがあれば、CDPのオープン規格版だと思えば理解しやすいだろう。例えば、次のように使う。
まずは、サーバ側の設定を見てみよう。ネットワーク機器側は既に設定されているものとする。以下は、RHEL6.1と互換のScientific Linux 6.1で検証した。
RHEL系でLLDP機能を担うのは、lldpadというパッケージ。まず、これをインストールする。
ネットワーク機器側で確認する。
さらに、ホスト名が送信される様設定してみよう。設定後は再起動が必要。
他の情報も有効にしてみよう。
『Red Hat 6系でLLDPを使う・その1』
『Red Hat 6系でLLDPを使う・その2』
LLDP (Link Layer Discovery Protocol)は、ネットワークインターフェースに直接接続されている対向機器が何かを知ることができる仕組み。Cisco製品を使ったことがあれば、CDPのオープン規格版だと思えば理解しやすいだろう。例えば、次のように使う。
[root@sl01 ~]# lldptool get-tlv -i em1 -n Chassis ID TLV MAC: 08:2e:5f:85:7f:eb Port ID TLV Local: 3 Time to Live TLV 120 Port Description TLV 3 System Name TLV ProCurve Switch 2510G-48 System Description TLV ProCurve J9280A Switch 2510G-48, revision Y.11.12, ROM N.10.02 (/sw/code/build/cod(cod11)) System Capabilities TLV System capabilities: Bridge Enabled capabilities: Bridge Management Address TLV IPv4: 172.18.0.245 Ifindex: 0 End of LLDPDU TLV [root@sl01 ~]#出力結果を見ると、自身sl01のインターフェースem1の対向機器は、ProCurve Switch 2510G-48であって、そのポート3と接続されていることがわかる。その他、様々な情報を得ることができる。ただし、CDPとは違い、LLDPは、ネットワーク機器側、サーバ側双方ともデフォルトでは有効ではない。従って、有効にするための設定が必要。
まずは、サーバ側の設定を見てみよう。ネットワーク機器側は既に設定されているものとする。以下は、RHEL6.1と互換のScientific Linux 6.1で検証した。
RHEL系でLLDP機能を担うのは、lldpadというパッケージ。まず、これをインストールする。
[root@sl01 ~]# yum install -y lldpad Loaded plugins: refresh-packagekit sl | 1.9 kB 00:00 sl-security | 1.9 kB 00:00 Setting up Install Process Resolving Dependencies <<略>> Running Transaction Warning: RPMDB altered outside of yum. Installing : libconfig-1.3.2-1.1.el6.x86_64 1/2 Installing : lldpad-0.9.41-4.el6.x86_64 2/2 Installed: lldpad.x86_64 0:0.9.41-4.el6 Dependency Installed: libconfig.x86_64 0:1.3.2-1.1.el6 Complete! [root@sl01 ~]#インストールすると、lldpadというサービスが追加される。サービスが起動していない状態では、設定できない。インストール直後は、サービスが起動されていないため、起動する。
[root@sl01 ~]# chkconfig --list lldpad lldpad 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@sl01 ~]# service lldpad start Starting lldpad: [done] [ OK ] [root@sl01 ~]#LLDPフレームを送受信するよう設定する。設定後、サービスを再起動しないと反映されないので注意する。
[root@sl01 ~]# lldptool set-lldp adminStatus=rxtx [root@sl01 ~]# service lldpad restart Checking for service lldpad: running Shutting down lldpad: [done] [ OK ] Starting lldpad: [done] [ OK ] [root@sl01 ~]#タイミングによるが、まず最初にLLDPフレームをいくつか送信した後、ネットワーク機器側からのLLDPフレームが届く。これは、以下の様に確認することができる。
[root@sl01 ~]# lldptool stats -i em1 Total Frames Transmitted = 5 Total Discarded Frames Received = 0 Total Error Frames Received = 0 Total Frames Received = 0 Total Discarded TLVs = 0 Total Unrecognized TLVs = 0 Total Ageouts = 0 [root@sl01 ~]# lldptool stats -i em1 Total Frames Transmitted = 5 Total Discarded Frames Received = 0 Total Error Frames Received = 0 Total Frames Received = 2 Total Discarded TLVs = 0 Total Unrecognized TLVs = 0 Total Ageouts = 0 [root@sl01 ~]#一回目の実行では、送信済フレームが5、受信済フレームが0だが、二回目は、受信フレームが2になっていることが解る。この状態になると、対向機器の情報を得ることができる。
[root@sl01 ~]# lldptool get-tlv -i em1 -n Chassis ID TLV MAC: 08:2e:5f:85:7f:eb Port ID TLV Local: 3 Time to Live TLV 120 Port Description TLV 3 System Name TLV ProCurve Switch 2510G-48 System Description TLV ProCurve J9280A Switch 2510G-48, revision Y.11.12, ROM N.10.02 (/sw/code/build/cod(cod11)) System Capabilities TLV System capabilities: Bridge Enabled capabilities: Bridge Management Address TLV IPv4: 172.18.0.245 Ifindex: 0 End of LLDPDU TLV [root@sl01 ~]#一方、この状態ではサーバ側からはどう言う情報が送信されているのだろう。サーバ側から確認する。
[root@sl01 ~]# lldptool get-tlv -i em1 Chassis ID TLV MAC: d4:ae:52:72:4a:dd Port ID TLV MAC: d4:ae:52:72:4a:dd Time to Live TLV 120 End of LLDPDU TLV [root@sl01 ~]#シャーシID(Chassis ID)およびポートID(Port ID)としてMACアドレスが、TTLとして120[秒]が送信される設定になっている。
ネットワーク機器側で確認する。
ProCurve Switch 2510G-48# show lldp info remote-device 3 LLDP Remote Device Information Detail Local Port : 3 ChassisType : mac-address ChassisId : d4 ae 52 72 4a dd PortType : mac-address PortId : d4 ae 52 72 4a dd SysName : System Descr : PortDescr : System Capabilities Supported : System Capabilities Enabled : Remote Management Address ProCurve Switch 2510G-48#それらの情報がネットワーク機器側に認識されていることが判る。
さらに、ホスト名が送信される様設定してみよう。設定後は再起動が必要。
[root@sl01 ~]# lldptool set-tlv -V sysName enableTx=yes [root@sl01 ~]# service lldpad restart Checking for service lldpad: running Shutting down lldpad: [done] [ OK ] Starting lldpad: [done] [ OK ] [root@sl01 ~]#ネットワーク機器側で確認する。
ProCurve Switch 2510G-48# show lldp info remote-device 3 LLDP Remote Device Information Detail Local Port : 3 ChassisType : mac-address ChassisId : d4 ae 52 72 4a dd PortType : mac-address PortId : d4 ae 52 72 4a dd SysName : sl01.mynetwork.local System Descr : PortDescr : System Capabilities Supported : System Capabilities Enabled : Remote Management Address ProCurve Switch 2510G-48#ホスト名が認識されている。
他の情報も有効にしてみよう。
[root@sl01 ~]# lldptool set-tlv -V sysDesc enableTx=yes [root@sl01 ~]# lldptool set-tlv -V portDesc enableTx=yes Checking for service lldpad: running Shutting down lldpad: [done] [ OK ] Starting lldpad: [done] [ OK ] [root@sl01 ~]#確認。
ProCurve Switch 2510G-48# show lldp info remote-device 3 LLDP Remote Device Information Detail Local Port : 3 ChassisType : mac-address ChassisId : d4 ae 52 72 4a dd PortType : mac-address PortId : d4 ae 52 72 4a dd SysName : sl01.mynetwork.local System Descr : Linux sl01.mynetwork.local 2.6.32-220.2.1.el6.x86_64 #1 S... PortDescr : Interface 4 as em1 System Capabilities Supported : System Capabilities Enabled : Remote Management Address ProCurve Switch 2510G-48#システム詳細(System Descr)にカーネルのバージョンが表示されている。セキュリティ的には表示しない方がいいかもしれない。
『Red Hat 6系でLLDPを使う・その1』
『Red Hat 6系でLLDPを使う・その2』
2011/11/04
Logrotateはいつログを圧縮するか、あるいは、postrotateはいつ実行されるか
日々刻々、サーバにログはたまり続け、ディスク容量を圧迫する場合がある。これを回避するため、ログファイルをrename (
この
さて、この
設定ファイル中で、ディレクティブ
これは、
mv
)、圧縮(gzip
)し、保存期間を過ぎたものを削除する、ローテートと呼ばれる操作を行う必要がある。RHELやCentOSでは、logrotate
というコマンドでこれを行う。この
logrotate
の設定ファイルは、/etc/logrotate.conf
および、その中から読み出される/etc/logrotate.d/*
である。詳しくは、logrotate(8)を参照のこと。さて、この
logrotate
を使って、複数のサーバのログを、NFSなどの共有ディスク(仮に/var/oldlogs
とする)に集約する場合を考えてみる。まず、複数のサーバのログが同ファイル名のだと一箇所に集約したときに上書きされてしまう可能性があるので、例えば、/var/log/some/log-ホスト名
の様にしなければならない。設定ファイル中で、ディレクティブ
olddir directory
でその共有ディスクに移動させる方法を思いつくかもしれない。/var/log/some/log-ホスト名 { olddir /var/oldlogs }しかし、これは上手くいかない。というのは、
logrotate
では、ローテート後のファイルは、元ファイルと同じデバイス上にしか置けない、という制限があるからだ。# cat /etc/logrotate.d/test /var/log/some/log-ホスト名 { olddir /var/oldlog } # ls /var/log/some log-ホスト名 # logrotate -f /etc/logrotate.d/test error: /etc/logrotate.d/test:3 olddir /var/oldlog and log file /var/log/some/log-ホスト名 are on different devices #これを回避するために、ローテート後に共有ディスクへのコピーを実行することを思いつくだろう。設定ファイル中で
postrotate/endscript
ディレクティブを使えば実現できる。このディレクティブを用いると、mv
直後にシェルスクリプトを実行させることができるためだ。
# cat /etc/logrotate.d/test /var/log/some/log-ホスト名 { rotate 4 postrotate cp -p /var/log/some/log-ホスト名.1 /var/oldlog endscript } # logrotate -f /etc/logrotate.d/test # ls /var/log/some log-ホスト名.1 # ls /var/oldlog log-ホスト名.1 lost+found #しかし、これにもまだ問題が出る場合がある。ディレクティブ
compress
を使って、ログファイルを圧縮する場合だ。次の様にして上手くいくだろうか?
# cat /etc/logrotate.d/test /var/log/some/log-ホスト名 { rotate 4 compress postrotate cp -p /var/log/some/log-ホスト名.1.gz /var/oldlog endscript } #これは上手くいかない。
# ls /var/log/some/log-ホスト名* /var/log/some/log-ホスト名 # ls /var/oldlog/log-ホスト名* ls: /var/oldlog/log-ホスト名*: No such file or directory # logrotate -f /etc/logrotate.d/test cp: cannot stat `/var/log/some/log-ホスト名.1.gz': No such file or directory error: error running postrotate script for /var/log/some/log-ホスト名 # ls /var/log/some/log-ホスト名* /var/log/some/log-ホスト名.1.gz # ls /var/oldlog/log-ホスト名.* ls: /var/oldlog/log-ホスト名*: No such file or directory #なぜか?それは、実行タイミングにある。
logrotate
は、まずmv
し、postrotate/endscript
ディレクティブのシェルスクリプトを実行した後、gzip
で圧縮するため、シェルスクリプト実行時には、まだ*.1.gz
というファイルは存在せず、圧縮前の*.1
のままである。これは、
postrotate/endscript
ディレクティブの代わりにlastaction/endscript
ディレクティブを使えば解決できる。# cat /etc/logrotate.d/test /var/log/some/log-ホスト名 { rotate 4 compress lastaction cp -p /var/log/some/log-ホスト名.1.gz /var/oldlog endscript } # ls /var/log/some/log-ホスト名* /var/log/some/log-ホスト名 # ls /var/oldlog/log-ホスト名* ls: /var/oldlog/log-ホスト名*: No such file or directory # logrotate -f /etc/logrotate.d/test # ls /var/log/some/log-ホスト名* /var/log/some/log-ホスト名.1.gz # ls /var/oldlog/log-ホスト名* /var/oldlog/log-ホスト名.1.gz #このままでは、共有ディスクには一世代しか保存されない。また、一度コピーに失敗すると、復旧できない。これらを解決するには、
dateext
ディレクティブとrsync
コマンドを用いる。# cat /etc/logrotate.d/test /var/log/some/log-ホスト名 { rotate 4 compress dateext lastaction rsync -a /var/log/some/log-ホスト名-*.gz /var/oldlog endscript } # ls /var/log/some/log-ホスト名* /var/log/some/log-ホスト名 # ls /var/oldlog/log-ホスト名* ls: /var/oldlog/log-ホスト名*: No such file or directory # logrotate -f /etc/logrotate.d/test # ls /var/log/some/log-ホスト名* /var/log/some/log-ホスト名-20111104.gz # ls /var/oldlog/log-ホスト名* /var/oldlog/log-ホスト名-20111104.gz #
2009/04/08
CentOS 5.2からCentOS 5.3へアップグレードする
CentOS 5.3がリリースされた。今回は、CentOS 5.2からCentOS 5.3へのアップグレードを行ってみる。
リリースノート、「4. 既知の問題点」によると、アップグレードの際には、いくつか注意しなければならない点がある。一般的な注意点は以下の通り(他にもあるので、各自確認して欲しい)。
まず、リリースノートの通り、CentOS 5.2を最新にした状態から、glibcの更新を行う。リモートから実行する場合は、やはりリリースノートに従い
リリースノート、「4. 既知の問題点」によると、アップグレードの際には、いくつか注意しなければならない点がある。一般的な注意点は以下の通り(他にもあるので、各自確認して欲しい)。
なお、ISOイメージをダウンロードする場合は、BitTorrentを使用して欲しい。
- CentOS 5.2 から 5.3 へアップデートした時、rpm を実行すると次のメッセージが表示されることがあります。「
rpmdb: unable to lock mutex: Invalid argument
」これは glibc に起因する問題です。CentOS 5.3 へアップデートする前に glibc をアップデートしてください。次のように yum コマンドを実行します。# yum clean all && yum update glibc\* && yum update- SSHを経由してリモートからアップデートを実行する際、
screen
コマンドを併用するなどコネクションが失われた時のインパクトを最小限にしてください。- 5.2が全部アップデートされている場合、もし[base]リポジトリだけで5.3にアップデートしようとすると依存性の問題が起きることがあります。[updates]リポジトリもenableしておけばこの問題はなくなります。
まず、リリースノートの通り、CentOS 5.2を最新にした状態から、glibcの更新を行う。リモートから実行する場合は、やはりリリースノートに従い
screen
コマンドを使用する。[root@dc4 ~]# yum clean allアップグレードを実行する。
Loading "fastestmirror" plugin
Cleaning up Everything
Cleaning up list of fastest mirrors
[root@dc4 ~]# yum update glibc\*
Loading "fastestmirror" plugin
Determining fastest mirrors
* base: centos.repository.destroyers
* updates: centos.repository.destroyers
* addons: centos.repository.destroyers
* extras: centos.repository.destroyers
base 100% |=========================| 1.1 kB 00:00
primary.xml.gz 100% |=========================| 878 kB 00:00
base : ################################################## 2508/2508
updates 100% |=========================| 951 B 00:00
primary.xml.gz 100% |=========================| 79 kB 00:00
updates : ################################################## 111/111
addons 100% |=========================| 951 B 00:00
primary.xml.gz 100% |=========================| 157 B 00:00
extras 100% |=========================| 1.1 kB 00:00
primary.xml.gz 100% |=========================| 90 kB 00:00
extras : ################################################## 298/298
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package glibc.i686 0:2.5-34 set to be updated
---> Package glibc-common.i386 0:2.5-34 set to be updated
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Updating:
glibc i686 2.5-34 base 5.2 M
glibc-common i386 2.5-34 base 16 M
Transaction Summary
=============================================================================
Install 0 Package(s)
Update 2 Package(s)
Remove 0 Package(s)
Total download size: 22 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): glibc-common-2.5-3 100% |=========================| 16 MB 00:02
(2/2): glibc-2.5-34.i686. 100% |=========================| 5.2 MB 00:00
warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID e8562897
Importing GPG key 0xE8562897 "CentOS-5 Key (CentOS 5 Official Signing Key)" from
http://centos.repository.destroyers/centos/RPM-GPG-KEY-CentOS-5
Is this ok [y/N]: y
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Updating : glibc-common ######################### [1/4]
Updating : glibc ######################### [2/4]
INIT: version 2.86 reloading
Cleanup : glibc ######################### [3/4]
Cleanup : glibc-common ######################### [4/4]
Updated: glibc.i686 0:2.5-34 glibc-common.i386 0:2.5-34
Complete!
[root@dc4 ~]#
[root@dc4 ~]# yum -y updateこの後、いくつかの警告が表示されるが、更新作業自体は完了する。
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
* base: centos.repository.destroyers
* updates: centos.repository.destroyers
* addons: centos.repository.destroyers
* extras: centos.repository.destroyers
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package stunnel.i386 0:4.15-2.el5.1 set to be updated
---> Package mesa-libGL.i386 0:6.5.1-7.7.el5 set to be updated
<<略>>
---> Package avahi-compat-libdns_sd.i386 0:0.6.16-1.el5_2.1 set to be updated
---> Package libselinux-utils.i386 0:1.33.4-5.1.el5 set to be updated
---> Package dbus-libs.i386 0:1.1.2-12.el5 set to be updated
filelists.xml.gz 100% |=========================| 2.8 MB 00:00
filelists.xml.gz 100% |=========================| 477 kB 00:00
filelists.xml.gz 100% |=========================| 133 kB 00:00
filelists.xml.gz 100% |=========================| 150 B 00:00
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
kmod-gfs-xen i686 0.1.31-3.el5 base 146 k
kmod-gnbd-xen i686 0.1.5-2.el5.centos base 16 k
Updating:
ORBit2 i386 2.14.3-5.el5 base 252 k
OpenIPMI i386 2.0.6-11.el5 base 136 k
<<略>>
pexpect noarch 2.3-1.el5 base 219 k
xorg-x11-fonts-Type1 noarch 7.1-2.1.el5 base 1.5 M
Transaction Summary
=============================================================================
Install 9 Package(s)
Update 186 Package(s)
Remove 0 Package(s)
Total download size: 231 M
Downloading Packages:
(1/195): system-config-cl 100% |=========================| 287 kB 00:00
(2/195): mkinitrd-5.1.19. 100% |=========================| 449 kB 00:00
<<略>>
Cleanup : mkinitrd ##################### [380/381]再起動する。
Cleanup : system-config-cluster ##################### [381/381]
Installed: kmod-gfs-xen.i686 0:0.1.31-3.el5 kmod-gnbd-xen.i686 <<略>> yum.noarch 0:3.2.19-18.el5.centos yum-fastestmirror.noarch 0:1.1.16-13.el5.centos zip.i386 0:2.31-2.el5
Complete!
[root@dc4 ~]#
[root@dc4 ~]# shutdown -r now
Broadcast message from root (xvc0) (Wed Apr 8 22:40:45 2009):
The system is going down for system halt NOW!
INIT: Switching to runlevel: 0
INIT: Sending processes the TERM signal
<<略>>
Starting HAL daemon: [ OK ]
Starting oddjobd: [ OK ]
Starting Cluster Module - cluster monitor: Setting verbosity level to LogBasic
[ OK ]
Starting ricci: [ OK ]
CentOS release 5.3 (Final)
Kernel 2.6.18-128.1.6.el5xen on an i686
dc4.destroyers login:
2009/04/05
シェルスクリプト内でXMLから情報を取り出す
XML形式により情報をやり取りすることが多くなった昨今、シェルスクリプト(shell script)でXMLを扱うことも増えてきた。例えば、libvirtを使って
まず、XML形式をファイルに保存する。
ここで「
ディスクに関する設定は、XPath形式で表せば、「
これと同様の操作をネットワークインターフェースに対して実行してみる。
これらのうち、二番目のものだけを出力するには、
virsh dumpxml DomU名として得た仮想マシンの設定情報などだ。Xen DomU dc1の設定ファイル
/etc/xen/dc1
が、name = "dc1"だったとしよう。このdc1の設定をXML形式で得ると、
uuid = "4df3f764-00cb-42a6-8ff6-a98985cbda14"
maxmem = 256
memory = 64
vcpus = 1
bootloader = "/usr/bin/pygrub"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
vfb = [ ]
disk = [ "phy:/dev/VolGroupXX/LogVolDc1,xvda,w" ]
vif = [ "mac=00:16:3e:ff:ab:01,bridge=br1000",
"mac=00:16:3e:ff:ab:02,bridge=br2000" ]
# virsh dumpxml dc1のようになる。このとき、ディスクに関する情報を取り出したいとしよう。
<domain type='xen' id='18'>
<name>dc1</name>
<uuid>094a82d5-7e6c-980d-49d3-9e8e68fb84e2</uuid>
<bootloader>/usr/bin/pygrub</bootloader>
<os>
<type>linux</type>
<kernel>/var/lib/xen/boot_kernel.rMNCqh</kernel>
<initrd>/var/lib/xen/boot_ramdisk.og2mn7</initrd>
<cmdline>ro root=/dev/VolGroup00/LogVol00 console=xvc0 acpi=off nopcmcia noapm nousb nofirewire nosound</cmdline>
</os>
<memory>262144</memory>
<currentMemory>65536</currentMemory>
<vcpu>1</vcpu>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<interface type='bridge'>
<source bridge='br4000'/>
<target dev='vif18.0'/>
<mac address='00:16:3e:1d:89:01'/>
<script path='vif-bridge'/>
</interface>
<interface type='bridge'>
<source bridge='br2002'/>
<target dev='vif18.1'/>
<mac address='00:16:3e:1d:92:01'/>
<script path='vif-bridge'/>
</interface>
<disk type='block' device='disk'>
<driver name='phy'/>
<source dev='/dev/VolGroupXX/LogVolDc1'/>
<target dev='xvda'/>
</disk>
<console tty='/dev/pts/1'/>
</devices>
</domain>
#
まず、XML形式をファイルに保存する。
# virsh dumpxml dc1 > dc1.xmlこのファイルを引数として、
#
xmllint
コマンドを対話モードで起動する。# xmllint --shell dc1.xmlプロンプトの「/」は、現在のXML文書上のパスを示している。
/ >
ここで「
cat
」と入力すると、現在のパス以下の内容すべてが表示される。つまり、XMLファイルの内容すべてが表示されることになる。/ > catただし、
<?xml version="1.0"?>
<domain type="xen" id="18">
<name>dc1</name>
<uuid>094a82d5-7e6c-980d-49d3-9e8e68fb84e2</uuid>
<bootloader>/usr/bin/pygrub</bootloader>
<os>
<type>linux</type>
<kernel>/var/lib/xen/boot_kernel.rMNCqh</kernel>
<initrd>/var/lib/xen/boot_ramdisk.og2mn7</initrd>
<cmdline>ro root=/dev/VolGroup00/LogVol00 console=xvc0 acpi=off nopcmcia noapm nousb nofirewire nosound</cmdline>
</os>
<memory>262144</memory>
<currentMemory>65536</currentMemory>
<vcpu>1</vcpu>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<interface type="bridge">
<source bridge="br4000"/>
<target dev="vif18.0"/>
<mac address="00:16:3e:1d:89:01"/>
<script path="vif-bridge"/>
</interface>
<interface type="bridge">
<source bridge="br2002"/>
<target dev="vif18.1"/>
<mac address="00:16:3e:1d:92:01"/>
<script path="vif-bridge"/>
</interface>
<disk type="block" device="disk">
<driver name="phy"/>
<source dev="/dev/VolGroupXX/LogVolDc1"/>
<target dev="xvda"/>
</disk>
<console tty="/dev/pts/1"/>
</devices>
</domain>
/ >
xmllint
の出力は正規化されているため、先頭行が追加されている。ディスクに関する設定は、XPath形式で表せば、「
/domain/devices/disk
」にあることが解る。これをcat
で出力してみる。/ > cat /domain/devices/diskさらに、ソースデバイス名のみを抽出してみよう。
-------
<disk type="block" device="disk">
<driver name="phy"/>
<source dev="/dev/VolGroupXX/LogVolDc1"/>
<target dev="xvda"/>
</disk>
/ >
/ > cat /domain/devices/disk/source/@devこれを非対話的に実行するには、
-------
dev="/dev/VolGroupXX/LogVolDc1"
/ >
# echo "cat /domain/devices/disk/source/@dev" | xmllint --shell dc1.xmlとすればよい。
/ > -------
dev="/dev/VolGroupXX/LogVolDc1"
/ > #
これと同様の操作をネットワークインターフェースに対して実行してみる。
# echo "cat /domain/devices/interface/source/@bridge" | xmllint --shell dc1.xmlXPath /domain/devices/interfaceにマッチする要素は二つあるので、出力も二つだ。
/ > -------
bridge="br4000"
-------
bridge="br2002"
/ > #
これらのうち、二番目のものだけを出力するには、
# echo "cat /domain/devices/interface[2]/source/@bridge" | xmllint --shell dc1.xmlとする。
/ > -------
bridge="br2002"
/ > #
2009/04/03
A backup script for Xen DomUs, part 2
『A backup script for Xen DomUs, part 1』で紹介したスクリプト
このスクリプトの大まかな流れは以下の通り:
バックアップを実行するかどうかの検査
DomUの状態を表示するコマンド
DomU設定の解析
コマンド
このとき、関数
ディスクイメージのマウント@ローカル
各ディスクイメージをローカルにマウントする。
マウントする前に、ディスクイメージのスナップショットを撮っている(『XenとLVM・その3・スナップショットLVの利用』参照)。
実際の解析は、
analyze_disk関数
マウント時の動作は、リモート側でも実行する必要があるため、
与えられたデバイス
最終的に、
ディスクイメージのマウント@リモートDom0
リモートDom0に対して、SSH経由でマウントを実行する。
Rsyncによるバックアップ
『A backup script for Xen DomUs, part 1』
『A backup script for Xen DomUs, part 2』
xen-backup.sh
について解説する。このスクリプトの大まかな流れは以下の通り:
- バックアップ設定ファイルの読み込み: 182行目
- バックアップを実行するかどうかの検査: 183行目~215行目
- DomU設定の解析: 217行目~228行目
- ディスクイメージのマウント@ローカル: 230行目~254行目
- ディスクイメージのマウント@リモートDom0: 256行目~263行目
- Rsyncによるバックアップ: 265行目~266行目
- ディスクイメージのアンマウント@リモートDom0: 268行目~274行目
- ディスクイメージのアンマウント@ローカル: 277行目~280行目
バックアップを実行するかどうかの検査
DomUの状態を表示するコマンド
virsh domstate DomU名を使って、以下の各項目を検査する。
- 対象DomUが、ローカルDom0でホストされいるか?
- 対象DomUが、ローカルDom0で正常に実行されているか?
- 自分自身が
DOM0S
に含まれているか?
DomU設定の解析
コマンド
virsh dumpxml DomU名で対象となるDomUの設定(XML形式)を得て、ディスクイメージ情報を抽出する。
このとき、関数
get_value_from_config
を呼び出す。115: get_value_from_config() 116: { 117: local xml=$1 num=$2 elem=$3 attr=$4 118: echo "cat /domain/devices/disk[$num]/$elem/@$attr" | \ 119: xmllint --shell $xml | \ 120: awk -F\" '/^ +'$attr'/{print $2}' 121: }この中では
xmllint
コマンドを使用している。ディスクイメージに対する設定項目/domain/devices/disk
は、複数指定される可能性があることに注意。ディスクイメージのマウント@ローカル
各ディスクイメージをローカルにマウントする。
マウントする前に、ディスクイメージのスナップショットを撮っている(『XenとLVM・その3・スナップショットLVの利用』参照)。
238: lvcreate --snapshot --name=$snapshot_name --size=$SNAPSHOT_SIZE ${disk_source[$i]} 239: add_close_command "lvremove -f /dev/$vgname/$snapshot_name" 240: analyze_disk /dev/$vgname/$snapshot_nameマウント時と反対の動作をバックアップ後に実施する必要があるため、
add_close_command
関数(34行目~38行目)を使って記録する。実際の解析は、
analyze_disk
関数(124行目~175行目)を使っている。analyze_disk関数
マウント時の動作は、リモート側でも実行する必要があるため、
add_open_command
関数(14行目~19行目)で実行および記録する。与えられたデバイス
$the_disk
に対して、131: part_type=`parted -s $the_disk print | awk '/^Partition Table:/{print $3}'`でパーティションの種類を得ている。これがDOSパーティションなら、パーティション毎に分割し、それぞれに対して処理する必要がある。
134: add_open_command "kpartx -a -p $PSEP $the_disk" 135: add_close_command "kpartx -d -p $PSEP $the_disk"ここで、
kpartx
コマンドに対するオプション「-p 区切文字
」を指定していることに注意。例えば、/dev/VolGroup00/LogVolDomU
に対して、kpartx -a /dev/VolGroup00/LogVolDomU1を実行すると、パーティションごとに
/dev/mapper/LogVolDomU1 /dev/mapper/LogVolDomU1等のデバイスが作成されるが、元のデバイス名の最後が数字の場合、例えば
/dev/VolGroup00/LogVolDomU1
の場合は、/dev/mapper/LogVolDomU1p1 /dev/mapper/LogVolDomU1p1の様に区切文字「p」が挿入される。オプション「
-p 区切文字
」を指定すれば、どちらの場合も区切文字が挿入されるので都合が良い。なお、「kpartx -a -p 区切文字
」で作成したデバイスは、「-p
」を指定して「kpartx -d -p 区切文字
」としないと削除できない(この辺りの動作は、kpartx
のmanpageにも触れられていない)。136: while read device[$num] fs_type[$num] mount_point[$num]; do 137: ((num++)) 138: done <<EOF 139: $(parted -s $the_disk print | awk '/^ *[0-9]+ /{print $1" "$6" "$7}') 140: EOFこの部分は、一見
parted -s $the_disk print | awk '/^ *[0-9]+ /{print $1" "$6" "$7}' | while read device[$num] fs_type[$num] mount_point[$num]; do ((num++)) doneの様に書き直せそうだが、期待通りの動作とならない。なぜなら、
read
コマンドをパイプの後で使うと、read
コマンドがサブシェルで実行され、サブシェルの変数には代入されるが、元のシェルの変数には反映されないため。最終的に、
mount
コマンドでマウントされるデバイスにまで分割できたら、add_fs_table
関数(52行目~57行目)で記録しておく。ディレクトリ階層の高い順にマウントする必要があるため、すべてのマウントポイントを解析し終えてからマウントする(252行目~254行目)。ディスクイメージのマウント@リモートDom0
リモートDom0に対して、SSH経由でマウントを実行する。
258: ssh -T $remote_dom0 <<EOF 259: ##### COMMANDS FOR TARGET TO OPEN 260: `exec_open_commands | sed 's/-'$$'//'` 261: mkdir -p $target_prefix 262: `mount_fs_all $target_prefix | sed 's/-'$$'//'` 263: EOF入力がTTYでないことを明示するため、
ssh
コマンドには、「-T
」オプションを与えている。Rsyncによるバックアップ
266: rsync -avz --delete -e ssh $source_prefix/ $remote_dom0:$target_prefix引数「
$source_prefix/
」の最後のスラッシュは必須。省略すると、期待通りに動作しない。『A backup script for Xen DomUs, part 1』
『A backup script for Xen DomUs, part 2』
A backup script for Xen DomUs, part 1
XenのDomUを運用する際、複数のDom0(物理サーバ)を準備しておき、DomUのディスクイメージ(以下、単にイメージ)を共有しておけば、一台のDom0が故障しても、健全なDom0でサービスを継続することが可能だ。
Dom0間でDomUイメージを共有する方法には、iSCSIを使う方法や、DRBDを使う方法があるが、CentOSのiSCSIターゲット(ストレージ側)やDRBDには問題があり、今のところ安心して採用できない(iSCSIターゲットに専用機器を使えば問題無いが、金がかかる)。
そこで紹介するのが、今回のバックアップスクリプト
前提条件は以下の通り:
前提条件2.は、動作中のDomUに対してスナップショットを撮ってバックアップするための条件。スナップショットが必要ない場合は、ファイルや物理的なディスクパーティションに対して動作させられるよう改造するのはそう難しくないだろう。
前提条件3.は要するに、DomUの設定ファイルが(ディスクイメージに関して)完全に一致すれば良い、ということだ。これは単に私の手抜きの結果。LV名が異なる場合は、コピー元・コピー先それぞれのDom0上で設定ファイルを解析するよう改造が必要。
前提条件4.については、『パスワードを紛失したDomUをリカバリ』に書いた通りで、具体的には、DomoのVG名を、標準の「VolGroup00」から「VolGroupXX」に変更してインストールする(DomUのVG名を標準のままでよい)。『Red Hat Cluster: CentOS 5.1上でRHCSを使ってみる・その2・Dom0 fsXのインストール』を参照。
前提条件5.は、使用前に例えば、
なお、今回のスクリプトでは、対象DomUが実際に動作しているDom0上から、他のDom0へコピーを行う。これは、誤って古いイメージから新しいイメージへ書き戻すのを防ぐため。
スクリプトを実行する前に、各DomUに対する設定ファイル
コードは以下のbase64形式を、
2009/4/5(日)追記:
ログをSYSLOGで出力するように変更した。
2009/4/6(月)追記:
重複実行を排除した。
2009/4/7(火)追記:
エラーもログされるよう変更した。
Cronからでも正常に実行されるよう、PATHを設定するように変更した。
2012/11/30(金)追記:
ファイルをダウンロードできるようにした。
『A backup script for Xen DomUs, part 1』
『A backup script for Xen DomUs, part 2』
Dom0間でDomUイメージを共有する方法には、iSCSIを使う方法や、DRBDを使う方法があるが、CentOSのiSCSIターゲット(ストレージ側)やDRBDには問題があり、今のところ安心して採用できない(iSCSIターゲットに専用機器を使えば問題無いが、金がかかる)。
そこで紹介するのが、今回のバックアップスクリプト
xen-backup.sh
だ。このスクリプトは、rsync(1)を使うため、単純にディスクイメージをネットワークコピーするより圧倒的に早い。また、Xen固有のコマンドを一切使わず、virsh
コマンドを使っている。このため、libvirtがサポートしている他の仮想環境、kvmなどでも使用できるかもしれない(未確認)。前提条件は以下の通り:
- Dom0間で、rootによるSSHログインが可能であること。
- 論理ボリューム(logical volume, LV)上にイメージが保存されていること。
- 各DomUに対して、ディスクイメージLV名が一致すること。
- Dom0とDomUのボリュームグループ名(volume group, VG)が重複しないこと。
- 実行前に別途フルバックアップを実行すること。
- 無保証。
前提条件2.は、動作中のDomUに対してスナップショットを撮ってバックアップするための条件。スナップショットが必要ない場合は、ファイルや物理的なディスクパーティションに対して動作させられるよう改造するのはそう難しくないだろう。
前提条件3.は要するに、DomUの設定ファイルが(ディスクイメージに関して)完全に一致すれば良い、ということだ。これは単に私の手抜きの結果。LV名が異なる場合は、コピー元・コピー先それぞれのDom0上で設定ファイルを解析するよう改造が必要。
前提条件4.については、『パスワードを紛失したDomUをリカバリ』に書いた通りで、具体的には、DomoのVG名を、標準の「VolGroup00」から「VolGroupXX」に変更してインストールする(DomUのVG名を標準のままでよい)。『Red Hat Cluster: CentOS 5.1上でRHCSを使ってみる・その2・Dom0 fsXのインストール』を参照。
前提条件5.は、使用前に例えば、
[root@dom0a ~]# dd bs=16M if=/dev/VolGroupXX/LogVolDomU1 | ssh dom0b 'dd bs=16M of=/dev/VolGroupXX/LogVolDomU1'を実行する必要がある。今回のスクリプトでは、パーティション情報やLVM情報はコピーされないためだ。
なお、今回のスクリプトでは、対象DomUが実際に動作しているDom0上から、他のDom0へコピーを行う。これは、誤って古いイメージから新しいイメージへ書き戻すのを防ぐため。
スクリプトを実行する前に、各DomUに対する設定ファイル
/root/Works/Xen-Backup/xen-backup.d/*.conf
を準備する(通常は、DomU名.conf
)。設定項目は次の二つのみ:DOMU
- DomU名
DOM0S
- このDomUのイメージを保存するDom0。空白で区切って並べる。ネットワーク的に到達可能な名前でなければならない。
domu1
に対する設定ファイル/root/Works/Xen-Backup/xen-backup.d/domu1.conf
ならば、DOMU=domu1 DOM0S="dom0a dom0b"となる。この場合、
domu1
は、dom0a
dom0b
でホストされている。xen-backup.sh
をダウンロード。コードは以下のbase64形式を、
xen-backup.sh.b64
として保存しておき、以下のコマンドcat xen-backup.sh.b64 | base64 -di | gunzip > xen-backup.shで復元して使用する。
2009/4/5(日)追記:
ログをSYSLOGで出力するように変更した。
2009/4/6(月)追記:
重複実行を排除した。
2009/4/7(火)追記:
エラーもログされるよう変更した。
Cronからでも正常に実行されるよう、PATHを設定するように変更した。
2012/11/30(金)追記:
ファイルをダウンロードできるようにした。
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
『A backup script for Xen DomUs, part 1』
『A backup script for Xen DomUs, part 2』
2008/12/16
Libvirt & Xen その2 予備調査: xm
Libvirtの使い方の前に
このコマンドとXenハイパーバイザとの通信については、『White Paper: Basic components of Xen』で解説されている。
Xenの標準UIである
実際に試してみよう。
これは、
以上、Xenハイパーバイザは、主にデーモンxendの提供するインターフェースを通じて制御する。デーモンxendが提供するインターフェースは、三種類のアプリケーション層(HTTP、XML-RPCおよびXen Management API)、二種のトランスポート層(UNIXドメインソケットおよびTCP)の計六種類が提供されている。設定は、
TCPを利用したインターフェースは、ネットワーク経由で操作することが可能。しかし、HTTPやXML-RPCは、セキュリティは十分ではない。IPアドレス・ドメイン名ベースのアクセス制御があるのみで、認証や暗号化はサポートされていない。SSHのポートフォワーディングと併用するなど、別途セキュリティを確保する必要がある。
xm
コマンドについて調査する。このコマンドとXenハイパーバイザとの通信については、『White Paper: Basic components of Xen』で解説されている。

xm
コマンドは、デーモンxendとXML RPCによって通信を行い、Dom0を通じてXenハイパーバイザを制御する。ここで使われるXML RPCインターフェースは、UNIXソケットで、アクセスにはroot権限が必要だ。実際に試してみよう。
[root@fs1 ~]# /usr/sbin/xm list通常ユーザで
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 3673 2 r----- 28871.0
[root@fs1 ~]#
[user01@fs1 ~]$ /usr/sbin/xm list
ERROR Internal error: Could not obtain handle on privileged command interface (13 = Permission denied)
Error: Most commands need root access. Please try again as root.
[user01@fs1 ~]$
xm
コマンドが失敗するのは、xendと通信する際に使用するUNIXドメインソケット/var/run/xend/xmlrpc.sock
(CentOS/RHEL/Fedoraの場合)には、root権限でないと書き込めなからだ。[root@fs1 ~]# ls -l /var/run/xend/xmlrpc.sockまた、
srwxr-xr-x 1 root root 0 Dec 8 13:39 /var/run/xend/xmlrpc.sock
[root@fs1 ~]#
xm
コマンドは、このUNIXドメインソケットの他に、/proc/xend
以下のファイルも利用する。実は、最初のエラーメッセージ「ERROR Internal error: Could not...」は、/proc/xen/privcmd
を開こうとしたときのもので、次のエラーメッセージ「Error: Most commands...」は/var/run/xend/xmlrpc.sock
を開こうとしたときのもの。これは、
strace
コマンドを利用して、[user01@fs1 ~]$ strace /usr/sbin/xm list > strace-xm-log.txt 2>&1の様に実行することにより、確認できる。
[user01@fs1 ~]$
以上、Xenハイパーバイザは、主にデーモンxendの提供するインターフェースを通じて制御する。デーモンxendが提供するインターフェースは、三種類のアプリケーション層(HTTP、XML-RPCおよびXen Management API)、二種のトランスポート層(UNIXドメインソケットおよびTCP)の計六種類が提供されている。設定は、
/etc/xen/xend-config.sxp
で行う。上で使ったUNIXソケット/var/run/xend/xmlrpc.sock
もこのファイルの中で設定さていれる。TCPを利用したインターフェースは、ネットワーク経由で操作することが可能。しかし、HTTPやXML-RPCは、セキュリティは十分ではない。IPアドレス・ドメイン名ベースのアクセス制御があるのみで、認証や暗号化はサポートされていない。SSHのポートフォワーディングと併用するなど、別途セキュリティを確保する必要がある。
登録:
投稿 (Atom)