さくらのVPSで複数台の契約するときの注意点

記事自体の注意点

これは2012年10月末位の経験と周囲の情報をもとにした話なので,のちに状況など変化している可能性があります.

要約

この記事はさくらのVPSを複数台借りたときにちょっと困ったこと,具体的にはVPSのハイパーバイザーが同一筐体になってしまった.ということに関する諸処まとめです.

VPSのハイパーバイザーが同一筐体になると何が困るの?

そもそもの話です.
VPSはいわゆる仮想化技術を使っていてそれ自体はHW障害からは縁が遠いような気がしますね.
でもHDDならRAID 1で,NICならボンディングで実運用上はある程度耐障害性を確保できますが,たとえば「メイン基盤が壊れた」など冗長化が難しい部分が壊れた際にはもろ影響を受けます.

実際の報告ベースだと軽く検索すると色々出てきます.
色々と書いていますが台数を想像すると決して多いとは感じませんが…

さくらのVPS 2012年春

いまさくらのVPSは春にリリースされたバージョン3ということになっているようです.
これはリリース当初,F5的(連続的)契約をすると,間に他社が入らなければ同一筐体に順番にVPSが作成されるようになっていたようです.これを仮に「F5契約連番問題」としましょう.
結果,耐障害性をある程度確保するためにActive/Standby×nの構成を作り,耐障害性をあげていても,上記のような冗長化できないハードウェア障害などが発生すると全滅することがあります.

さくらのVPS 2012年夏

夏というか初夏ですが,つい@sakura_prに粘着しちゃったところ,このF5契約連番問題は解決したような回答をいただきました.PRアカウントなのに変なもの送ってすみません!!

さくらのVPS 2012年秋

さて先日F5契約連番問題の解決を伺ったのである機会でさくらのVPSをF5契約してみました.
そうしたらやっぱり出たんですね.連番.ただし多少はばらけていました.
そこで今度はちゃんとサポートに粘着しました.

サポートの回答としては簡単に書くと下記のとおりです.

  1. 以前のように連続した契約で連番的になるようなことはない
  2. ただ限られたリソース内で払い出しをするため,結果として同一筐体になる可能性はある
  3. 同一筐体かどうかはIPアドレスが連番かどうかで確認できる(それ以外では確認できない)

下記はサポートとのやり取りで引き出せた情報だったり,個人的な主観だったりが入り交ざっています.
うまく読み分けてください.

以前のように連続した契約で連番的になるようなことはない

これは確かにそうかもしれません.
実際に連番でもなく間に他のお客が入って飛んだというより全然違うセグメントに行ったかな?という感じもありました.

ただ限られたリソース内で払い出しをするため,結果として同一筐体になる可能性はある

ここの「限られたリソース」当たり前なのですが,実際問題でVPSの払い出しに使えるカード(即サービスイン可能なリソース数)はそんなに多くないんじゃないでしょうか?
どれ位のスピードで契約が進行していくのかわからないので正確なことは全く分かりませんが,複数VPS(適当に言って3割くらい?)が同一筐体に入ってしまいました(同一筐体のものが複数セットできた).
これはサポートに問い合わせてどれがどれか同一筐体かどうか何とか教えてもらえました.

同一筐体かどうかはIPアドレスが連番かどうかで確認できる(それ以外では確認できない)

これはダウトです.
IPアドレスが連番でも筐体がもつ最後のIPアドレスと次の筐体が持つのIPアドレスという可能性があります.
1個飛ばしだからといって同一筐体ではないという裏付けにもなりません.

つまり「利用者が見える譲歩うや通常触れるUIだけで同一筐体かどうか確認する手段はない」ということになります(邪推ができる程度).

どうしたらいいか?

正解はないと思いますが多少の努力ごっこはできると思います.

お試し期間を活用する

これはサポートからの提案です.
IPアドレスが怪しいと思ったらVPSインスタンスを作り直すことです.
ただし注意しなければいけないのはこれはクレジットカード決済でしか利用できません(カード決済以外は試用期間という状態がない)

なるべく契約と契約の間で時間を開ける

この手段はむしろ連番で払い出しをしてくれるなら結構確率が上がったのかなーという気がしますが,
「近いタイミングでの契約は同一筐体になる確率が高い」ということであれば時間をあければ他のお客がその筐体を利用開始してくれることが期待できます.
どれ位開ければいいかはわかりませんが,1日や数日開ければいいかもしれません(適当

また,お試し期間を併用するとよりGOODだと思います

リージョンを使い分ける

これも筐体が別れる可能性が高くなるだけですが,2Gプランならリージョンを選択できます.
これを活用すれば同一筐体ではなくなる可能性が高くなるかもしれません.

これってさくらのVPSだけの問題?

おそらくですが,低価格VPSの多くは同様な問題をはらんでいるんじゃないでしょうか?
おそらくさくらのVPSのストレージはローカルストレージでSANなどではないと思います.
ストレージがSANに載っていれば一旦落ちてもすぐに別の筐体で再起動してもらえる可能性はあるかもしれません(が,低価格VPSでSANとかあるんかなーどうなんだろうなー).

まとめ

ないです(照
もう疲れてきました(照

前回の記事から約1年,すっかり自分のはてダ忘れていました(照
また思い出したら次の記事を書くかもしれません.

それでは.あでゅー

追記:

大事なことを書き忘れていました.
この件に関してさくらのサポートにはとても親切にいろいろサポートしていただきました.
たまたま特にいい人にあたったのかもしれませんが,今のところサポートでハズレを引いたことが無くてそこは助かっています.
他社で同様の問題があっても(多くの提供企業であると思っています)同レベルにサポートしていただけているかはわかりません.

主観ですが,決して価格バランス上「高い!!」というものでもなく,提供サービスに不満点があるのは当たり前のことで今後に期待させていただきます!!

inodeが枯渇するとどうなるか

何年も前にinode枯渇問題に直面したことが何度かあったので,結果は知っているのですが,ちょっと詰まってしまった別件があり,現実逃避目的でとりあえず息抜きで試してみました.

どうみてもトーシロの検証でサーセン

[root@centos6 ~]# dd if=/dev/zero of=$PWD/dummy.dd bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 3.81335 s, 27.5 MB/s
[root@centos6 ~]# mkfs.ext3 $PWD/dummy.dd -N 100
mke2fs 1.41.12 (17-May-2010)
/root/dummy.dd is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
104 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
8 inodes per group
Superblock backups stored on blocks: 
        8193, 24577, 40961, 57345, 73729

Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@centos6 ~]# mkdir /mnt/dummy/
[root@centos6 ~]# mount -t ext3 -o loop $PWD/dummy.dd /mnt/dummy/
[root@centos6 dummy]# mount
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/mapper/VolGroup02-lv_home on /home type ext4 (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/loop0 on /mnt/dummy type ext3 (rw)
[root@centos6 ~]# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup-lv_root
                      5.5G  2.9G  2.4G  55% /
tmpfs                 372M     0  372M   0% /dev/shm
/dev/mapper/VolGroup02-lv_home
                       40G   20G   18G  53% /home
/dev/sda1             485M   49M  411M  11% /boot
/dev/loop0            100M  5.6M   90M   6% /mnt/dummy
[root@centos6 dummy]# df -i
Filesystem            Inodes   IUsed   IFree IUse% マウント位置
/dev/mapper/VolGroup-lv_root
                      363600   81530  282070   23% /
tmpfs                  95147       1   95146    1% /dev/shm
/dev/mapper/VolGroup02-lv_home
                     2621440  526347 2095093   21% /home
/dev/sda1             128016      44  127972    1% /boot
/dev/loop0               104      11      93   11% /mnt/dummy
[root@centos6 ~]# cd /mnt/dummy/
[root@centos6 dummy]# for I in `seq 1 100`; do touch ${I}; done
touch: cannot touch `94': デバイスに空き領域がありません
touch: cannot touch `95': デバイスに空き領域がありません
touch: cannot touch `96': デバイスに空き領域がありません
touch: cannot touch `97': デバイスに空き領域がありません
touch: cannot touch `98': デバイスに空き領域がありません
touch: cannot touch `99': デバイスに空き領域がありません
touch: cannot touch `100': デバイスに空き領域がありません
[root@centos6 dummy]# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup-lv_root
                      5.5G  2.9G  2.4G  55% /
tmpfs                 372M     0  372M   0% /dev/shm
/dev/mapper/VolGroup02-lv_home
                       40G   20G   18G  53% /home
/dev/sda1             485M   49M  411M  11% /boot
/dev/loop0            100M  5.6M   90M   6% /mnt/dummy
[root@centos6 dummy]# df -i
Filesystem            Inodes   IUsed   IFree IUse% マウント位置
/dev/mapper/VolGroup-lv_root
                      363600   81530  282070   23% /
tmpfs                  95147       1   95146    1% /dev/shm
/dev/mapper/VolGroup02-lv_home
                     2621440  526347 2095093   21% /home
/dev/sda1             128016      44  127972    1% /boot
/dev/loop0               104     104       0  100% /mnt/dummy

なぜinodeを100個で指定して104個できるのか,なんで最初から11ほど消費しているのかは知りません.
いずれ必要になれば調べてみようと思います.

パッケージ名がわからなくてもyumでインストールできる場合の紹介その2

はてぶろを招待してもらえずすねている id:elf です.別に気にしていないんだからね!!
ってなんか懐かしいノリなんだけどどうでもいいです.

約1ヶ月前に「パッケージ名がわからなくてもyumでインストールできる場合の紹介」というのを書きました.
今回はもうちょいシンプルなやり方です.

一般的にRPMパッケージはインストールに必要な依存関係の情報をファイル内に持ってることはよく知られています.
ではSRPMは? っということで調べてみましょう.

[elf@centos6 SRPMS]$ rpmbuild --rebuild transifex-1.1.0-4.fc17.src.rpm
transifex-1.1.0-4.fc17.src.rpm をインストール中です。
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
エラー: ビルド依存性の失敗:
        python-markdown は transifex-1.1.0-4.el6.noarch に必要とされています
        django-contact-form は transifex-1.1.0-4.el6.noarch に必要とされています
        django-pagination は transifex-1.1.0-4.el6.noarch に必要とされています
        django-tagging は transifex-1.1.0-4.el6.noarch に必要とされています
        django-notification は transifex-1.1.0-4.el6.noarch に必要とされています
        django-profile は transifex-1.1.0-4.el6.noarch に必要とされています
        Django-south は transifex-1.1.0-4.el6.noarch に必要とされています
        django-piston は transifex-1.1.0-4.el6.noarch に必要とされています
        django-authority は transifex-1.1.0-4.el6.noarch に必要とされています
        mercurial >= 1.3 は transifex-1.1.0-4.el6.noarch に必要とされています

大量に依存関係で引っかかってしまいました.
それでは--requiresで依存関係の情報を調べてみましょう.

[elf@centos6 SRPMS]$ rpm -qp --requires transifex-1.1.0-4.fc17.src.rpm
python-sphinx  
gettext  
python-markdown  
Django  
django-contact-form  
django-pagination  
django-tagging  
django-notification  
django-profile  
Django-south  
django-piston  
django-authority  
mercurial >= 1.3
python-sqlite2  
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1

おっと.ちゃんと出るじゃないですか.
つまり,「$ sudo yum install `rpm -qp --requires transifex-1.1.0-4.fc17.src.rpm`」とやれば必要なパッケージは全部入ってしまいそうです.これは楽チン!!
さて試してみましょう!!

[elf@centos6 SRPMS]$ sudo yum install `rpm -qp --requires transifex-1.1.0-4.fc17.src.rpm`
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * epel: ftp.jaist.ac.jp
 * extras: data.nicehosting.co.kr
 * updates: data.nicehosting.co.kr
Setting up Install Process
Package matching python-sphinx-0.6.6-2.el6.noarch already installed. Checking for update.
Package gettext-0.17-16.el6.x86_64 already installed and latest version
Package matching Django-1.2.7-1.el6.noarch already installed. Checking for update.
No package django-contact-form available.
No package django-pagination available.
No package django-notification available.
No package django-profile available.
No package django-piston available.
No package django-authority available.
No package >= available.
No package 1.3 available.
No package rpmlib(FileDigests) available.
No package <= available.
No package 4.6.0-1 available.
No package rpmlib(CompressedFileNames) available.
No package <= available.
No package 3.0.4-1 available.
Resolving Dependencies
--> Running transaction check
---> Package Django-south.noarch 0:0.7.2-1.el6 set to be updated
---> Package django-tagging.noarch 0:0.3.1-3.el6 set to be updated
---> Package mercurial.x86_64 0:1.4-3.el6 set to be updated
---> Package python-markdown.noarch 0:2.0.1-3.1.el6 set to be updated
---> Package python-sqlite2.x86_64 1:2.3.5-2.el6 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=========================================================================================================================================================================
 Package                                       Arch                                 Version                                     Repository                          Size
=========================================================================================================================================================================
Installing:
 Django-south                                  noarch                               0.7.2-1.el6                                 epel                               227 k
 django-tagging                                noarch                               0.3.1-3.el6                                 epel                                58 k
 mercurial                                     x86_64                               1.4-3.el6                                   base                               1.5 M
 python-markdown                               noarch                               2.0.1-3.1.el6                               base                               118 k
 python-sqlite2                                x86_64                               1:2.3.5-2.el6                               epel                                80 k

Transaction Summary
=========================================================================================================================================================================
Install       5 Package(s)
Upgrade       0 Package(s)

Total download size: 1.9 M
Installed size: 8.7 M
Is this ok [y/N]: y
Downloading Packages:
(1/5): Django-south-0.7.2-1.el6.noarch.rpm                                                                                                        | 227 kB     00:00     
(2/5): django-tagging-0.3.1-3.el6.noarch.rpm                                                                                                      |  58 kB     00:00     
(3/5): mercurial-1.4-3.el6.x86_64.rpm                                                                                                             | 1.5 MB     00:00     
(4/5): python-markdown-2.0.1-3.1.el6.noarch.rpm                                                                                                   | 118 kB     00:00     
(5/5): python-sqlite2-2.3.5-2.el6.x86_64.rpm                                                                                                      |  80 kB     00:00     
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                    1.0 MB/s | 1.9 MB     00:01     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
  Installing     : mercurial-1.4-3.el6.x86_64                                                                                                                        1/5 
  Installing     : 1:python-sqlite2-2.3.5-2.el6.x86_64                                                                                                               2/5 
  Installing     : django-tagging-0.3.1-3.el6.noarch                                                                                                                 3/5 
  Installing     : python-markdown-2.0.1-3.1.el6.noarch                                                                                                              4/5 
  Installing     : Django-south-0.7.2-1.el6.noarch                                                                                                                   5/5 

Installed:
  Django-south.noarch 0:0.7.2-1.el6          django-tagging.noarch 0:0.3.1-3.el6        mercurial.x86_64 0:1.4-3.el6        python-markdown.noarch 0:2.0.1-3.1.el6       
  python-sqlite2.x86_64 1:2.3.5-2.el6       

Complete!

いくつか抜けがでましたがインストールできました!!
抜けたのはFedora 17開発用のSRPMCentOS 6.0でビルドしようとしたからですね.
これを中途半端といいます.同じネタ2回目なのに同じオチですか.ホントごめんなさい.

しかも
> No package >= available.
> No package 1.3 available.

とか出てます.まぁ実質害はないので気にしないでおきましょう.

とりあえず,ちゃんとビルドできる環境であれば上記のような手順でビルドに必要な環境がそろうと思います.ぜひお試しあれ.

それではあでゅー.

パッケージ名がわからなくてもyumでインストールできる場合の紹介

CentOS 5の環境でとある作業をしているときによくある風景に遭遇しました.
いわゆる「依存関係が解決していないからビルドできんぞヴォケ!!」ですね.

$ rpmbuild -ba SPECS/publican.spec 
エラー: ビルド依存性の失敗:
        perl(Devel::Cover) は publican-2.8-1.noarch に必要とされています
        perl(Module::Build) は publican-2.8-1.noarch に必要とされています
        perl(Test::Exception) は publican-2.8-1.noarch に必要とされています
        perl(Test::Pod) は publican-2.8-1.noarch に必要とされています
        perl(Test::Pod::Coverage) は publican-2.8-1.noarch に必要とされています
        perl(Test::Perl::Critic) は publican-2.8-1.noarch に必要とされています
(snip)
        perl(DBD::SQLite) は publican-2.8-1.noarch に必要とされています
        liberation-mono-fonts は publican-2.8-1.noarch に必要とされています
        liberation-sans-fonts は publican-2.8-1.noarch に必要とされています
        liberation-serif-fonts は publican-2.8-1.noarch に必要とされています
        cjkuni-uming-fonts は publican-2.8-1.noarch に必要とされています
        ipa-gothic-fonts は publican-2.8-1.noarch に必要とされています
        ipa-pgothic-fonts は publican-2.8-1.noarch に必要とされています
        lklug-fonts は publican-2.8-1.noarch に必要とされています
        baekmuk-ttf-batang-fonts は publican-2.8-1.noarch に必要とされています

こまった!! 当然作業を続けるなら必要なパッケージを入れましょう.ってことなんですが,「perl(???:???)」的なものはパッケージ名を調べるのが億劫です.そこでふと駄目もとでなんとなく下記のようにそのままyumに渡してみました.

$ sudo yum install 'perl(DBD::SQLite)'
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * epel: ftp.kddilabs.jp
 * extras: ftp.nara.wide.ad.jp
 * updates: ftp.nara.wide.ad.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package perl-DBD-SQLite.x86_64 0:1.14-3.el5 set to be updated
--> Processing Dependency: perl(DBI) for package: perl-DBD-SQLite
--> Running transaction check
---> Package perl-DBI.x86_64 0:1.52-2.el5 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================================
 Package                     Arch               Version                  Repository        Size
================================================================================================
Installing:
 perl-DBD-SQLite             x86_64             1.14-3.el5               epel             277 k
Installing for dependencies:
 perl-DBI                    x86_64             1.52-2.el5               base             600 k

Transaction Summary
================================================================================================
Install       2 Package(s)
Upgrade       0 Package(s)

Total download size: 876 k
Is this ok [y/N]: 

おいおいおいおい!! イケるじゃんお兄さん!!
上記見ていると,perl(???:???)は依存関係の解決でパッケージ名が導き出されています.

ってことでもしかしてこんな手抜きできちゃう!?

LANG=C rpmbuild -ba SPECS/publican.spec 2>&1 | awk '$0 ~ /is needed by/ { print $1}'
perl(Devel::Cover)
perl(Module::Build)
perl(Test::Exception)
perl(Test::Pod)
perl(Test::Pod::Coverage)
perl(Test::Perl::Critic)
perl(Archive::Zip)
perl(Config::Simple)
perl(DateTime)
perl(DateTime::Format::DateParse)
perl(File::Copy::Recursive)
perl(File::Find::Rule)
perl(File::pushd)
(snip)
perl(DBD::SQLite)
liberation-mono-fonts
liberation-sans-fonts
liberation-serif-fonts
cjkuni-uming-fonts
ipa-gothic-fonts
ipa-pgothic-fonts
lklug-fonts
baekmuk-ttf-batang-fonts

ってことでできちゃいました…!!!!!!

$ sudo yum install `LANG=C rpmbuild -ba SPECS/publican.spec 2>&1 | awk '$0 
~ /is needed by/ { print $1}'`
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * epel: ftp.kddilabs.jp
 * extras: ftp.nara.wide.ad.jp
 * updates: ftp.nara.wide.ad.jp
Setting up Install Process
Setting up Install Process
No package perl(Makefile::Parser) available.
Package perl-XML-TreeBuilder-3.09-9.el5.noarch already installed and latest version
No package fop available.
No package batik available.
Package docbook-style-xsl-1.69.1-5.1.noarch already installed and latest version
No package liberation-mono-fonts available.
No package liberation-sans-fonts available.
No package liberation-serif-fonts available.
No package cjkuni-uming-fonts available.
No package lklug-fonts available.
No package baekmuk-ttf-batang-fonts available.
Resolving Dependencies
--> Running transaction check
---> Package ImageMagick-perl.x86_64 0:6.2.8.0-4.el5_5.3 set to be updated
--> Processing Dependency: ImageMagick = 6.2.8.0-4.el5_5.3 for package: ImageMagick-perl
--> Processing Dependency: libMagick.so.10()(64bit) for package: ImageMagick-perl
---> Package ipa-gothic-fonts.noarch 0:003.02-3.1.el5 set to be updated
---> Package ipa-pgothic-fonts.noarch 0:003.02-3.1.el5 set to be updated
---> Package perl-Archive-Zip.noarch 0:1.16-1.2.1 set to be updated
---> Package perl-Config-Simple.noarch 0:4.59-7.el5 set to be updated
---> Package perl-DBD-SQLite.x86_64 0:1.14-3.el5 set to be updated
--> Processing Dependency: perl(DBI) for package: perl-DBD-SQLite
---> Package perl-DateTime.x86_64 1:0.41-1.el5 set to be updated
--> Processing Dependency: perl(Class::Singleton) >= 1.03 for package: perl-DateTime
--> Processing Dependency: perl(Params::Validate) >= 0.76 for package: perl-DateTime
--> Processing Dependency: perl(Params::Validate) for package: perl-DateTime
--> Processing Dependency: perl(Class::Singleton) for package: perl-DateTime
---> Package perl-DateTime-Format-DateParse.noarch 0:0.04-6.el5 set to be updated
(snip)
--> Finished Dependency Resolution

Dependencies Resolved
================================================================================================
 Package                                Arch        Version                  Repository    Size
================================================================================================
Installing:
 ImageMagick-perl                       x86_64      6.2.8.0-4.el5_5.3        base         147 k
 ipa-gothic-fonts                       noarch      003.02-3.1.el5           base         4.1 M
 ipa-pgothic-fonts                      noarch      003.02-3.1.el5           base         4.1 M
(snip)
 perl-Algorithm-Diff                    noarch      1.1902-2.el5             epel          45 k
 perl-AppConfig                         noarch      1.64-1.el5               epel          96 k
 perl-B-Keywords                        noarch      1.06-1.el5               epel         9.6 k
 perl-Class-Singleton                   noarch      1.03-3.el5               epel          17 k
 perl-Clone                             x86_64      0.27-1.el5               epel          14 k
 perl-Config-Tiny                       noarch      2.10-1.el5               epel          21 k
 perl-DBI                               x86_64      1.52-2.el5               base         600 k
 perl-Devel-Symdump                     noarch      1:2.07-3.el5.1           epel          16 k
 perl-ExtUtils-CBuilder                 noarch      0.18-1.el5               epel          28 k
 perl-ExtUtils-ParseXS                  noarch      2.18-1.el5               epel          31 k
 perl-File-HomeDir                      noarch      0.62-1.el5               epel          40 k
 perl-Font-AFM                          noarch      1.19-4.el5               epel          18 k
 perl-IO-String                         noarch      1.08-1.1.1               base          13 k
 perl-List-MoreUtils                    x86_64      0.22-2.el5               epel          59 k
 perl-Module-Pluggable                  noarch      3.60-3.el5               epel          23 k
 perl-Number-Compare                    noarch      0.01-8.el5               epel         7.6 k
 perl-PPI                               noarch      1.118-1.el5              epel         371 k
 perl-Params-Util                       noarch      0.25-1.el5               epel          24 k
 perl-Params-Validate                   x86_64      0.88-3.el5               epel          71 k
 perl-Perl-Critic                       noarch      1.05-1.el5               epel         514 k
 perl-Pod-Coverage                      noarch      0.18-2.el5               epel          25 k
 perl-Pod-Escapes                       noarch      1.04-5.el5               epel          15 k
 perl-Pod-POM                           noarch      0.17-6.el5               epel          57 k
 perl-Pod-Simple                        noarch      3.04-3.el5               epel         184 k
 perl-String-Format                     noarch      1.14-1.el5               epel          10 k
 perl-Sub-Uplevel                       noarch      0.18-2.el5               epel          13 k
 perl-TeX-Hyphen                        noarch      0.140-5.el5              epel          33 k
 perl-Test-Differences                  noarch      0.47-2.el5               epel          16 k
(snip)
Transaction Summary
================================================================================================
Install      76 Package(s)
Upgrade       0 Package(s)

Total download size: 34 M
Is this ok [y/N]: y
Downloading Packages:
(1/76): perl-Number-Compare-0.01-8.el5.noarch.rpm                        | 7.6 kB     00:00     
(2/76): perl-Text-Glob-0.08-2.el5.noarch.rpm                             | 8.9 kB     00:00     
(3/76): perl-B-Keywords-1.06-1.el5.noarch.rpm                            | 9.6 kB     00:00     
(73/76): ipa-gothic-fonts-003.02-3.1.el5.noarch.rpm                      | 4.1 MB     00:00     
(74/76): ipa-pgothic-fonts-003.02-3.1.el5.noarch.rpm                     | 4.1 MB     00:00     
(75/76): urw-fonts-2.3-6.1.1.noarch.rpm                                  | 4.5 MB     00:00     
(76/76): ghostscript-8.70-6.el5_7.3.x86_64.rpm                           | 8.9 MB     00:01     
------------------------------------------------------------------------------------------------
Total                                                           4.9 MB/s |  34 MB     00:06     
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : perl-List-MoreUtils                                                     1/76 
  Installing     : perl-Clone                                                              2/76 
  Installing     : perl-Params-Validate                                                    3/76 
(snip)
Dependency Installed:
  ImageMagick.x86_64 0:6.2.8.0-4.el5_5.3        gd.x86_64 0:2.0.33-9.4.el5_4.2                  
  ghostscript.x86_64 0:8.70-6.el5_7.3           ghostscript-fonts.noarch 0:5.50-13.1.1          
  libcroco.x86_64 0:0.6.1-2.1                   libgsf.x86_64 0:1.14.1-6.1                      
  librsvg2.x86_64 0:2.16.1-1.el5                libwmf.x86_64 0:0.2.8.4-10.2                    
  perl-Algorithm-Diff.noarch 0:1.1902-2.el5     perl-AppConfig.noarch 0:1.64-1.el5              
  perl-B-Keywords.noarch 0:1.06-1.el5           perl-Class-Singleton.noarch 0:1.03-3.el5        
  perl-Clone.x86_64 0:0.27-1.el5                perl-Config-Tiny.noarch 0:2.10-1.el5            
  perl-DBI.x86_64 0:1.52-2.el5                  perl-Devel-Symdump.noarch 1:2.07-3.el5.1        
  perl-ExtUtils-CBuilder.noarch 0:0.18-1.el5    perl-ExtUtils-ParseXS.noarch 0:2.18-1.el5       
  perl-File-HomeDir.noarch 0:0.62-1.el5         perl-Font-AFM.noarch 0:1.19-4.el5               
  perl-IO-String.noarch 0:1.08-1.1.1            perl-List-MoreUtils.x86_64 0:0.22-2.el5         
  perl-Module-Pluggable.noarch 0:3.60-3.el5     perl-Number-Compare.noarch 0:0.01-8.el5         
  perl-PPI.noarch 0:1.118-1.el5                 perl-Params-Util.noarch 0:0.25-1.el5            
  perl-Params-Validate.x86_64 0:0.88-3.el5      perl-Perl-Critic.noarch 0:1.05-1.el5            
  perl-Pod-Coverage.noarch 0:0.18-2.el5         perl-Pod-Escapes.noarch 0:1.04-5.el5            
  perl-Pod-POM.noarch 0:0.17-6.el5              perl-Pod-Simple.noarch 0:3.04-3.el5             
  perl-String-Format.noarch 0:1.14-1.el5        perl-Sub-Uplevel.noarch 0:0.18-2.el5            
  perl-TeX-Hyphen.noarch 0:0.140-5.el5          perl-Test-Differences.noarch 0:0.47-2.el5       
  perl-Text-Autoformat.noarch 0:1.13-5.el5      perl-Text-Diff.noarch 0:0.35-3.el5              
  perl-Text-Glob.noarch 0:0.08-2.el5            perl-Text-Reform.noarch 0:1.11-6.el5            
  perl-TimeDate.noarch 1:1.16-5.el5             perl-XML-Dumper.noarch 0:0.81-2.fc6             
  perl-XML-LibXML-Common.x86_64 0:0.13-8.2.2    perl-XML-NamespaceSupport.noarch 0:1.09-1.2.1   
  perl-XML-SAX.noarch 0:0.14-8                  perl-XML-TokeParser.noarch 0:0.05-2.1.el5       
  perltidy.noarch 0:20070801-1.el5              urw-fonts.noarch 0:2.3-6.1.1                    

Complete!

ダラダラと長くてすみません.さて,今回のオチですが…
実は例が悪く,よく見ると「パッケージがあらへん」といっているものがあるように,現状のyumリポジトリーだけでは解決できないようです(ぇー

#CentOS 5系 w/ EPELだけでは本家から落としたpublican 2.8はビルドできないみたい(ハァ

また書く気になったらちゃんと一連の流れで成功するパターンでも書き直したいと思います.
では.あでゅー

lsb準拠のLinuxならディストリビューションやバージョンの識別はパッケージ情報やlsb_releaseを使おう

よく/etc/redhat-releaseの内容でOSの種類やバージョンを調べているスクリプトを見かけますが,10年前ならともかく,今となってはいまいちなやり方です.
ということで別の手段を紹介したいと思います.

/etc/redhat-releaseの持ち主パッケージの情報を調べる.

rpm系なら/etc/redhat-releaseの持ち主の情報でそれらを識別する方がまだモアベターです.
おそらく少なくともRed Hat Linux 7.0やRed Hat Enterprise Linux 2.1,Miraclelinux,Turbolinux 6.0前後から通用すると思います(以前勤務していたベンダーで,実際にディストリビューション,バージョンの識別に使っていた方法です).

$ rpm -qif /etc/redhat-release 
Name        : fedora-release               Relocations: (not relocatable)
Version     : 13                                Vendor: Fedora Project
Release     : 1                             Build Date: 2010年05月07日 13時24分24秒
Install Date: 2010年08月17日 20時51分39秒      Build Host: x86-06.phx2.fedoraproject.org
Group       : System Environment/Base       Source RPM: fedora-release-13-1.src.rpm
Size        : 27452                            License: GPLv2
Signature   : RSA/8, 2010年05月07日 14時24分58秒, Key ID 7edc6ad6e8e40fde
Packager    : Fedora Project
URL         : http://fedoraproject.org
Summary     : Fedora release files
Description :
Fedora release files such as yum configs and various /etc/ files that
define the release.
$ rpm -qf --queryformat="Vendor: %{VENDOR}\nPackager: %{PACKAGER}\nVersion: %{VERSION}\nRelease: %{RELEASE}\n" /etc/redhat-release 
Vendor: Fedora Project
Packager: Fedora Project
Version: 13
Release: 1

CentOS 5,6でも試してみました.

$ rpm -qf --queryformat="Vendor: %{VENDOR}\nPackager: %{PACKAGER}\nVersion: %{VERSION}\nRelease: %{RELEASE}\n" /etc/redhat-release 
Vendor: CentOS
Packager: (none)
Version: 5
Release: 6.el5.centos.1
$ rpm -qf --queryformat="Vendor: %{VENDOR}\nPackager: %{PACKAGER}\nVersion: %{VERSION}\nRelease: %{RELEASE}\n" /etc/redhat-release 
Vendor: CentOS
Packager: CentOS BuildSystem <http://bugs.centos.org>
Version: 6
Release: 0.el6.centos.5

lsb_releaseを使う

もしくはlsb_releaseを使う方法もあります.シンプルに情報が欲しい場合,下記のようにするといいでしょう.
#lsb_releaseはredhat-lsbというパッケージが入っていなければ使用できません(ただし最小構成でのインストールなどでなければほぼ入っていると思います).

$ lsb_release --id --short
Fedora
$ lsb_release --release --short
13
$ lsb_release --id --release --short
Fedora 13
$ lsb_release --release --short
5.6
$ lsb_release --id --short
CentOS
$ lsb_release --id --release --short
CentOS 5.6
$ lsb_release --id --short
CentOS
$ lsb_release --release --short
6.0
$ lsb_release --id --release --short
CentOS 6.0
$ lsb_release --id --release --short
CentOS 6.0

その他

lsb_releaseはより多くの情報を取り出せるのですが,アーキテクチャ情報だけを取り出すことができない…のが微妙なところです.versionという情報から抜き出すか,他のコマンドを用いるしかないかもしれません(誰かアーキテクチャだけ出す方法を知ってたらおせーて).

$ lsb_release 
LSB Version:    :core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch

というか,いずれにしろほとんどの人にとってはがんばるところじゃないですけどね!!

メディア(isoファイル)から簡単にローカルのリポジトリーを作成する方法

もう既にいろんなところに転がっていそうだけどはてダのリハビリがてら.

前書き

CentOS 6.0が出た記念に自宅でも入れてみようか…と思ったけど引越し直後,自宅の環境がいろいろな理由で貧弱になっており,ネットワークにつながらないATOMなマシンが1台…仕方なしにunetbootinを使って入れてみました.が,ネットワークにつながらない状況とはいえyumも使えないと面倒くさいので,ローカルでyumが使える環境を作ってみました.

やることの概要

簡単にいうと,インストール メディア内の/Packages/と/repodata/を1つのディレクトリー内にかき集めます.
難しく書いても大体そんな感じです(何

事前準備

CentOS 6.0(CentOS 5系も)は/etc/yum.repos.d/CentOS-Media.repoというリポジトリーの設定ファイルがあり,これは「/media/CentOS/」「/media/cdrom/」「/media/cdrecorder/」のいずれかにリポジトリーがあることを期待した設定になっています.今回はこの中から「/media/CentOS/」をリポジトリーの作成先にします.

disc1のコピー処理をする.

適当にマウントしてください.
今回は/mnt/cdmediaがメディア,isoファイルのマウント先と仮定します.isoファイルはディレクトリー/home/elf/isos/に既に保存していると仮定します.
もしかしたら読者の方は違うところにマウントをしたいかもしれないし,isoファイルは別のディレクトリーに保存しているかもしれませんが,よしなに読み替えてください.

isoファイルをマウントする場合

# mount -o loop /home/elf/isos/CentOS-6.0-x86_64-bin-DVD1.iso /mnt/cdmedia

#-t noneとか-oはもっといろいろ付ける方がお行儀がいい?(何

CD/DVDメディアをマウントする場合(多分)

# mount /dev/hdc /mnt/cdmedia

ディレクトリーのコピーをします.

# rsync -av /mnt/cdmedia/Packages /media/CentOS/.
# rsync -av /mnt/cdmedia/repodata /media/CentOS/.

#別にcpでもいいですよ

disc1の作業はこれで終わりです.マウントを解除します.

# umount /mnt/cdmedia

引き続きdisc2の作業に移ります.

disc2(CDメディアの場合は2〜6)のコピー処理をする.

たいしてやることは変わりありません.

isoファイルをマウントする場合

# mount -o loop /home/elf/isos/CentOS-6.0-x86_64-bin-DVD2.iso /mnt/cdmedia

CD/DVDメディアをマウントする場合(多分)

# mount /dev/hdc /mnt/cdmedia

ディレクトリーのコピーをします.

# rsync -av /mnt/cdmedia/Packages /media/CentOS/.

#repodataはdisc1にしか存在しません.

disc2の作業はこれで終わりです.マウントを解除します.

# umount /mnt/cdmedia

CDメディアの場合,disc6まで同様の作業を行います.
これで最低限の作業は完了です.

今構築したリポジトリーを使えるか確認する.

まず知っておかなければいけない注意点は,「/etc/yum.repos.d/CentOS-Media.repo」はそのままでは無効になるように設定されています.
今回は動作確認をしたいだけなので,設定ファイルは編集せずに確認をします.確認時は設定ファイルに書かれているように「yum --disablerepo=\* --enablerepo=c6-media [command]」という感じでコマンドを実行します.

# yum --disablerepo=\* --enablerepo=c6-media check-update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * c6-media: 

上記のようにエラー風のメッセージが出てこなければ利用できると考えてよさそうです(厳密にいうと,repodataが正しく読めることが確認できただけですが).
もし利用できないときは下記のようにエラーが出ると思います.

# yum --disablerepo=\* --enablerepo=c6-media check-update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * c6-media: 
file:///media/CentOS1/repodata/repomd.xml: [Errno 14] Could not open/read file:///media/CentOS/repodata/repomd.xml
Trying other mirror.
file:///media/cdrecorder/repodata/repomd.xml: [Errno 14] Could not open/read file:///media/cdrecorder/repodata/repomd.xml
Trying other mirror.
file:///media/cdrom/repodata/repomd.xml: [Errno 14] Could not open/read file:///media/cdrom/repodata/repomd.xml
Trying other mirror.

さてさて.しかしいつもオプション--enablerepoをつけるのは面倒ですね.ってことで気になる人は設定ファイルを変更しましょう.

[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
        file:///media/cdrom/
        file:///media/cdrecorder/
gpgcheck=1
enabled=1    ★「0」を「1」にする
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

あとは適当にyum listやyum installなどが期待通り動くか確認するといいでしょう.

補足

細かいことが気になる人は,CentOS-Base.repoの[base]でenabled=0を追加しておくと,/media/CentOS/で事足りる部分は完全にネットワークへ参照しに行かなくなります.

あとがき

一緒にcentos.orgやfedoraproject.orgで活動する仲間を募集しています.
興味がある方は適当な手段で連絡をお願いします!!

#ちゃんと書けと突込みが…

この辺にお願いします!!

そんなバカなセニョリータ!!

Perlにも少し慣れてきたのでだんだんワンライナーで試すことが増えてきたぜ.

$ perl -e 'use Data::Dumper; my $foo; print Dumper($foo); print "set\n" if (defined($foo->{foo})); print Dumper($foo);'
$VAR1 = undef;
$VAR1 = {};

値変わらないでよ!! わからなくはないけど気づかなかったじゃないか!!

とりあえず根元から丁寧に見ろってことじゃろうか.

$ perl -e 'use Data::Dumper; my $foo; print Dumper($foo); print "set\n" if (ref($foo) && defined($foo->{foo})); print Dumper($foo);'
$VAR1 = undef;
$VAR1 = undef;
$ perl -e 'use Data::Dumper; my $foo; print Dumper($foo); $foo = {}; print "set\n" if (ref($foo) && defined($foo->{foo})); print Dumper($foo);'
$VAR1 = undef;
$VAR1 = {};
$ perl -e 'use Data::Dumper; my $foo; print Dumper($foo); $foo = {foo => "foot"}; print "set\n" if (ref($foo) && defined($foo->{foo})); print Dumper($foo);'
$VAR1 = undef;
set
$VAR1 = {
          'foo' => 'foot'
        };