VirtualBox に CentOS 6.7 を入れた後で NAT にした時の設定

例によって忘れた時用のメモです。

タイトル通りなんですが、VirtualBox で CentOS 6.7 を使った時に困った話です。
状況としては下のようになります。

  1. ネットワーク設定で最初に NAT以外(ホストオンリー等)のネットワークアダプタを選んだ
  2. そのアダプタを後から NAT にした

この場合、VM を起動しても NAT からインターネットへのアクセスができません。
とりあえず下のように設定したら NAT を通って外へ出られました。

  • /etc/sysconfig/network ファイル
    • GATEWAY の行をコメントアウト(先頭に「#」を追加)する
  • /etc/sysconfig/network-scripts/ifcfg-eth0 を下の内容にする(NIC の数によっては eth0 の「0」を別の数字に読み替えます)
    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp

ちなみに、NAT が動いた時の IP が「10.0.5.15」で、デフォルトルートは「10.0.5.2」でした。
このパラメータを利用して手動設定ができるかもしれません。どなたか試したら教えてください。

今回は短い(当社比)ですが、以上です。

ufw によるファイアウォール

今回は ufw です。
以前からパッケージにあるのは知っていたのですが、VPS の Ubuntu 14.04 LTS に標準で入ってるのを触るまでスルーしてました。

ファイアウォールと言えば設定した途端に SSH が使えなくなって、泣きながら実マシンのコンソールまで駆け付けるハメになる、というのはよく有る話です。
今回はクラウドの VPS を使っており、何故か Web の管理画面からコンソールが見られないという、危険が危ない状態だったので細心の注意を払いました。

ドキュメントと man を読み漁り、iptables の一番上に作業マシンの IP 許可設定を突っ込み、ufw にも IP の許可と SSH の許可を設定した上でドキドキしながら「ufw enable」を実行しました。

結果的には ufw の設定だけでも十分でしたが、iptables に書いておいた設定が上に残っているのを見て、転ばぬ先の杖は大事だと実感しました。

ちなみに ufw の使い方は、設定を ufw コマンドで行い、準備ができたら「ufw enable」で有効化するという手順になります。とりあえず、次のコマンドを設定しておけば SSH が切れる心配は少ないと思います。


ufw allow 22/tcp
ufw allow from 作業マシンのIPアドレス

指定内容は「ufw status」で見られます。
詳細な形式は(私の所では) /lib/ufw/user.rules に記録されていました。

以上。いつものように備忘メモでした。

仮想 IP アドレスをフェイルオーバーする方法

お久しぶりです。
相変らず不定期更新で、作業メモばかりのブログです。

今回は (Debian系)Linux で、仮想 IP アドレスをフェイルオーバーする方法のメモです。
簡単に言うと、サーバ 2台の状態で片方がコケた時に残ってる方でサービスを継続したい時に使う手法です。って、全然簡単じゃないですね…

では下準備からです。
■材料

  • サーバ 2台(もちろん仮想マシンでも可)
  • ネットワーク 2個(つまり NIC 2枚ずつとハブ 2個)
  • クライアントマシン 1台(切り替え状況をチェックします)

■準備手順

  1. サーバに Debian系OS(最近だと Ubuntu が多いですかね)を入れます
  2. サーバに fake パッケージをインストールします(send_arp コマンドが入ります)
  3. サーバに arping パッケージをインストールします
  4. サーバを 2つのネットワークに接続する設定をします(/etc/network/interfaces ですね)
    便宜上それぞれを WAN と LAN と呼びます。また、サーバ名は srv1、srv2 とします。

    • LAN(eth0):192.168.1.0/24, srv1(192.168.1.11), srv2(192.168.1.12)
    • WAN(eth1):10.0.0.0/24, srv1(10.0.0.11), srv2(10.0.0.12)
  5. クライアントマシン(名前:cli)を WAN に接続します(IP:10.0.0.20)

それで、実際に切り替える操作です。

  • 仮想 IP アドレス($VIP)を 10.0.0.1 とします
  • WAN側デバイス($DEV = eth1)の MAC アドレス($MAC)を次だとします
    • srv1(000011110000)
    • srv2(222200002222)

■メイン側サーバ(srv1)へ仮想 IP を付けます

srv1> ip addr add $VIP/24 dev $DEV

■クライアント側からチェックします

  • IP アドレス:「cli> ping $VIP
  • ARP キャッシュ:「cli> arp」(10.0.0.1 が 000011110000 になるはずです)

■仮想 IP をフェイルオーバーするコマンドです
ここでは仮想 IP の存在チェックを繰り返して、失敗したら 仮想 IP の設定と ARP キャッシュの更新通知を行います。

  1. 仮想 IP の存在チェック:「srv2> arping -q -c 1 -I $DEV $VIP
  2. 仮想 IP の設定(srv1 の時と同様):「srv2> ip addr add $VIP/24 dev $DEV
  3. ARP キャッシュの更新通知:「srv2> send_arp $VIP $MAC 255.255.255.255 ffffffffffff $DEV $MAC ffffffffffff reply

たぶん、実際には下に書いたようなスクリプトを実行することになります。

■srv1 の仮想 IP を外します
srv1> ip addr del $VIP dev $DEV

■クライアント側からチェックします
前と同様に ping と arp を実行します。
arp の表示で 10.0.0.1 が 222200002222 に変わっているはずです。


仮想 IP フェイルオーバー用スクリプト


#!/bin/bash

VIP="10.0.0.1"
DEV="eth1"
BCAST_IP="255.255.255.255"
BCAST_MAC="ffffffffffff" # f x 12

health_check() {
arping -q -c 1 -I $DEV $VIP
return $?
}

ip_failover() {
MAC=`ip link show $DEV | egrep -o '([0-9a-f]{2}:){5}[0-9a-f]{2}' | head -1 | tr -d \:`
ip addr add $VIP/24 dev $DEV
send_arp $VIP $MAC $BCAST_IP $BCAST_MAC $DEV $MAC $BCAST_MAC reply
}

while health_check; do
echo "health check ok!"
sleep 1
done
echo "fail over!"
ip_failover

もちろん、実際に使う時には echo の部分はコメントアウトする事になるでしょう。


また、作業中に気付いた点は以下の通りです。

  • 仮想 IP のチェックは 「arping -q -c 1 -I $DEV $VIP」 の方が 「ping -c 1 $VIP >/dev/null」 よりも早くダウンに気付きました
  • Web でクライアント(実際には WAN のルータ)に 「echo 1 > /proc/sys/net/ipv4/conf/all/arp_accept」 を設定した方が良いと書いてありましたが、今回は設定値が 0 でも期待通りに動きました
  • ARP キャッシュ更新に使う send_arp コマンドですが、Web で調べた 「send_arp $VIP $MAC $BCAST_IP $BCAST_MAC $DEV」 では期待する ARP Reply ではなく ARP Request になってしまいました

オーケストレーションツールと愉快な仲間たち

間に何か挟まりましたが、連投です。というか、投稿するのは私だけなので、間隔の多少はあれど常に連投と言えなくもないです。
なんか寂れた掲示板とか購読者の居ないメルマガを彷彿とさせますね。

そんなブルー入った気分で始まる今回のネタは、前回に引き続きツールまとめです。

さて「オーケストレーション」が耳慣れない方もいらっしゃるでしょうから参考リンクを。
wikipedia オーケストレーション
wikipedia: プロビジョニング
…分かりにくいですね、はい。
個人的には「デプロイとかサーバ群の設定とかをまとめて自動化できるツール」みたいに考えています。(急募:ツッコミのできる有識者)
続きを読む

MariaDB を Debian6(squeeze) に入れるのが大変だった

知り合いから頼まれて MariaDB を Debian6 に入れたんですが、公式のインストール方法(apt リポジトリ追加 → apt-get update → apt-get install mariadb-server)では最後の方で止まってしまい、悩みました。
というわけで、うろ覚えながら方法をメモしておきたいと思います。

まずは公式の方法でインストールに挑戦します。
そうすると「subprocess installed post-installation script returned error」とかが出てエラー終了するはずです。(出ないで成功した貴方はラッキーですね)
続きを読む

virtualbox のゲスト Debian で nat ネットワークがつながらなかった件

掲題の通り、virtualbox で nat に設定したネットワークアダプタを用意してインストールすると、再起動後に外部ネットワークに接続できない状態になっていたので、開通させるまでの手順をメモ。

結論から言うと以下の 4手順で完了。

  1. ifconfig eth0 10.0.2.15 netmask 255.255.255.0
  2. route add default gw 10.0.2.2
  3. apt-get install ifupdown
  4. /etc/network/interfaces を編集
    • iface eth0 inet dhcp をコメントアウト
    • iface eth0 inet static
    • address 10.0.2.15
    • netmask 255.255.255.0
    • up route add default gw 10.0.2.2
    • down route del default gw 10.0.2.2

ここに行き着くまでに /etc/default/network をいじったり、何度も /etc/network/interfaces を書き直したり、手動で ip コマンドを叩きまくったりと大変だった…
特に /etc/network/interfaces を有効にするには ifupdown パッケージが入ってないとダメだと分かるまでに、だいぶかかってしまった。

debian の preseed.cfg で躓いた所

昨日に引き続き仮想マシン関連で、インストールを自動化しようと Debian の preseed.cfg をいじった記録。

一番大きな問題は apt のプロキシ設定で、ホスト名だけかと思ったらフル URL を入れる必要があったという話。
具体的には「d-i mirror/http/proxy string http://host:port/」と入れなきゃダメ。(port は apt-cacher-ng なら 3142)

あとはまあ、以下を変更するくらい。

  • d-i debian-installer/locale string ja_JP.UTF-8
  • d-i mirror/http/hostname string ftp.jp.debian.org
  • d-i time/zone string Asia/Tokyo
  • d-i clock-setup/ntp-server string jp.pool.ntp.org
  • d-i base-installer/kernel/image string linux-image-amd64
  • tasksel tasksel/first multiselect standard
  • d-i pkgsel/include string openssh-server

気分と趣味によっては以下も。

  • d-i netcfg/choose_interface select eth0
  • d-i netcfg/get_hostname string preseed-test
  • d-i netcfg/get_domain string vagrant.com
  • d-i apt-setup/non-free boolean true
  • d-i apt-setup/contrib boolean true

それから、「d-i keyboard-configuration/xkb-keymap select us」になっていても再起動後のキーボード設定は日本語になっており、なぜか「loadkeys us」も効かないようなので /etc/default/keyboard で「XKB_LAYOUT=”en”」にして再起動すると直る模様。ちなみに PuTTY とかで SSH 接続した場合は、設定してなくても問題無く英語キーボードで使える。

Linux で SSD

続けて投稿です。まあ、前のと併せて SSD 追加 → マウント という流れだっただけですが。

とりあえず Linux ではカーネル 2.6.33(CentOS 6は2.6.32にバックポートあり)から Trim コマンドに対応しているそうです。
ただし ext4 ファイルシステムでマウントオプションに「discard」を指定した場合のみとのお話なので要注意。

チェック方法としては、それぞれ次のようになります。

  • TRIM 対応状況(SSD側) 「hdparm -I /dev/sda | grep -i TRIM」
  • SSD かどうか? 「cat /sys/block/sda/queue/rotational」が 0 なら SSD
  • 使うI/Oスケジューラ「cat /sys/block/sda/queue/scheduler」
    •   基本的には「cfq」になっていますが、SSD の場合には「noop」や「deadline」にすると効率が良くなるという噂があります

 

また、以下に参考リンクをメモしておきます。

 

 

fstab で UUID を使う

また結構な間が空いてしまいました。

今回は /etc/fstab のマウント設定で UUID を使う方法です。
今更と言えば今更なのですが、これまでインストーラが書いてくれたものしか使っていなかったので、自分で設定するのは初めてでした。

fstab 側の書き方としては、デバイスパス(/dev/sda1 みたいな)の代わりに「UUID=xxxxxxxx」とすればいいわけです。が、その肝心な UUID の調べ方がサッパリでした。

まあ、ここ数年で検索すれば何でも見付かる状態になってくれたので、あっさり分かったのですが、いちおう備忘録ということで。

スーパーユーザで「blkid /dev/sda1」などとするか、直接「ls /dev/disk/by-uuid」で見えるそうです。

簡単なのですが、あまりに単純すぎてコマンド「blkid」やパス「/dev/disk/by-uuid」を忘れて、結局また探すことになる予感がします…

メモ帳の置き換えで手間取った話

ずっと前に windows7 のメモ帳を置き換えて、別アプリで起動するように設定していました。ところが、一部のアプリでレポート表示を行うとエラーになる事があり、直らないかと色々試した経過を、忘れないように書いておきます。

まず結論から言うと、レジストリの HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe 中で Debugger に文字列(REG_SZ)としてアプリへのフルパス(とオプション)が書いてある場合、拡張子の関連付けよりも優先されていました。このため、いくら関連付けや notepad.exe の置き換えを試しても効果がありませんでした。おそらく環境設定系のアプリを利用した際に追加されたのだと思うのですが、普段使っているツールフォルダの中には入っていなかったようで、具体的にどうやって設定されたのかは不明です。

更に面倒を増やしていたのが、拡張子によって動作を変更するソフトを経由していた事でした。当時の自分としては設定の柔軟性を期待していたのだと思います。しかし、これがまた問題で、関連付けに従ってファイルを表示する場合は大丈夫なのですが、自力でメモ帳を指定されてしまうと exe ファイルへの拡張子別設定が利用されてしまい、肝心のテキストファイルが開かれない状態になっていました。

以上のように複数レイヤで設定されていたため、結論に辿り着くまでに散々 Try & Error を繰り返すことになりました… つくづく作業記録の重要性を感じた2時間でした。

最後に備忘録として、メモ帳置き換えを行うために試したアプリを挙げておきます。

  • Terapper : notepad.exe 置き換え型。手作業版。(本来はTerapad用)
  • NotepadBranch : notepad.exe 置き換え型。インストール版。
  • Anterix : 拡張子関連付け変更型。関連する拡張子をまとめて設定可能。
  • Contexter : 拡張子関連付け変更型。「新規作成」や「送る」の変更も可能。