hiroshi akutsuの日記

主にプログラミング関係のこと

vagrant【git cloneしてきたがvagrant upできなかった】

git cloneでとってきたVagrantfileがあるのにvagrant upできなかった。

inspected result must be ASCII only or use the same encoding with default external (Encoding::CompatibilityError)

のようなエラーが出たが、原因はどうもgit cloneしたディレクトリのパスにマルチバイト文字が含まれていたせいだった。

マルチバイト文字をパスからとってやったら、うまいこといった。

windows8.1【cygwin64のインストール】

なにやら昨日いろいろ手こずったのでメモ。

cygwin自体は起動したんだけど、Bash Prompt hereを右クリックで出したかったのに、出せなかったので、一回アンインストールして再挑戦してようやくできた。

【環境】
windows8.1 64bit

【成功した方法】
cygwinの64bit版を本家サイトよりダウンロードしsetup*.exeを実行。
このとき、setup*.exeは追加インストールしたいプログラムがあった場合などに、再度使えるため捨てないでどっかに保存しておく。

インストールするプログラムを選択するときに
Systemで全項目のインストール(chereがあればいいらしいが念のため)

インストールが完了したらデスクトップに出来たcygwinのショートカットを右クリックより「管理者として実行」し、以下のコマンドを入力。

$ chere -i

これで右クリックからBash Prompt hereが実行できるはず。


※補遺
cygwinからAmazonのEC2のサーバにsshしようとしたらエラーになったのでメモ。

$ ssh -i keypair-name.pem ec2-user@hostname

で「keypair-name.pemのファイルパーミッションが770になってるよ」とエラーが出て接続できなかった。
しょうがないので

$ chmod 400 keypair-name.pem

で400に変えようとしたところ440にしかならなかった。

原因はkeypair-name.pemの所有グループが設定されていないから。
所有グループ名はたいていの場合Usersだと思います。

$ chgrp Users keypair-name.pem


これでグループが設定されたので

$ chmod 400 keypair-name.pem

で、めでたしめでたし。
どうもcygwinはインストールしたときにファイルやディレクトリのグループが設定されないようだ。

CentOS【Wakame vdcのテスト環境を構築する】

現在通っている産業技術大学院大学(AIIT)のクラウドインフラ構築特論という授業でWakame vdcを仮想環境上にインストールする課題があったのだけど、自分のローカル環境にインストールするのに結構ハマって苦労したので、インストール方法の記録を残したいと思います。

環境は以下のとおり。
・ホストOS:MacBookAir OSX yosemite
VirtualBox:4.3.20
・ゲストOS:CentOS 6.5
※ホストは64ビットOSである必要があります。
CentOS 6.6以降は現時点では対応していないようですのでインストールガイドに則り6.5で入れます。

やりたいことは以下の通り。

VirtualBox上にインストールしたゲストOS上にWakameの動作をテストするための環境を構築したい。
②ホストがノートPCで、様々なLANにつなぐことが想定されるので、ゲストのIPアドレスを固定化したい。BridgeではなくNATとホストオンリーネットワークの2アダプタ構成としたい。
③ホストからsshでwakameで立ち上げたインスタンスにログインしたい。
④ゲストOSは、コンソールだけだとネットワーク設定をミスして繋がんなくなったりした時にコマンドのコピペなどができなくて不便なのでデスクトップ版を入れたい。

基本的にはインストールガイド(下記リンク)の通りに行うのですが、そこに書かれていない設定などもいくつかあります。


install guide · axsh/wakame-vdc Wiki · GitHub


ハマりポイントがいくつもあったので、そこらへんは丁寧に書いていこうと思います。

まずVirtualBoxの設定から。この辺はインストールガイドになかったので丁寧に。


新規でイメージを作成します。名前は適当に、タイプはLinuxを選びバージョンはRed Hat(64bit)
f:id:hakoniwahaniwa:20141230190725p:plain

次にメモリを割り当てます。3ギガぐらいあれば理想ですが、2ギガで作りました。
f:id:hakoniwahaniwa:20141230194202p:plain

ハードドライブは追加で「続ける」
f:id:hakoniwahaniwa:20141230194238p:plain

ファイルタイプはVDIで「続ける」
f:id:hakoniwahaniwa:20141230194319p:plain

可変サイズで「続ける」
f:id:hakoniwahaniwa:20141230194709p:plain

デモなので20ギガぐらいで「作成」
f:id:hakoniwahaniwa:20141230194822p:plain


これで仮想の箱(インスタンス)ができました。


次に箱のネットワーク設定です。
環境設定からホストオンリーネットワークの設定をします。
f:id:hakoniwahaniwa:20141230195240p:plain

ネットワークから「ホストオンリーネットワーク」を選び右側の+のボタンをクリックし、ネットワークを追加します。私の場合はすでに作ってあるホストオンリーネットワークがいくつかあったので、vboxnet2というのができました。
f:id:hakoniwahaniwa:20141230195447p:plain

右側のドライバーのようなボタンをクリックし、アダプターのIPを以下のように設定します。192.168.58.1のゲートウェイのIPは非常に重要です。
f:id:hakoniwahaniwa:20141230195557p:plain

DHCP設定は特に何もしません。
f:id:hakoniwahaniwa:20141230195633p:plain

続いて箱のネットワーク設定をします。
アダプター1を以下のようにします。先ほど作成したホストオンリーネットワーク「vboxnet2」をプルダウンから間違えないよう選択します。
最終的にはこのvboxnet2のネットワークにインスタンスごとにローカルアドレスを割り振る形になります。
またプロミスキャスモードを「すべて許可」にします。
f:id:hakoniwahaniwa:20141230195848p:plain

次にゲストOSがWANに出ていくためのNATを設定します。
アダプター2を有効にし、NATを選びます。
f:id:hakoniwahaniwa:20141230200134p:plain

これでようやくCentOSのインストールです。
ストレージのCD/DVDドライブにCentOS 6.5のCentOS-6.5-x86_64-bin-DVD1.isoをセットして起動します。
f:id:hakoniwahaniwa:20141230201440p:plain



ディスクのチェックはSkipしましたが、時間があればOKで
f:id:hakoniwahaniwa:20141230201946p:plain

MacBookAirでインストールするとなぜかハードウェアが未対応的なエラーが出ますがOKで
f:id:hakoniwahaniwa:20141230202059p:plain

言語は日本語
f:id:hakoniwahaniwa:20141230202141p:plain

キーボードも日本語
f:id:hakoniwahaniwa:20141230202217p:plain

基本ストレージを選択
f:id:hakoniwahaniwa:20141230202253p:plain

データを破棄を選択
f:id:hakoniwahaniwa:20141230202336p:plain

ホスト名は適当に
f:id:hakoniwahaniwa:20141230202403p:plain


タイムゾーンはアジア/東京
f:id:hakoniwahaniwa:20141230202459p:plain

パスワードは忘れないやつ
f:id:hakoniwahaniwa:20141230202544p:plain

すべての領域を使用するで
f:id:hakoniwahaniwa:20141230202616p:plain

変更をディスクに書き込む
f:id:hakoniwahaniwa:20141230202650p:plain

Minimal Desktopを選択し他は何も選ばず「次」
f:id:hakoniwahaniwa:20141230202736p:plain

インストールが開始されます。
f:id:hakoniwahaniwa:20141230202813p:plain


しばらく待って下記画面が出たら再起動
f:id:hakoniwahaniwa:20141230203757p:plain

再起動後は下記画面になります。次へ
f:id:hakoniwahaniwa:20141230203844p:plain


同意して次
f:id:hakoniwahaniwa:20141230203926p:plain


ユーザーは適当に
f:id:hakoniwahaniwa:20141230204010p:plain

NTPはまだネットワークが繋がっていないので特に使わず次
f:id:hakoniwahaniwa:20141230204105p:plain

Kdumpを無効にして「はい」
f:id:hakoniwahaniwa:20141230204220p:plain

再起動
f:id:hakoniwahaniwa:20141230204252p:plain



ようやくこれでCentOSが使えるようになりました。

インストール後のCentOS側の設定

インストール直後はネットワークは繋がっていない状態だと思います。最初の方で重要なネットワーク周りの設定をやっていきます。

端末を立ち上げます。
f:id:hakoniwahaniwa:20141230204446p:plain


まずvisudoで一般ユーザからsudoできるようにします。
suコマンドでスーパーユーザになり、visudoコマンドで

$ su
# visudo

akutsu ALL=(ALL) ALL

を追加
f:id:hakoniwahaniwa:20141230204728p:plain

次にSelinuxを無効にします。スーパーユーザのまま

# vi /etc/selinux/config

でdisabledに。
f:id:hakoniwahaniwa:20141230205845p:plain


ここで再起動します。

# shutdown -r now

wakameのinstall guideにはwakameをインストール後にネットワークを設定していますが、まずインターネットに繋がないといけないので先にネットワークの設定をしてしまいます。



スーパーユーザになり

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

をし、eth0を編集します。

ifcfg-eth0の設定は以下のようになります。
※HWADDRとUUIDはデフォルトで入っている内容のまま変更しないで、それ以外の内容を変更します。
f:id:hakoniwahaniwa:20141230210559p:plain

次にifcfg-br0を追加します。

# vi /etc/sysconfig/network-scripts/ifcfg-br0

ゲートウェイの設定はここで書いてはいけません。ゲートウェイはインターネットに出るため、NAT側(dhcp)で自動で設定されます。
f:id:hakoniwahaniwa:20141230211147p:plain

次にeth1の設定をします。eth1はNATのアダプタです。onbootをyesに変えるだけです。
f:id:hakoniwahaniwa:20141230211614p:plain

これで

# service network restart

をし、ネットワークを再起動します。
下記のようにすべてOKになると外につながると思います。
f:id:hakoniwahaniwa:20141230211819p:plain

あとはinstall guideの設定をひたすらやっていきます。

$ sudo curl -o /etc/yum.repos.d/wakame-vdc.repo -R https://raw.githubusercontent.com/axsh/wakame-vdc/master/rpmbuild/wakame-vdc.repo
$ sudo curl -o /etc/yum.repos.d/openvz.repo -R https://raw.githubusercontent.com/axsh/wakame-vdc/master/rpmbuild/openvz.repo
wakame-vdc/master/rpmbuild/openvz.repo
$ sudo yum install -y epel-release
$ sudo yum install -y wakame-vdc-dcmgr-vmapp-config
$ sudo yum install -y wakame-vdc-hva-openvz-vmapp-config
$ sudo yum install -y wakame-vdc-webui-vmapp-config

ここまで終わったら再起動します。

$ sudo shutdown -r now

再起動後、新たにネットワークのインタフェース「venet0」が追加されています。

しかし、ここで

$ sudo service network restart

をするとこのvenet0だけこけます。
f:id:hakoniwahaniwa:20141230212754p:plain

なのでvenet0を編集します。

$ sudo vi /etc/sysconfig/network-scripts/ifcfg-venet0

で以下のようにNM_CONTROLLED=noを追記
f:id:hakoniwahaniwa:20141230212947p:plain

これで

$ sudo service network restart

をするときちんとOKが表示されるようになると思います。


install guideではこの後ネットワーク周りの設定を行っていますが、今回の記事では先にネットワーク周りは設定済みなのでそこは飛ばして、install guideのManual Configurationから続けていきます。

$ sudo cp /opt/axsh/wakame-vdc/dcmgr/config/dcmgr.conf.example /etc/wakame-vdc/dcmgr.conf
$ sudo cp /opt/axsh/wakame-vdc/dcmgr/config/hva.conf.example /etc/wakame-vdc/hva.conf
$ sudo cp /opt/axsh/wakame-vdc/frontend/dcmgr_gui/config/database.yml.example /etc/wakame-vdc/dcmgr_gui/database.yml
$ sudo cp /opt/axsh/wakame-vdc/frontend/dcmgr_gui/config/dcmgr_gui.yml.example /etc/wakame-vdc/dcmgr_gui/dcmgr_gui.yml
$ sudo cp /opt/axsh/wakame-vdc/frontend/dcmgr_gui/config/instance_spec.yml.example /etc/wakame-vdc/dcmgr_gui/instance_spec.yml
$ sudo cp /opt/axsh/wakame-vdc/frontend/dcmgr_gui/config/load_balancer_spec.yml.example /etc/wakame-vdc/dcmgr_gui/load_balancer_spec.yml
$ sudo service mysqld start
$ mysqladmin -uroot create wakame_dcmgr
$ cd /opt/axsh/wakame-vdc/dcmgr
$ /opt/axsh/wakame-vdc/ruby/bin/rake db:up

ここまでやったら1つファイルの中身を編集します。(install guide通りです)

$ sudo vi /etc/default/vdc-hva

でNODE_ID=demo1の前のコメントアウト(#)を外します。
f:id:hakoniwahaniwa:20141230213446p:plain


引き続きinstall guideの設定に戻り、残りをやっていきます。

$ /opt/axsh/wakame-vdc/dcmgr/bin/vdc-manage host add hva.demo1 \
   --uuid hn-demo1 \
   --display-name "demo HVA 1" \
   --cpu-cores 100 \
   --memory-size 10240 \
   --hypervisor openvz \
   --arch x86_64 \
   --disk-space 102400 \
   --force

$ sudo mkdir -p /var/lib/wakame-vdc/images
$ cd /var/lib/wakame-vdc/images
$ sudo curl -O http://dlc.wakame.axsh.jp.s3.amazonaws.com/demo/vmimage/ubuntu-lucid-kvm-md-32.raw.gz
$ /opt/axsh/wakame-vdc/dcmgr/bin/vdc-manage

ここまでやるとwakameのvdc-manageプロンプトが立ち上がります。
引き続き以下の内容を入力していきます。

backupstorage add \
  --uuid bkst-local \
  --display-name "local storage" \
  --base-uri "file:///var/lib/wakame-vdc/images/" \
  --storage-type local \
  --description "storage on the local filesystem"


backupobject add \
  --uuid bo-lucid5d \
  --display-name "Ubuntu 10.04 (Lucid Lynx) root partition" \
  --storage-id bkst-local \
  --object-key ubuntu-lucid-kvm-md-32.raw.gz \
  --size 149084 \
  --allocation-size 359940 \
  --container-format gz \
  --checksum 1f841b195e0fdfd4342709f77325ce29


image add local bo-lucid5d \
  --account-id a-shpoolxx \
  --uuid wmi-lucid5d \
  --root-device uuid:148bc5df-3fc5-4e93-8a16-7328907cb1c0 \
  --display-name "Ubuntu 10.04 (Lucid Lynx)"

以下はinstall guideの内容から今回の環境に合わせて変更してあります。

network add \
  --uuid nw-demo1 \
  --ipv4-network 192.168.58.0 \
  --prefix 24 \
  --ipv4-gw 192.168.58.1 \
  --dns 8.8.8.8 \
  --account-id a-shpoolxx \
  --display-name "demo network"

その次の設定も今回の内容に合わせて変更してください。インスタンスに割り当てられるホストのipは適当に10~199までとし、自身のbr0のip:100はreserveで使われないようにします。

network dhcp addrange nw-demo1 192.168.58.10 192.168.58.199
network reserve nw-demo1 --ipv4 192.168.58.100

あとはもうinstall guide通り

macrange add 525400 1 ffffff --uuid mr-demomacs
network dc add public --uuid dcn-public --description "the network instances are started in"
network dc add-network-mode public securitygroup
network forward nw-demo1 public
exit


$ mysqladmin -uroot create wakame_dcmgr_gui
$ cd /opt/axsh/wakame-vdc/frontend/dcmgr_gui/
$ /opt/axsh/wakame-vdc/ruby/bin/rake db:init


$ /opt/axsh/wakame-vdc/frontend/dcmgr_gui/bin/gui-manage

ここでもgui-manageプロンプトが立ち上がります。

account add --name default --uuid a-shpoolxx
user add --name "demo user" --uuid u-demo --password demo --login-id demo
user associate u-demo --account-ids a-shpoolxx
exit

$ sudo service rabbitmq-server start
$ sudo service mysqld start
$ sudo start vdc-dcmgr
$ sudo start vdc-collector
$ sudo start vdc-hva
$ sudo start vdc-webui

これでサーバが立ち上がったのであとはインスタンス起動



ホストのMacからインスタンスの立ち上げとインスタンスへのssh

ホストのWebブラウザから192.168.58.100:9000にアクセスします。
ユーザーとパスワードは両方ともdemoで
f:id:hakoniwahaniwa:20141230215808p:plain

まずセキュリティグループの設定です。
「NETWORK & SECURITY」の「Security Groups」で「Create Security Groups」をクリックします。
f:id:hakoniwahaniwa:20141230221244p:plain

sshが通るよう22ポートを開けます。
f:id:hakoniwahaniwa:20141230220451p:plain


次にkey pairsの画面に行きsshキーを取得します。
「Create Key Pairs」をクリックします。
f:id:hakoniwahaniwa:20141230220915p:plain

適当に名前を入れてCreateをクリック
f:id:hakoniwahaniwa:20141230221012p:plain

ダウンロードしたキーペアを保存します。
f:id:hakoniwahaniwa:20141230221339p:plain

次にMachine Imagesの画面に行って
Ubuntu 10.04を選んで「Launch Instance」をクリック
f:id:hakoniwahaniwa:20141230221527p:plain

Instance Nameを適当に入れ、Security Groupsを「>」をクリックして右のフィールドへ移動、Vifで「[nw-demo1]demo network」を選択し、「Launch」をクリック。
f:id:hakoniwahaniwa:20141230221840p:plain
f:id:hakoniwahaniwa:20141230221829p:plain

そしてInstanceの画面にいき、Stateがinitializingからrunningに変わるのを待ちます。

f:id:hakoniwahaniwa:20141230222032p:plain
f:id:hakoniwahaniwa:20141230222043p:plain

あとはsshをしてみるのみです。
そのまえに、macだとkeyファイルのパーミッションが400とかじゃないとアラートが出るので、ターミナルを開いてパーミッションを変更します。

~$ chmod 400 Downloads/ssh-wx6or7aj.pem
~$ ssh -i Downloads/ssh-wx6or7aj.pem -l ubuntu 192.168.58.10

f:id:hakoniwahaniwa:20141230222914p:plain

これでやっとログインできました。
今回はここまでです。これでホストがたとえインターネットに接続されていなくても、wakame環境をいじり倒すことができるようになります。


どうでしたでしょうか。何か不備があればご指摘ください。
非常に長い手順を踏みますが、慣れてしまえば1時間ぐらいあればできると思います。まあ、あまりこの手順になれることもないと思いますが……。

自分は恥ずかしい話、ホストOSやvirtualBoxのネットワーク設定を色々変えて20回以上インストールに失敗したので最後の方は手順を暗記し相当速くなりました。
まあこれも勉強ですね。
今回はこれで終了です。

vba【図としてコピーした画像をpower pointへ貼り付け時に変数に代入】

大量のグラフをパワーポイントに貼り付ける作業をやることがあると思います。
位置の調整とかサイズの調整とか面倒なんで、マクロでやることにしたんですが、その際発見したパワポに貼り付けた画像をスマートに変数に代入する方法をメモ。


要はエクセル上で「図としてコピー」した画像を、パワーポイントに貼り付けたステートメントでshapeオブジェクトへ代入したいんです。
パワポのPasteメソッドがShapeオブジェクトを返せば話は早いのですが、そうは簡単にはいきませんでした。

開発環境:officeは2013で64bitのwindows7です。

エクセルVBEの参照設定で「Microsoft PowerPoint 15.0 Object Library」にチェックを入れ、PowerPointをエクセルから操作します。

Sub PPTtest()

    Dim ppt As PowerPoint.Application
    Set ppt = New PowerPoint.Application

    Dim pst As Presentation

    'パワポファイルパスを適宜変更
    Set pst = ppt.Presentations.Open("C:\your\ppt\file.pptx")

    Dim pic As PowerPoint.Shape
    
    '以下でA1:G5の範囲を図としてコピー(用紙に合わせる)
    Range("A1:G5").CopyPicture appearance:=xlPrinter

    '以下で貼り付けた画像をshape型の変数に代入
    Set pic = pst.Slides(1).Shapes.Paste.PlaceholderFormat.Parent
    
    '以下は大きさや貼り付け位置などの調整(ご自由に)
    pic.Name = "エクセルの画像"
    pic.Top = 20
    pic.Left = 20
    pic.Width = 300

End Sub

PasteがShapeRangeを返すのをMicrosoft Officeのヘルプサイトで知って、「なんか直接変数に代入できそうだな」と思ってローカルウィンドウでPasteしたオブジェクトを丁寧に追っかけてみると、PlaceholderFormatのParentにありました。

ネットで検索しても「貼り付けたときにselectになっているのでselectionを使う」とか、「Pasteの後にShapes(1)などインデックス指定する」とかあったのですが、私のケースではこれらの方法を使いたくなかったので、上記の方法で問題なく取得できました。



_______________以下追記2015-03-24

後日再度shaperangeオブジェクトについて調べたところ、.item(index)を指定すると、shapeオブジェクトを返すことが分かりました。

つまり上記のpasteメソッドステートメントはこんな風にも書けます。

Set pic = pst.Slides(1).Shapes.Paste()(1)
'または
'Set pic = pst.Slides(1).Shapes.Paste.Item(1)

エクセルからpasteすると、pasteメソッドが返すshaperangeオブジェクトのcountは2になります。
そのため、複数のshapeオブジェクトを持つshaperangeオブジェクトだとtopやleftを操作することができません。
なので、itemのインデックスで1を指定して、shapeオブジェクトを取ってきます。


でもなぜ2つのitemを持っているのかは分かりませんでした。
2つとも同じshapeオブジェクトを指しているようでしたが、これはまた後日調べます。

vba【64bitのofficeでSeleniumWrapperを使ってみる】

ブラウザ処理の自動化をしたいなと思ってselenium-vbaをインストールしたんだが、うまく動かなかったのでメモ。
windows7の64bit版を使っていて、officeも64bitのものを使っている。
インストールは簡単。
https://code.google.com/p/selenium-vba/
から現行のv1.0.19.0の.exeファイルをダウンロードし、ただ実行するだけ。あとはインストーラが巧いこと仕事してくれる。

のはずだったのだが…

きちんとProgram files(x86)以下に配置されて
VBEの参照設定でSeleniumWrapperの選択までやって、
いざサンプルのマクロを実行してみてもうんともすんとも動かない。

仕舞には「別のプログラムでのOLEが完了するまで待機します。」的なメッセージが出て、一向に動かなかった。





結論は、64bit版のofficeをProgram files以下にインストールしている場合、SeleniumWrapperのインストール先を
Program files(x86)
ではなく
Program files
に配置しなくてはならないようだ。

これで万事うまくいった。

samba【windows XPとして使用していたマシンにcentOSをインストールし共有サーバーとして使う】

2014年4月8日にwindowsXPのサポートが切れまして、会社にたくさんの現役引退したクライアント端末が残りました。

中にはcorei5のcpuのマシンもあり、下取りにも出せたのですが、たいした額にもならなさそうだったので、linuxをインストールしてファイル共有サーバーを作りたいと思います。

今回の目標は以下です。
①CentOS6.5のイメージディスクの作成
②CentOS6.5のminimal(CUI版)インストール
CentOSの環境準備
samba環境の構築


ちょっと骨が折れますが、一部始終を記録してみたいと思います。

まず、用意するもの。

windowsXPが入っていたマシン(以降CentOSをインストールするので「C機」とします)
・DVD1枚
windows7のマシン(以降「W機」とします)

前提として、ローカルネットワークが構築されていて、「C機(windowsXPが入っていたマシン)」と「W機(windows7のマシン)」をともにローカルネットワークに接続できるようにしておく必要があります。

平たく言うと、ルータから出てるケーブルにハブなどを介していても両マシンがつながっていればOKです。

私の手元には本来windows7として売られているマシンをダウングレードした
DELL OPTIPLEX 7010 windowsXP Pro 32bit
がありますのでこれにcentOS6.5を入れてみたいと思います。

目標① CentOS6.5のisoディスクの作成
※W機にて作業します。

まず下記サイトに行き、目的のCentOSのバージョンを探します。
http://www.centos.org/download/
f:id:hakoniwahaniwa:20140528114143p:plain
Download now.だと64bit版のCentOSになってしまうので、32bit版を探すためalternative downloadsのリンクをクリックします。
すると、以下のページに進みますのでi386(32bit版のアーキテクチャ)を選択します。
f:id:hakoniwahaniwa:20140528114221p:plain

いくつか国内のミラーサイトが出てきます。お好きなところを選んでください。
今回はftp.nara.wid.ad.jpのドメインNAIST)のサイトよりダウンロードしてみます。
f:id:hakoniwahaniwa:20140528114306p:plain

CentOS-6.5-i386-bin-DVD1.isoをクリックしてダウンロードします。結構大きいので時間がかかります。

f:id:hakoniwahaniwa:20140528114523p:plain
自分はminimalしか使わない!という人は、CentOS-6.5-i386-minimal.isoを選んでもOKです。
ちなみに①目標はminimal版のインストールですが、今回作成するイメージディスクを、他のマシンへのCentOSのインストールにも使いまわしたいので、デスクトップなどの基本的なパッケージが入っているbin-DVD1.isoをDVDに焼こうと思います。

bin-DVD2.isoも必要かと思われるかもしれませんが、今回インストールするminimalがbin-DVD1.isoの内容でこと足りるのでDVD1だけで問題ありません。
後述しますが、CentOSのインストール時に追加パッケージをどんどん選んでいくと、DVD2を入れてくれと表示されることがありますが、今回はDVD2が必要となるパッケージはインストールしません。



次にDVDドライブに空のディスクを挿入し、ダウンロードされた.isoのファイルを右クリックします。
すると「ディスクイメージの書き込み」というメニューが表示されますので、こちらをクリックします。
f:id:hakoniwahaniwa:20140528120738p:plain

あとはドライブを選択し「書き込み」をクリックするとDVDディスクに焼かれます。これもしばらく時間がかかります。
f:id:hakoniwahaniwa:20140528120933p:plain

面倒なので、とくにDVD書き込みソフトを使用していませんが、好きなソフトがある方はそちらでどうぞ。

以上で①が完了です。

目標② 古いXPのマシンにCentOS6.5をインストールする。
※C機で作業します。

一旦XPのまま立ち上げて、①で作成したDVDをDVDドライブに挿入します。
挿入したらすぐにシャットダウンしてください。
※ウイルスとか心配だったら、LANケーブルを抜いておくといいです。

そして再度起動します。
電源を入れた直後に「F12キー」を押しっぱなしにします。
するとbiosの設定画面が表示されます。

そこで、OSのBOOTをどのメディアから行うか選択できるので、CD/DVD/CD-RW Driveをキーボードで選択します。

ディスクのチェックを行うか訊かれますので、SKIPを選びます。

そしたらいよいよCentOSの起動です。
f:id:hakoniwahaniwa:20140529155253p:plain

右下にボタンがありますので「Next」を押して進んでください。
まずは言語を訊かれます。日本語を選んで「Next」。
f:id:hakoniwahaniwa:20140529155417p:plain
次にキーボードです。日本語を選んで「次」。
f:id:hakoniwahaniwa:20140529155455p:plain
基本ストレージデバイスで「次」。
f:id:hakoniwahaniwa:20140529155538p:plain
新規インストールで「次」。
f:id:hakoniwahaniwa:20140529155602p:plain
ホスト名を入力して「次」。
f:id:hakoniwahaniwa:20140529155648p:plain
地域とシステムクロックでUTCを使用を選び、「次」。
f:id:hakoniwahaniwa:20140529155741p:plain
rootのパスワードを入力して「次」
f:id:hakoniwahaniwa:20140529160154p:plain
気になるようでしたらもっと複雑なパスワードにしてください。「とにかく使用する」で次にすすめます。
f:id:hakoniwahaniwa:20140529160325p:plain
すべての領域を使用するで「次」
f:id:hakoniwahaniwa:20140529160516p:plain
「変更をディスクに書き込む」をクリックすると次の次の画面あたりでwindows XPが削除され、新しいOSが書き込まれます。
f:id:hakoniwahaniwa:20140529160545p:plain
「minimal」を選択し、下の「今すぐカスタマイズ」選択し、「次」。
f:id:hakoniwahaniwa:20140529161039p:plain

このあとのキャプチャをとり忘れてしまって申し訳ないのですが、
次の画面で、左の項目から「サーバー」を選んで、右の項目で「CIFS ファイルサーバー」にチェックを入れ、「次」。

すると、インストールが始まります。
10分ぐらいかかりますでしょうか。しばし待ちます……。

以下の画面が表示されたら、後は再起動するだけです。
f:id:hakoniwahaniwa:20140529161501p:plain




CentOSの環境準備 
※C機とW機の両方で作業します。

再起動が完了すると真っ黒な画面に

CentOS release 6.5 (Final)
Kernel 2.6.32-431.el6.i686 on an i686
hoge login: _

とだけ表示されます。
誰のアカウントでログインするか訊かれている状態なので、「root」と入力してエンターを押します。
パスワードを訊かれますのでインストール時に設定したパスワードを入力します。

すると

[root@hoge ~]# _

と表示されます。
これでログイン成功です。


③ではW機からSSHプロトコルでターミナルエミュレータからC機のマシンに接続するまでを扱います。
W機からSSHを使うにはC機のIPアドレスが必要です。
なのでC機のIPアドレスを調べます。

IPアドレスを調べるにはC機でifconfigコマンドを実行します。

# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:240 (240.0 b)  TX bytes:240 (240.0 b)

IPアドレスを調べます。
まだネットワーク設定がありませんので、外に向けたipアドレスが表示されません。
loと表示されるデバイスはローカルループバックで、127からはじまるIPは自分のマシン自体を指定する際に使用するIPアドレスです。

なのでC機のネットワークを設定していきます。

まずはlsでネットワークデバイスを調べます。

# ls /etc/sysconfig/network-scripts

でifcfg-em1が見つかりましたので、このデバイスをviエディタで編集します。
(viエディタの使い方はここでは省略します)

# vi /etc/sysconfig/network-scripts/ifcfg-em1

赤字の箇所を追加・編集します。

DEVICE=em1
(略)
ONBOOT=yes
(略)
PEERDNS=yes

PEERDNS=yesはDNSサーバーをDHCPで割り当てる設定です。
完了したらnetworkを再起動します。

# /etc/init.d/network restart

もう一度

# ifconfig
em1       Link encap:Ethernet  HWaddr 90:B1:1C:75:A5:D0
          inet addr:192.168.0.124  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::92b1:1cff:fe75:a5d0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:17770 errors:0 dropped:0 overruns:0 frame:0
          TX packets:152 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1256216 (1.1 MiB)  TX bytes:19122 (18.6 KiB)
          Interrupt:20 Memory:f7f00000-f7f20000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:240 (240.0 b)  TX bytes:240 (240.0 b)

でIPを調べるとem1のデバイスが追加されていると思います。
W機からPINGを飛ばしてみましょう。

W機でコマンドプロンプトを立ち上げてping 192.168.x.xxx
xはC機で調べたifconfigのipアドレスを入れます。
私のC機のIPは192.168.0.124でした。

C:\Users\haniwa>ping 192.168.0.124

192.168.0.124 に ping を送信しています 32 バイトのデータ:
192.168.0.124 からの応答: バイト数 =32 時間 =1ms TTL=64
192.168.0.124 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.124 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.124 からの応答: バイト数 =32 時間 <1ms TTL=64

192.168.0.124 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 1ms、平均 = 0ms

ちゃんと通りました。
逆もやってみます。
C機からW機に飛ばしたいところですがW機はサーバーではないので適当にyahooとかに飛ばしてみます。

# ping yahoo.co.jp
PING yahoo.co.jp (183.79.135.206) 56(84)bytes of data.
64 bytes from f1.top.vip.kks.yahoo.co.jp (183.79.135.206): icmp_seq=1 ttl=53 time=21.2 ms
64 bytes from f1.top.vip.kks.yahoo.co.jp (183.79.135.206): icmp_seq=1 ttl=53 time=21.2 ms
64 bytes from f1.top.vip.kks.yahoo.co.jp (183.79.135.206): icmp_seq=1 ttl=53 time=21.2 ms
^C
--- yahoo.co.jp ping statistics ---
3packets trasmitted, 3 received, 0% packet loss, time 2512ms
rtt min/avg/max\mdev = 17.828/18.985/21.223/1.590 ms

ctrl + cでpingコマンドを抜けます。

これできちんとDNSも解決されて、PINGが飛んでいることが確認できました。

それではW機からssh接続してみます。

ここではputtyを使います。

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
よりputty.exeをダウンロードできます。
putty.exeを実行してください。

こんな画面が立ち上がりますので、Host Nameに
192.168.x.xxx(C機のifconfigで表示されたIPアドレス
を入力してOpenをクリックすると接続できます。
f:id:hakoniwahaniwa:20140529124707p:plain

初回の接続は以下のような画面がでます。
f:id:hakoniwahaniwa:20140529124917p:plain
「はい」をクリックしてください。

login as : root

でパスワードを訊かれますので、C機で入力していたrootのパスワードを入力すると、ログインできます。
これでroot権限でW機からC機を直接操作できるようになりました。

これまでC機につながれたキーボードで直接入力してきましたが、これからはC機への命令はW機から行います。


※補遺
本来linuxunixは、サーバーとして使われる目的で設計されています。
1台のサーバーにいくつもの端末が接続し、それぞれの端末ごとに異なる操作を行えます。
直接C機に接続してC機のモニターに出力された画面を「コンソール」、
クライアントマシンのターミナルエミュレータに出力された画面を「ターミナル」といいます。
基本的に「コンソール」は緊急事態とか初期設定とかでしか利用しません。
なので、sshが接続できてからは、以降の設定は全てW機から行います。
C機のモニターやマウスやキーボードはもう外してかまいません。



sambaを設定する
以降の説明は全てW機から行います。

まずは、sambaを動作させるために必要なsambaパッケージとsamba-commonパッケージがインストールされているか調べます。
rpmコマンドを使います。

# rpm -q samba samba-common
samba-3.6.9-164.el6.i686
samba-common-3.6.9-164.el6.i686

入っていますね。

そしたら、いよいよ設定していきます。
まず、共有ディレクトリを作成します。今回はhome以下にshareというディレクトリを作成します。

# mkdir /home/share

誰でも入れるようにパーミッションを変更します。

# chmod 0777 /home/share

sambaの設定ファイルを変更します。

/etc/samba/smb.confが設定ファイルです。

最初にバックアップのコピーをとっておいてから編集するようにしましょう。

# cp /etc/samba/smb.conf /etc/samba/smb.conf.org
# vi /etc/samba/smb.conf

共有のネットワーク一覧に表示するには、netbios nameを有効にする必要があります。
[global]セクション内、行番号でいうと77行目にその記載がありました。

74 workgroup = MYGROUP
75 server string = Samba Server Version %v
76
77 ; netbios name = MYSERVER
78
79 ; interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
80 ; hosts allow = 127. 192.168.12. 192.168.13.

;でコメント化されているので、;を削除して好きなnetbios名をつけます。

77 netbios name = hakoniwa

また101行目

101 security = share

に変えます。

そして、[homes]セクションの上に、共有のセクション[haniwa]を追加します。

246 #============================ Share Definitions ==============================
247 [haniwa]
248 comment = haniwas share
249 browseable = yes
250 writable = yes
251 guest ok = yes
252 guest only = yes
253 path = /home/share
254
255 [homes]
256 comment = Home Directories
257 browseable = no
258 writable = yes
259 ; valid users = %S
260 ; valid users = MYDOMAIN\%S

そうしたら、sambaのデーモンsmbとnetbiosのデーモンnmbを起動しましょう。

# /etc/init.d/smb start
SMB サービスを起動中:                                      [  OK  ]
# /etc/init.d/nmb start
NMB サービスを起動中:                                      [  OK  ]

これでsmb.confの最低限の設定は完了ですが、まだW機のエクスプローラからアクセスしようとしてもアクセスできません。
アドレスバーに¥¥hakoniwaと入力すると以下のようなエラーが表示されます。
f:id:hakoniwahaniwa:20140529134220p:plain

つまり何がしかがW機からC機への接続をブロックしているということになります。

ここでようやくiptablesの設定です。
iptablesは簡単に言ってしまうとファイアウォールです。
CentOSをインストールした直後は22番ポート以外の全ポートをブロックしています。

22番ポートはSSHで使用するポートです。特にiptablesを最初いじらなくても、SSH接続できたのはこの22番ポートが最初から開いていたからです。

共有サーバーを立ち上げるうえで開放しなくてはいけないポートは以下の4つです。
137
138
139
445
細かい説明は省略しますが、これらのポートをiptablesから開放します。
興味があればwell-knownポートで検索してみてください。

バックアップを取ってから作業します。

# cp /etc/sysconfig/iptables /etc/sysconfig/iptables.org
# vi /etc/sysconfig/iptables

赤字の箇所を追加します。

10 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
11
12 #samba and netbios >>
13 -A INPUT -m state --state NEW -m udp -p udp --dport 137 -j ACCEPT
14 -A INPUT -m state --state NEW -m udp -p udp --dport 138 -j ACCEPT
15 -A INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
16 -A INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
17 #<< samba and netbios

18
19 -A INPUT -j REJECT --reject-with icmp-host-prohibited
20 -A FORWARD -j REJECT --reject-with icmp-host-prohibited

次にiptablesデーモンの再起動です。

# /etc/init.d/iptables restart

さて先ほどと同じようにW機のエクスプローラのアドレスバーに¥¥hakoniwa
と入れてみましょう。
すると……
f:id:hakoniwahaniwa:20140529142130p:plain
入れました!

ためしに何かファイルを置いて見ましょう。ファイルを共有フォルダに置こうとすると……
f:id:hakoniwahaniwa:20140529143001p:plain

アクセス許可を求められました。
/home/shareディレクトリはパーミッションを777にしているのに書き込めないなんておかしい、と思うかもしれませんがこれはSELinuxが有効になっているためです。
デフォルトでCentOSではSELinuxが有効になるので、777というパーミッションは許可されません。
なのでSELinuxを無効にします。

# vi /etc/sysconfig/selinux

selinuxの設定ファイルを変更します。

※setenforceコマンドで、

# setenforce Permissive

でも一応その起動回のみ無効にできますが、これではC機を再起動した際、またSELinuxがenforceingに戻ってしまいますので直接設定ファイルを変更し再起動しておきましょう。
7行目のenforcingとなっているところを以下のように修正します。

7 SELINUX=disabled

そうしたら再起動します。

# shutdown -r now


もう一度適当なファイルをW機からおいて見ましょう。

すると今度は、次のようなエラーが表示されました。
f:id:hakoniwahaniwa:20140529144759p:plain

なんだか、うまくいかないことが多いですが、よく起こりうるエラーは今回の記事では初心者向けの内容なので、一応拾っておきます。
これの原因はシャットダウンした際に、smbとnmbのデーモンがストップし、起動時に自動でsmbとnmbのデーモンが自動スタートされる設定になっていないため、現在共有サーバーは立ち上がっていないことで、エラーになってしまいます。

OSのboot時にsmbとnmbを起動させるには以下のコマンドを実行します。

# chkconfig nmb on
# chkconfig smb on

これでもういちど再起動してみましょう。

# shutdown -r now

気を取り直してもう一度ファイルを置いてみます。
f:id:hakoniwahaniwa:20140529145852p:plain


これで最低限の共有が使えるようになりました。あとはログの管理とか、パスワードとか、バックアップとかいろいろ使っていくうちに追加設定が必要になる場面が出てくると思いますが、マニュアルや他のブログやこのブログの他の記事を参照してください。
今回のミッションはこれで完了になります。

お疲れ様でした。

samba【centOS6.5で構築した共有にて、クライアントのNetBIOS名をログに記録する】

sambaで共有を構築されているオフィスは結構多いと思います。

共有マシンにlinuxなりunixをいれてsamba入れてportあけて共有をつなげるまでは割と簡単にできますが、
「このファイルのコピー作ったの誰だ!」
とか
「このフォルダが削除か移動されてるらしく、見つからないんですが……」

どうしてもこういった問題は100人ぐらいで使っていると頻発します。

共有管理している人のせいにされるのも癪なので、犯人特定できりゃいいって話ではないですが、犯人……じゃないや、作業した人が特定できるように、ログをきちんと吐き出すように設定したメモを残します。

今回logをとっていく上で問題になったのは次の点---

(1)smb.confのlog levelの設定は管理が大変。
複数行にまたがるのでgrepしたときに探しにくいのではないか。
またlog level = 2では削除したかどうかがよくわからない。
かといってlog level = 3では量が甚大になる。
単純に、いつ、誰が、どのディレクトリで、どのファイルを、どうしたか、のみわかればいい。

(2)デフォルトの設定ではユーザーの情報がIPアドレスしか取れなかった。
DHCPIPアドレスを割り振っているのでIPからその時のユーザーを特定するのが困難。
NetBIOS名が取れればいい。

(3)ログの出力先が1ファイルだと量が大きくなるので、ログファイルを分割する設定が月ごとに1ファイルになるようにしたい。

早速見ていきます。
環境は以下のとおりです。

OS:centOS6.5
samba: 3.6.9-168.el6_5
数多のクライアントマシン:Windows7

まず(1)について。
sambavfsのfull-auditを使いました。
sambaに搭載された機能で、目的のlogを吐き出すのに相当役立ちました。sambaの処理は全て記録できるそうです。

最終的にこんなログが吐き出されるようになります。

May  2 12:01:34 smbshare smbd[11552]: pc0217-pc|192.168.0.80|sharename|pwrite|ok|共有/チームA/管理/プロジェクト/test.xlsx

※参考 → http://www.samba.org/samba/docs/man/manpages-3/vfs_full_audit.8.html

smb.conf共有のユーザー定義のセクションに以下の赤字の箇所を追記します。
smb.confはデフォルトで
/etc/samba/smb.conf
にあります。

[sharename]
        comment = file share
        browseable = yes
        writable = yes
        guest ok = yes
        guest only = yes
        path = /home/sharedir
        vfs objects = full_audit
        full_audit:facility = local1
        full_audit:prefix = %m|%I|%S
        full_audit:failure = connect disconnect mkdir rmdir pwrite rename unlink
        full_audit:success = connect disconnect mkdir rmdir pwrite rename unlink

vfs objects = full_audit
はこれからfull_auditを使いますという宣言的なもの?です。

full_audit:facility = local1
はrsyslog.confのファシリティにlocal1を追加します(後述)。
これを記述することで、sambaのsharenameセクションのログのみのログファイルや日ごとのログファイルを収めたディレクトリを作ることができるようになります。
逆にこれをしないと、ログは/var/log/messagesに吐き出されますが他のシステムログと混ざってしまうので、よろしくありません。


full_audit:prefix = %m|%I|%S
ですが、

%m : NetBIOS名(簡単に言うとwindowsクライアントのPC名)
%I(大文字のアイ) : IPアドレス
%S : セクション名(この場合sharename)

をそれぞれ|で区切るという意味になります。
※参考 → http://www.samba.org/samba/docs/man/manpages-3/smb.conf.5.html#FULL_AUDIT:PREFIX

上のログの

May  2 12:01:34 smbshare smbd[11552]: pc0217-pc|192.168.0.80|sharename|pwrite|ok|共有/チームA/管理/プロジェクト/test.xlsx

の赤字部分にあたります。これがプレフィックスというわけですね。

full_audit:failure = connect disconnect mkdir rmdir pwrite rename unlink
こちらは操作が失敗したとき、どのアクションのログを出力するかという設定になります。
見てのとおり、アクション名をスペース区切りで記述していきます。
http://www.samba.org/samba/docs/man/manpages-3/vfs_full_audit.8.html
に記載のあるアクションが記述できるようですが、多すぎると管理が大変になるので必要最低限でいいと思います。

connect : 接続
disconnect: 遮断
mkdir : フォルダ作成
rmdir : フォルダ削除
pwrite : ファイル作成
rename : ファイル名変更
unlink : ファイル削除

いろいろありますが、samba開発者はfailure(失敗)のログをもとにバグを見つけたりするのでとても大事な情報ですが、sambaのユーザーは、あまり意識する必要がないとおもいます。

それよりは、私のような管理をする立場の人間は、成功した情報(つまり実際にsambaサーバのファイルやフォルダを操作した情報)の方が欲しいのです。それで下記の設定をするのです。
full_audit:success = connect disconnect mkdir rmdir pwrite rename unlink
これが大事です。どの操作のログを取得するか指定しています。failureと同様の記載方法です。

下記が今回のブログの設定をすると出力されるログの例です。

May  2 12:01:34 smbshare smbd[11552]: pc0217-pc|192.168.0.80|sharename|pwrite|ok|共有/チームA/管理/プロジェクト/test.xlsx

の赤字部分が操作記録になります。
つまり「pc0217-pcというnetbios名を持つパソコンから、test.xlsxが共有に作成された」とわかります。

さて、こちらで/etc/samba/smb.confを上書き保存するとすぐにログの情報が/var/log/messagesに書き出されると思います。


ただし、私の環境ではこのままではユーザー(クライアント)のNetBIOS名が取得できませんでした。
%mの値がIPアドレスになってしまいました。

sambaの公式サイトには

%m

the NetBIOS name of the client machine (very useful).

This parameter is not available when Samba listens on port 445, as clients no longer send this information. If you use this macro in an include statement on a domain that has a Samba domain controller be sure to set in the [global] section smb ports = 139. This will cause Samba to not listen on port 445 and will permit include functionality to function as it did with Samba 2.x.

となっていました。
つまり要約すると、NetBIOS名は非常に有効なんだけど、445ポートを使っているとだめで、その場合はグローバルセクションに
smb ports = 139
と書いてください、ということでした。

なのでグローバルセクションに以下追記しました。

[global]
……(中略)
smb ports = 139

smbとnmbを再起動したら、見事NetBIOSが取得できました。
これで(2)がクリアです。


次に(3)ログの切り分けについて。
デフォルトではrsyslogというシステムログ出力のプログラムにログが渡されます。
ここで、rsyslogはsambaとは別のシステムなので、smb.confでfull_auditの設定はできても、ログの吐き出し先を指定することはできません。
ログの吐き出し先は/etc/rsyslog.confにて記述します。

今のままだと
/var/log/messages
に設定したログが吐き出されると思いますが、messagesはsamba以外のログも吐き出されるので、sambaのログを切り分けます。
/var/log/sharename-log/2014-05.log
に吐き出したいと思います。

あらかじめ、以下のコマンドを実行しログ置き場のディレクトリを作成してください。
#mkdir /var/log/sharename-log


ファイル名の05のところは月ごとに新しいファイルを新規作成するようにします。

/etc/rsyslog.conf

を編集します。
# ### begin forwarding rule ###
の上に以下を追記

$template sharetmpl, "/var/log/sharename-log/%$year%-%$month%.log"
local1.*                                                ?sharetmpl

これでlocal1というファシリティのログはsharetmplというテンプレートに記述された位置に保存されるようになります。
/etc/samba/smb.confで
full_audit:facility = local1
と記述しましたがこのlocal1が上のファシリティ名にあたります。
※local1は勝手な名前は付けられませんが、local0~local7まで未使用のものならどれでも使えます。

local1.*の.*はログのレベルをあらわしています。*はワイルドカードです。
つまりすべてのlocal1のログレベルにおいて、/var/log/sharename-log/%$year%-%$month%.logに保存する
という意味になります。
ログレベルについてはあまり調べられていないのと、smb.confで特に設定しなかったので割愛します。

これで
#/etc/init.d/rsyslog restart
を実行して、問題なくrsyslogが再起動できれば完了です。