Wheezy/SqueezeでKeepalived+LVS(IPVS)構成(NAT)にする。

■Wheezy/SqueezeでKeepalived+LVS(IPVS)構成(NAT)にする。

 Wheezy/Squeezeにkeepalivedを導入、VRRPで仮想IPにアクセス。
 http://d.hatena.ne.jp/labunix/20130618

 IPVSのみでWebサーバをラウンドロビン構成にする。
 http://labunix.hateblo.jp/entry/20130619/1371652385

■以下を確認。

$ sudo sysctl -p
net.ipv4.ip_forward = 1

■サンプルとコメントを参考に記述。

$ lv -s /usr/share/doc/keepalived/keepalived.conf.SYNOPSIS.gz | wc -l
407

■途中、「lvs_」と「lb_」で差が出るが、サンプルファイルのオプション名とした。

$ lv -s /usr/share/doc/keepalived/keepalived.conf.SYNOPSIS.gz | grep lvs
    lvs_sync_daemon_interface <STRING>  # Binding interface for lvs syncd
    lvs_sched rr|wrr|lc|wlc|lblc|sh|dh  # LVS scheduler used
    lvs_method NAT|DR|TUN               # LVS method used

$ grep lb_ /usr/share/doc/keepalived/samples/keepalived.conf.vrrp.lvs_syncd
    lb_algo rr
    lb_kind NAT

■上記の通り、keepalivedの設定ファイルでIPVSも設定できるが、
 便宜上、「keepalived用」と「IPVS用」にファイルを分けた。

 「keepalived用」には送信元メールと優先度以外に、
 MASTER/BACKUPの本質的な違いは無い。

$ sudo diff keepalived.conf /etc/keepalived/keepalived.conf
7c7
<    notification_email_from vrrp100@vmdebian1.test.local
---
>    notification_email_from vrrp200@vmdebian1.test.local
21c21
<     priority 100
---
>     priority 200
44c44
<     priority 200
---
>     priority 100


■keepalived用の設定

$ cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     root@vmdebian1.test.local
   }
   notification_email_from vrrp200@vmdebian1.test.local
   smtp_server 192.168.164.11
   smtp_connect_timeout 30
   # router_id LVS_DEVEL
   enable_traps
}


vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 52
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.164.16
        # 192.168.200.16
        # 192.168.200.17
        # 192.168.200.18

        # optional label. should be of the form "realdev:sometext" for
        # compatibility with ifconfig.
        # 192.168.200.18 label eth0:1
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 53
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.164.17
        # 192.168.200.16
        # 192.168.200.17
        # 192.168.200.18

        # optional label. should be of the form "realdev:sometext" for
        # compatibility with ifconfig.
        # 192.168.200.18 label eth0:1
    }
}

include /etc/keepalived/with_lvs.conf

■IPVS用の設定
 ※ここは2台とも同じでもよいし、IPの順序を反転してもよい。

$ cat /etc/keepalived/with_lvs.conf
virtual_server_group HTTP52 {
    192.168.164.16 80
}
virtual_server_group HTTP53 {
    192.168.164.17 80
}

virtual_server group HTTP52 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    # nat_mask 255.255.255.0
    #persistence_timeout 50
    protocol TCP
    sorry_server 192.168.164.1 80

    real_server 192.168.164.10 80 {
        weight 1
        inhibit_on_failure
        #TCP_CHECK {
        HTTP_GET {
            url {
                path /check.html
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.164.11 80 {
        weight 1
        inhibit_on_failure
        TCP_CHECK {
            connect_timeout 3
        }
    }
}
virtual_server group HTTP53 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    # nat_mask 255.255.255.0
    #persistence_timeout 50
    protocol TCP
    sorry_server 192.168.164.1 80

    real_server 192.168.164.11 80 {
        weight 1
        inhibit_on_failure
        #TCP_CHECK {
        HTTP_GET {
            url {
                path /check.html
                status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.164.10 80 {
        weight 1
        inhibit_on_failure
        TCP_CHECK {
            connect_timeout 3
        }
    }
}

■コンテンツの確認
 面倒なので、両方のVIPをワンライナーで交互にチェックします。

$ while true ;do \
    echo -n "$n,";echo "$n" | awk '{print "w3m -dump -no-proxy http://192.168.164."($n%2)+16}' | `xargs` | head -1; \
    let n++; \
    sleep 1; \
  done
,vmdebian1
1,vmdebian1
2,vmdebian2
3,vmdebian2
4,vmdebian1
5,vmdebian1
6,vmdebian2
7,vmdebian2
8,vmdebian1
9,vmdebian1
10,vmdebian2
^C

■apache2のログの抑制

$ sudo cp /var/www/index.html /var/www/check.html 
$ grep nolog /etc/apache2/sites-available/default || \
  sudo sed -i s/"CustomLog.*"/'SetEnvIf Request_URI "check.html" nolog'"\n\t& "'env=!nolog'/ \
  /etc/apache2/sites-available/default

$ sudo /etc/init.d/apache2 restart
[ ok ] Restarting web server: apache2 ... waiting .

■おおよそ順序よく分散されていることがわかる。

$ sudo ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.164.16:80                   3       15       15     1506     2170
  -> 192.168.164.10:80                   1        5        5      502      722
  -> 192.168.164.11:80                   2       10       10     1004     1448
TCP  192.168.164.17:80                   2       10       10     1004     1446
  -> 192.168.164.10:80                   1        5        5      502      722
  -> 192.168.164.11:80                   1        5        5      502      724

$ sudo ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.164.16:80                   2       10       10     1004     1446
  -> 192.168.164.10:80                   1        5        5      502      722
  -> 192.168.164.11:80                   1        5        5      502      724
TCP  192.168.164.17:80                   3       15       15     1506     2168
  -> 192.168.164.10:80                   2       10       10     1004     1444
  -> 192.168.164.11:80                   1        5        5      502      724

WheezyでPAMを使ってあるグループをパスワードなしでsudoする

■外出時にWheezyでPAMを使ってあるグループをパスワードなしでsudoする。
 普段はパスワードあり。
 パスワード入力を見られたくない場合に使用する。

■PAMのマニュアル

$ apropos ^pam_ | awk '{print $1}' | column
pam_access		pam_lastlog		pam_selinux
pam_ck_connector	pam_limits		pam_sepermit
pam_debug		pam_listfile		pam_shells
pam_deny		pam_localuser		pam_succeed_if
pam_echo		pam_loginuid		pam_tally
pam_env			pam_mail		pam_tally2
pam_env.conf		pam_mkhomedir		pam_time
pam_exec		pam_motd		pam_timestamp
pam_faildelay		pam_namespace		pam_timestamp_check
pam_filter		pam_nologin		pam_umask
pam_ftp			pam_permit		pam_unix
pam_getenv		pam_pwhistory		pam_userdb
pam_group		pam_rhosts		pam_warn
pam_issue		pam_rootok		pam_wheel
pam_keyinit		pam_securetty		pam_xauth

■PAMモジュールの場所

$ ls /lib/i386-linux-gnu/security/
pam_access.so        pam_group.so      pam_namespace.so  pam_succeed_if.so
pam_cap.so           pam_issue.so      pam_nologin.so    pam_tally.so
pam_ck_connector.so  pam_keyinit.so    pam_permit.so     pam_tally2.so
pam_debug.so         pam_lastlog.so    pam_pwhistory.so  pam_time.so
pam_deny.so          pam_limits.so     pam_rhosts.so     pam_timestamp.so
pam_echo.so          pam_listfile.so   pam_rootok.so     pam_umask.so
pam_env.so           pam_localuser.so  pam_securetty.so  pam_unix.so
pam_exec.so          pam_loginuid.so   pam_selinux.so    pam_userdb.so
pam_faildelay.so     pam_mail.so       pam_sepermit.so   pam_warn.so
pam_filter.so        pam_mkhomedir.so  pam_shells.so     pam_wheel.so
pam_ftp.so           pam_motd.so       pam_stress.so     pam_xauth.so

■簡単に説明。

typeについて

auth		ユーザ認証の設定
account		アカウントの制限、有効性のチェック
password	パスワード認証の設定
session		接続時の動作設定

controlについて

optional	ステータスを無視
required	失敗時はログインに失敗、処理は続行
requisite	失敗時は処理を終了
sufficient	成功時はアクセス許可

■今回は「type auth」で「control sufficient」で制御する。

■sudoersの確認。
 rootユーザかsudoグループが実行可能。
 ここでも「NOPASSWORD」で設定出来るが、ここでの変更はしない。

$ sudo grep -v "^#\|^\$" /etc/sudoers
Defaults	env_reset
Defaults	mail_badpass
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
root	ALL=(ALL:ALL) ALL
%sudo	ALL=(ALL:ALL) ALL

■include文の前に記述する。
 rootユーザか、かwheel(sudo)グループを信頼、パスワード不要とする。
 上記、sudoersに設定したユーザ以外は sudo の実行はsudoersで拒否する。
 debianの場合、「group=sudo」でwheelグループとしている。

$ cat /etc/pam.d/sudo 
#%PAM-1.0

auth sufficient pam_rootok.so
auth sufficient pam_wheel.so group=sudo trust use_uid

@include common-auth
@include common-account
@include common-session-noninteractive

■上記をtoggleで有効、無効に切り替える。
 ※上記を入力しなくても初回は無効の状態で設定される。

 Redhat用に/etc/redhat-releaseを見て、
 「group=sudo」の箇所を書き換える処理も分岐出来るが、
 変数を書き換えた方が早いので、今回はやらない。

$ cat nopass_sudo.sh 
#!/bin/bash

if [ `id -u` -ne "0" ];then
  echo "Sorry, Not Permit User!" >&2
  exit 1
fi

TARGET="/etc/pam.d/sudo"
ROOTOK='auth sufficient pam_rootok.so'
WHEELOK='auth sufficient pam_wheel.so group=sudo trust use_uid'

FLAG=1
grep "$ROOTOK" "$TARGET" > /dev/null && FLAG=0

if [ "$FLAG" -eq "1" ];then
  sed -i s/'#%PAM-1.0'/"&\n\n${ROOTOK}\n${WHEELOK}"/ "$TARGET"
fi

FLAG=1
grep "^$ROOTOK" "$TARGET" > /dev/null && FLAG=0

if [ "$FLAG" -eq "0" ];then
  sed -i s/"$ROOTOK"/"# &"/ "$TARGET" 
  sed -i s/"$WHEELOK"/"# &"/ "$TARGET"
else
  sed -i s/"# $ROOTOK"/"$ROOTOK"/ "$TARGET" 
  sed -i s/"# $WHEELOK"/"$WHEELOK"/ "$TARGET"
fi

grep "rootok\|wheel" "$TARGET"
unset TARGET ROOTOK WHEELOK FLAG

exit 0

■実行
 ※一度ログオフして再度入り直せば有効になる。

$ cat /etc/pam.d/sudo 
#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive

# sudo ./nopass_sudo.sh 
# auth sufficient pam_rootok.so
# auth sufficient pam_wheel.so group=sudo trust use_uid

# sudo ./nopass_sudo.sh 
auth sufficient pam_rootok.so
auth sufficient pam_wheel.so group=sudo trust use_uid

$ cat /etc/pam.d/sudo 
#%PAM-1.0

auth sufficient pam_rootok.so
auth sufficient pam_wheel.so group=sudo trust use_uid

@include common-auth
@include common-account
@include common-session-noninteractive

■確認方法は以下で十分。

$ sudo echo "hello"

■include文の前に記述しているので、「sudo」でなく、「labunix+sudo」グループなら、パスなしでOKにも出来る。
 「sudo」グループには所属しているけど、パス無しで使用させるほど信頼しているアカウントでなければ、
 分けることも出来るということ。

Wheezyにlibgraph-easy-perlを導入、ASCIIでネットワーク図を描く。

■はじめに。
 nwdiagやblockdiagでPNGやSVG出力出来るのは良いけど、
 そこまで必要ないときやむしろテキストオンリーで管理したいとき。。。

 chrootのwheezy/sidにnwdiagを導入する
 http://d.hatena.ne.jp/labunix/20130321

 nwdiagでネットワーク図を描いてみた。
 http://labunix.hateblo.jp/entry/20121104/1352031606

 blockdiagで遊ぶ
 http://labunix.hateblo.jp/entry/20130407/1365341897

 Wheezy/SqueezeでOpenVPNを使って暗号化なしのお手軽VPNで接続する
 http://labunix.hateblo.jp/entry/20130610/1370869975

■Wheezyにlibgraph-easy-perlを導入、ASCIIでネットワーク図を描く。

$ sudo apt-get install -y libgraph-easy-perl

■「ASCII」の出力サンプル。

$ man graph-easy | grep -A 13 ^EXAMPLES
EXAMPLES
   ASCII output
               echo "[ Bonn ] -- car --> [ Berlin ], [ Ulm ]" | graph-easy

               +--------+  car   +-----+
               |  Bonn  | -----> | Ulm |
               +--------+        +-----+
                 |
                 | car
                 v
               +--------+
               | Berlin |
               +--------+

■参考

 Graph::Easy - Manual - Introduction
 http://bloodgate.com/perl/graph/manual/index.html

■例えば前回のVRRPによる仮想IPのイメージ。
 Master/Backupのどちらかがレスポンスを返す。

 Wheezy/Squeezeにkeepalivedを導入、VRRPで仮想IPにアクセス。
 http://d.hatena.ne.jp/labunix/20130618

$ echo -e "\n\n";   echo "graph { flow: north; } [ Client] \
  <-- GET/Reponse --> [ Keepalived-vrrp VIP\n(ipvsadm) ] \
  <-- Master/Backup -->  [ vrrp100\n(Web2) ] , [ vrrp200\n(Web1) ]" | graph-easy



+---------------------+
|       vrrp100       |
|       (Web2)        |
+---------------------+
  ^
  |
  | Master/Backup
  v
+---------------------+                   +---------+
| Keepalived-vrrp VIP |  Master/Backup    | vrrp200 |
|      (ipvsadm)      | <---------------> | (Web1)  |
+---------------------+                   +---------+
  ^
  |
  | GET/Reponse
  v
+---------------------+
|       Client        |
+---------------------+


■LVSでは以下のようなイメージ。
 「LVS VIP」はサービスを提供する「仮想IP」なので、keepalivedを使わないIPでも良い。
 Web1とWeb2が順番にレスポンスを返す。

$ echo -e "\n\n";   echo "graph { flow: north; } [ Client] \
  <-- GET/Reponse --> [ LVS VIP\n(ipvsadm) ] \
  <-- rr --> [ Web2 ] , [ web1 ]" | graph-easy



+--------------+
|     Web2     |
+--------------+
  ^
  |
  | rr
  v
+--------------+        +------+
|   LVS VIP    |  rr    | web1 |
|  (ipvsadm)   | <----> |      |
+--------------+        +------+
  ^
  |
  | GET/Reponse
  v
+--------------+
|    Client    |
+--------------+

■VRRP+LVSのイメージ。
 Master/BackupのどちらかのVIPで受けて、順番にレスポンスを返す。

$ echo -e "\n\n";   echo "graph { flow: south; } [ Client ] <-- GET/Response --> \
 { flow: north; } [ VRRP+LVS ] <-- or/rr --> [ vrrp100 ] , [ vrrp200 ]" | graph-easy



+---------+  or/rr    +---------------+  or/rr    +---------+
| vrrp200 | <-------> |   VRRP+LVS    | <-------> | vrrp100 |
+---------+           +---------------+           +---------+
                        ^
                        |
                        | GET/Response
                        v
                      +---------------+
                      |    Client     |
                      +---------------+

Wheezy/Squeezeにkeepalivedを導入、VRRPで仮想IPにアクセス。

■Wheezy/Squeezeにkeepalivedを導入、VRRPで仮想IPにアクセス。
 ※Wheezy/Squeeze共に手順に差は無い。

$ apt-cache search vrrp
keepalived - Failover and monitoring daemon for LVS clusters
ucarp - user-space replacement to VRRP -- automatic IP fail-over
vrrpd - Virtual Router Redundancy Protocol user-space implementation

$ sudo apt-get install -y keepalived

■シンプルに設定します。

$ dpkg -L keepalived | grep "samples/.*.vrrp"
/usr/share/doc/keepalived/samples/keepalived.conf.vrrp.sync
/usr/share/doc/keepalived/samples/keepalived.conf.vrrp.scripts
/usr/share/doc/keepalived/samples/keepalived.conf.vrrp
/usr/share/doc/keepalived/samples/keepalived.conf.vrrp.routes
/usr/share/doc/keepalived/samples/keepalived.conf.vrrp.static_ipaddress
/usr/share/doc/keepalived/samples/keepalived.conf.vrrp.lvs_syncd
/usr/share/doc/keepalived/samples/keepalived.conf.vrrp.localcheck

$ cat /usr/share/doc/keepalived/samples/keepalived.conf.vrrp | \
  sudo tee /etc/keepalived/keepalived.conf > /dev/null

■まずはメール通知を編集。

$ grep -B 1 -A 2 "acassen" /etc/keepalived/keepalived.conf
   notification_email {
     acassen
   }
   notification_email_from Alexandre.Cassen@firewall.loc

■送信先を「acassen」から自身の通知先メールアドレスに変更。

$ sudo sed -i s/"acassen"/"root@`hostname -f`"/g /etc/keepalived/keepalived.conf

■送信元は役割+優先度のダミーアカウントとします。

$ sudo sed -i s/"Alexandre.Cassen@firewall.loc"/"vrrp100@`hostname -f`"/g /etc/keepalived/keepalived.conf

■次はSMTPトラップを編集。

$ grep -A 4 smtp_server /etc/keepalived/keepalived.conf
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

■SMTPサーバを指定

$ sudo sed -i s/"\(smtp_server\) .*"/"\1 192.168.45.11"/ /etc/keepalived/keepalived.conf

■ルータIDのホスト名はコメントアウトし、SMTPトラップを有効にします。
 ※メール通知のSubject欄のホスト名に反映される。
  実マシンのホスト名が同じ2台構成の場合は「router_id」を設定した方が良い。

$ man keepalived.conf | grep -A 1 "^ *router_id"
        router_id my_hostname   # string identifying the machine,
                                # (doesn't have to be hostname).

$ sudo sed -i s/"router_id LVS_DEVEL"/"# &\n   enable_traps"/ /etc/keepalived/keepalived.conf

■ここまでで一旦、ベースとします。

$ sudo mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.base

■VIはひとつだけでよいので、2番目以降は削除。

$ nl -ba /etc/keepalived/keepalived.conf.base | \
  grep "vrrp_instance VI_2" | \
  awk '{print $1-1}' | \
  head -n `xargs` /etc/keepalived/keepalived.conf.base | \
  sudo tee /etc/keepalived/keepalived.conf > /dev/null

■仮想IPを決めます。

$ grep -A 8 virtual_ipaddress /etc/keepalived/keepalived.conf
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18

        # optional label. should be of the form "realdev:sometext" for
        # compatibility with ifconfig.
        192.168.200.18 label eth0:1
    }

■ラベルをコメントアウト

$ sudo sed -i s/"192.168.200.18 label eth0:1"/"# &"/ /etc/keepalived/keepalived.conf

■初期で振っているIPをコメントアウト。
 ※「ip addr」コマンドでなく「ifconfig」での閲覧を望むなら、設定しましょう。

$ sudo sed -i s/"\(        \)\(192.168.200.1[678]\)"/"\1# \2"/ /etc/keepalived/keepalived.conf

$ ip addr | grep 16/32
    inet 192.168.45.16/32 scope global eth1

■仮想IPを振る。

$ sudo sed -i s/"virtual_ipaddress {"/"&\n        192.168.45.16"/ /etc/keepalived/keepalived.conf

■「interface eth0」を「eth1」に変更します。

$ grep -A 11 vrrp_instance /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

$ sudo sed -i s/"interface eth0"/"interface eth1"/ /etc/keepalived/keepalived.conf

■私の場合、「state MASTER」では無く、
 両方とも「state BACKUP」にし、優先度で制御しています。

$ sudo sed -i s/"state MASTER"/"state BACKUP"/ /etc/keepalived/keepalived.conf

■スレーブ側は以下のようになります。

$ cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     root@vmdebian-slave.myhome.local
   }
   notification_email_from vrrp100@vmdebian-slave.myhome.local
   smtp_server 192.168.45.11
   smtp_connect_timeout 30
   #router_id LVS_DEVEL
   enable_traps
}


vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    garp_master_delay 10
    smtp_alert
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.45.16
        # 192.168.200.16
        # 192.168.200.17
        # 192.168.200.18

        # optional label. should be of the form "realdev:sometext" for
        # compatibility with ifconfig.
        # 192.168.200.18 label eth0:1
    }
}

■これをマスター側にコピーして優先度を高くし、メールのfromも変更します。
 ※優先度は0255まで。

$ sudo sed -i s/"priority 100"/"priority 200"/ /etc/keepalived/keepalived.conf
$ sudo sed -i s/"vrrp100"/"vrrp200"/ /etc/keepalived/keepalived.conf

■まずはマスター側を起動
 ※keepalived単独で使う間、
  「IPVS: Can’t initialize ipvs: Protocol not available」が気になるなら、
  「dpkg-reconfigure ipvsadm」で無効にしても良い。

$ sudo /etc/init.d/keepalived start

$ sudo tail -100 /var/log/syslog | grep -i "vrrp\|keepalived"
Jun 18 19:46:33 vmdebian-master Keepalived: Starting Keepalived v1.1.20 (03/24,2012)
Jun 18 19:46:33 vmdebian-master Keepalived: Starting Healthcheck child process, pid=2917
Jun 18 19:46:33 vmdebian-master Keepalived: Starting VRRP child process, pid=2918
Jun 18 19:46:33 vmdebian-master Keepalived_vrrp: Registering Kernel netlink reflector
Jun 18 19:46:33 vmdebian-master Keepalived_vrrp: Registering Kernel netlink command channel
Jun 18 19:46:33 vmdebian-master Keepalived_vrrp: Registering gratutious ARP shared channel
Jun 18 19:46:33 vmdebian-master Keepalived_vrrp: Initializing ipvs 2.6
Jun 18 19:46:33 vmdebian-master Keepalived_healthcheckers: Initializing ipvs 2.6
Jun 18 19:46:33 vmdebian-master Keepalived_vrrp: IPVS: Can't initialize ipvs: Protocol not available
Jun 18 19:46:33 vmdebian-master Keepalived_healthcheckers: IPVS: Can't initialize ipvs: Protocol not available
Jun 18 19:46:33 vmdebian-master Keepalived_healthcheckers: Registering Kernel netlink reflector
Jun 18 19:46:33 vmdebian-master Keepalived_healthcheckers: Registering Kernel netlink command channel
Jun 18 19:46:33 vmdebian-master Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.
Jun 18 19:46:33 vmdebian-master Keepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'.
Jun 18 19:46:33 vmdebian-master Keepalived_vrrp: Configuration is using : 62958 Bytes
Jun 18 19:46:33 vmdebian-master Keepalived_vrrp: Using LinkWatch kernel netlink reflector...
Jun 18 19:46:33 vmdebian-master Keepalived_healthcheckers: Configuration is using : 7447 Bytes
Jun 18 19:46:33 vmdebian-master Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
Jun 18 19:46:33 vmdebian-master Keepalived_vrrp: Remote SMTP server [192.168.45.11:25] connected.
Jun 18 19:46:33 vmdebian-master Keepalived_healthcheckers: Using LinkWatch kernel netlink reflector...
Jun 18 19:46:33 vmdebian-master Keepalived_vrrp: SMTP alert successfully sent.
Jun 18 19:46:36 vmdebian-master Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Jun 18 19:46:37 vmdebian-master Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Jun 18 19:46:37 vmdebian-master Keepalived_vrrp: Remote SMTP server [192.168.45.11:25] connected.
Jun 18 19:46:37 vmdebian-master Keepalived_vrrp: SMTP alert successfully sent.

■2つの「SMTP alert successfully sent.」に応じた2つのメールが来る。

From: vrrp200@vmdebian-slave.example.jp
Subject: [vmdebian-master.example.jp] VRRP Instance VI_1 - Entering BACKUP state
X-Mailer: Keepalived

=> VRRP Instance is nolonger owning VRRP VIPs <=
From: vrrp200@vmdebian-slave.example.jp
Subject: [vmdebian-master.example.jp VRRP Instance VI_1 - Entering MASTER state
X-Mailer: Keepalived

=> VRRP Instance is now owning VRRP VIPs <=

■スレーブ側を起動

$ sudo /etc/init.d/keepalived start

$ sudo tail -100 /var/log/syslog | grep -i "vrrp\|keepalived"
Jun 18 19:49:39 vmdebian-slave Keepalived: Starting Keepalived v1.1.20 (03/24,2012)
Jun 18 19:49:39 vmdebian-slave Keepalived: Starting Healthcheck child process, pid=5138
Jun 18 19:49:39 vmdebian-slave Keepalived: Starting VRRP child process, pid=5140
Jun 18 19:49:39 vmdebian-slave Keepalived_healthcheckers: Initializing ipvs 2.6
Jun 18 19:49:39 vmdebian-slave Keepalived_vrrp: Registering Kernel netlink reflector
Jun 18 19:49:39 vmdebian-slave Keepalived_vrrp: Registering Kernel netlink command channel
Jun 18 19:49:39 vmdebian-slave Keepalived_vrrp: Registering gratutious ARP shared channel
Jun 18 19:49:39 vmdebian-slave Keepalived_vrrp: Initializing ipvs 2.6
Jun 18 19:49:39 vmdebian-slave Keepalived_healthcheckers: IPVS: Can't initialize ipvs: Protocol not available
Jun 18 19:49:39 vmdebian-slave Keepalived_healthcheckers: Registering Kernel netlink reflector
Jun 18 19:49:39 vmdebian-slave Keepalived_healthcheckers: Registering Kernel netlink command channel
Jun 18 19:49:39 vmdebian-slave Keepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'.
Jun 18 19:49:39 vmdebian-slave Keepalived_vrrp: IPVS: Can't initialize ipvs: Protocol not available
Jun 18 19:49:39 vmdebian-slave Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.
Jun 18 19:49:39 vmdebian-slave Keepalived_healthcheckers: Configuration is using : 7247 Bytes
Jun 18 19:49:39 vmdebian-slave Keepalived_vrrp: Configuration is using : 62758 Bytes
Jun 18 19:49:39 vmdebian-slave Keepalived_healthcheckers: Using LinkWatch kernel netlink reflector...
Jun 18 19:49:39 vmdebian-slave Keepalived_vrrp: Using LinkWatch kernel netlink reflector...
Jun 18 19:49:39 vmdebian-slave Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
Jun 18 19:49:39 vmdebian-slave Keepalived_vrrp: Remote SMTP server [192.168.45.11:25] connected.
Jun 18 19:49:39 ibm-amddebian Keepalived_vrrp: SMTP alert successfully sent.

■メール通知のログは1つなので、1件のメールが確認できる。

From: vrrp100@vmdebian-slave.example.jp
Subject: [vmdebian-slave.example.jp] VRRP Instance VI_1 - Entering BACKUP state

X-Mailer: Keepalived
To: undisclosed-recipients:;

=> VRRP Instance is nolonger owning VRRP VIPs <=

■パケットキャプチャ
 切り替わると、「prio 100」になる。GARPはWindowsが居ないネットワークセグメントである方がベター。

$ sudo tcpdump -n -i eth1 host 192.168.45.16 or vrrp or arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
20:03:09.956098 IP 192.168.45.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 200, authtype simple, intvl 1s, length 20

$ sudo tcpdump -n -i eth1 host 192.168.45.16 or vrrp or arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
20:03:09.956098 IP 192.168.45.11 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 200, authtype simple, intvl 1s, length 20

■pingを打つなどしてARP情報を更新しながら、MACアドレスが変わることを確認。
 マスター側のMACを優先的に使用していることが分かる。
 ※keepalivedのVRRPの実装は仮想MACアドレスには対応していないため。

$ sudo arp -an | grep .16\)
? (192.168.45.16) at XX:XX:XX:XX:XX:df [ether] on eth1

$ sudo /etc/init.d/keepalived stop
Stopping keepalived: keepalived.

$ sudo arp -an | grep .16\)
? (192.168.45.16) at XX:XX:XX:XX:XX:ca [ether] on eth1

$ sudo /etc/init.d/keepalived start
Stopping keepalived: keepalived.

$ sudo arp -an | grep .16\)
? (192.168.45.16) at XX:XX:XX:XX:XX:df [ether] on eth1

■後はデフォルトの「auth_pass 1111」を変更し、余計なVRRPが参加しないようにする。

WheezyにVLANを導入する

■WheezyにVLANを導入する。
 eth0、wlan0のActive-Backup方式のbond0にタグVLANを作成。

 eth0+wlan0でActive-Backupのbondingを構成する。
 http://d.hatena.ne.jp/labunix/20130303

 squeezeにvconfigを導入する
 http://d.hatena.ne.jp/labunix/20121003

■kernelオプションの確認。

$ sudo apt-get install kernel-package
$ grep VLAN /usr/share/kernel-package/Config/config.`uname -m`
CONFIG_VLAN_8021Q=m

■「vlan」の導入。
 モジュールのロードは不要になった。

$ apt-cache search ^vlan
vlan - user mode programs to enable VLANs on your ethernet devices
$ sudo apt-get install -y vlan
$ dpkg -L vlan | grep bin/
/sbin/vconfig


$ sudo modprobe 8021q
$ lsmod | grep 8021q
8021q                  14118  0
garp                    4150  1 8021q

$ grep 8021q /etc/modules >/dev/null|| echo "8021q" | sudo tee -a /etc/modules
8021q

■手動追加、確認、手動削除。

$ sudo vconfig add bond0 2
Added VLAN with VID == 2 to IF -:bond0:-

$  find /proc/net/vlan/ -type f -print | sudo grep . `xargs`
/proc/net/vlan/bond0.2:bond0.2  VID: 2   REORDER_HDR: 1  dev->priv_flags: 1
/proc/net/vlan/bond0.2:         total frames received            0
/proc/net/vlan/bond0.2:          total bytes received            0
/proc/net/vlan/bond0.2:      Broadcast/Multicast Rcvd            0
/proc/net/vlan/bond0.2:      total frames transmitted            0
/proc/net/vlan/bond0.2:       total bytes transmitted            0
/proc/net/vlan/bond0.2:            total headroom inc            0
/proc/net/vlan/bond0.2:           total encap on xmit            0
/proc/net/vlan/bond0.2:Device: bond0
/proc/net/vlan/bond0.2:INGRESS priority mappings: 0:0  1:0  2:0  3:0  4:0  5:0  6:0 7:0
/proc/net/vlan/bond0.2: EGRESS priority mappings:
/proc/net/vlan/config:VLAN Dev name      | VLAN ID
/proc/net/vlan/config:Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
/proc/net/vlan/config:bond0.2        | 2  | bond0

■ネットワークの設定

$  sudo vconfig rem bond0.2
Removed VLAN -:bond0.2:-

$ sudo tail -7 /etc/network/interfaces
auto bond0.2
allow-hotplug bond0.2
iface bond0.2 inet static
address XXX.XXX.XXX.111
netmask 255.255.255.0
down /sbin/vconfig rem bond0.2

$ sudo /etc/init.d/networking restart

$ env LANG=C /sbin/ifconfig bond0.2 | sed s/"\(HWaddr\).*"/"\1 dummy"/g | grep -v inet6
bond0.2   Link encap:Ethernet  HWaddr dummy
          inet addr:XXX.XXX.XXX.XXX.111  Bcast:XXX.XXX.XXX.XXX.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:6445 (6.2 KiB)

$ ip addr | grep bond0.2
10: bond0.2@bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    inet XXX.XXX.XXX.111/24 brd XXX.XXX.XXX.255 scope global bond0.2

WheezyにRCSを導入する

■debian WheezyにRCSを導入する。

$ sudo apt-get install -y rcs
$ dpkg -L rcs | grep bin/
/usr/bin/merge
/usr/bin/rcs
/usr/bin/co
/usr/bin/ident
/usr/bin/rcsmerge
/usr/bin/ci
/usr/bin/rcsdiff
/usr/bin/rlog
/usr/bin/rcsclean

■hostsを「~/dummy/etc」にコピーしてそこで作業する。

$ sudo mkdir -p ~/dummy/etc
$ sudo cp -pi /etc/hosts ~/dummy/etc
$ test -d ~/dummy/etc && cd ~/dummy/etc
$ pwd
/home/labunix/dummy/etc
$ ls -l hosts
-rw-r--r-- 1 root root 206  59 22:32 hosts

$ sudo sed -i s/"`hostname -s`\$"/"dummy"/g hosts
$ sudo sed -i s/"`hostname -f`"/"dummy.example.jp"/g hosts

$ cat hosts
127.0.0.1       localhost
127.0.1.1       dummy.example.jp        dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

■RCSの初期化

$ test -d RCS || mkdir RCS
$ rcs -i hosts
rcs: hosts,v: Permission denied

$ sudo rcs -i hosts
RCS file: hosts,v
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>> Hello RCS
>>
>> .
done

■ロックとアンロック
 「strict」は厳格モード。

 厳格モードとは、RCS ファイルの所有者であっても、
 ロックしているファイルをチェックインすることができなるモードのこと。

$ sudo rcs -L hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks: strict

$ sudo rcs -U hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks:

■チェックインとチェックアウト
 ※チェックインはロックされている状態で行う。

$ sudo ci hosts;ls -l hosts
hosts,v  <--  hosts
initial revision: 1.1
done
ls: hosts にアクセスできません: そのようなファイルやディレクトリはありません

$ sudo co hosts;ls -l hosts
hosts,v  -->  hosts
revision 1.1
done
-r--r--r-- 1 root root 202  64 21:15 hosts

■ログの確認

$ sudo rlog ./hosts

RCS file: ./hosts,v
Working file: ./hosts
head: 1.1
branch:
locks:
access list:
symbolic names:
keyword substitution: kv
total revisions: 1;     selected revisions: 1
description:
Hello RCS
----------------------------
revision 1.1
date: 2013/06/04 13:02:54;  author: root;  state: Exp;
Initial revision
=============================================================================

■使用可能な「ident」の確認

$ man ident 2>/dev/null | grep "^       \$[A-Z][a-z].*\$"
       $Author$
       $Date$ そのリビジョンをチェックインした日付と時刻です。
       $Header$
       $Id$   RCS ファイルの名前がフルパスでないことを除いて、 $Header$,  と同
       $Locker$
       $Log$  チェックインのときに書かれたログメッセージです。 ident  の目的と
       $Name$ リビジョンをチェックアウトするときに使うシンボル名です(ないかも
       $Revision$
       $Source$
       $State$

■編集時にはアンロックされていること。

$ sudo rcs -U hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks:

$ sudo sed -i s/"^127.0.0.1"/'# $Id$'"\n"'# $Author$'"\n"'# $Log$'"\
"'# $Date$ '"\n"'# $Header$'"\n"'# $Locker$'"\n"'# $RCSfile$'"\n"'# $Revision$'"\n"'# $Source$'"\n"'# $State$'"\n&"/ hosts

$ cat hosts
# $Id$
# $Author$
# $Log$
# $Date$
# $Header$
# $Locker$
# $RCSfile$
# $Revision$
# $Source$
# $State$
127.0.0.1       localhost
127.0.1.1       dummy.example.jp        dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
■チェックインして更新、チェックアウトしてファイルに書き出す必要がある。
 書き出した後は保護する為、ロックする。

$ rlog hosts | grep lock
locks:
$ sudo ci hosts
hosts,v  <--  hosts
new revision: 1.2; previous revision: 1.1
enter log message, terminated with single '.' or end of file:
>> Add ident options.
>>
>> .
done

$ sudo co hosts
hosts,v  -->  hosts
revision 1.2
done

$ sudo rcs -L hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks: strict

■以下のように書き変わる。
 下に見るとおり、「$Id$」か「$Log$」があれば充分。

$ cat hosts
# $Id: hosts,v 1.2 2013/06/04 13:04:48 root Exp $
# $Author: root $
# $Log: hosts,v $
# Revision 1.2  2013/06/04 13:04:48  root
# Add ident options.
## $Date: 2013/06/04 13:04:48 $
# $Header: /home/labunix/dummy/etc/hosts,v 1.2 2013/06/04 13:04:48 root Exp $
# $Locker:  $
# $RCSfile: hosts,v $
# $Revision: 1.2 $
# $Source: /home/labunix/dummy/etc/hosts,v $
# $State: Exp $
127.0.0.1       localhost
127.0.1.1       dummy.example.jp    dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

■差分を確認。

$ sudo rcsdiff -r1.1 -r1.2 hosts
===================================================================
RCS file: hosts,v
retrieving revision 1.1
retrieving revision 1.2
diff -r1.1 -r1.2
0a1,12
> # $Id: hosts,v 1.2 2013/06/04 13:04:48 root Exp $
> # $Author: root $
> # $Log: hosts,v $
> # Revision 1.2  2013/06/04 13:04:48  root
> # Add ident options.
> ## $Date: 2013/06/04 13:04:48 $
> # $Header: /home/labunix/dummy/etc/hosts,v 1.2 2013/06/04 13:04:48 root Exp $
> # $Locker:  $
> # $RCSfile: hosts,v $
> # $Revision: 1.2 $
> # $Source: /home/labunix/dummy/etc/hosts,v $
> # $State: Exp $

■diffらしく表示するならば。。。
 「-u」はアンロックではなく、diffのオプション。

$ sudo rcsdiff -r1.1 -r1.2 -u hosts
===================================================================
RCS file: hosts,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- hosts       2013/06/04 13:02:54     1.1
+++ hosts       2013/06/04 13:04:48     1.2
@@ -1,3 +1,15 @@
+# $Id: hosts,v 1.2 2013/06/04 13:04:48 root Exp $
+# $Author: root $
+# $Log: hosts,v $
+# Revision 1.2  2013/06/04 13:04:48  root
+# Add ident options.
+## $Date: 2013/06/04 13:04:48 $
+# $Header: /home/labunix/dummy/etc/hosts,v 1.2 2013/06/04 13:04:48 root Exp $
+# $Locker:  $
+# $RCSfile: hosts,v $
+# $Revision: 1.2 $
+# $Source: /home/labunix/dummy/etc/hosts,v $
+# $State: Exp $
 127.0.0.1      localhost
 127.0.1.1      dummy.example.jp    dummy

■ということでここでは「$Log$」を採用する。

$ sudo rcs -U hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks:

$ sudo vim hosts
$ cat hosts
# $Log$
127.0.0.1       localhost
127.0.1.1       dummy.example.jp        dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

$ sudo ci hosts
hosts,v  <--  hosts
new revision: 1.3; previous revision: 1.2
enter log message, terminated with single '.' or end of file:
>> Change Ident Log Only.
>>
>> .
done

$ ls
hosts,v

$ sudo co hosts
hosts,v  -->  hosts
revision 1.3
writable hosts exists; remove it? [ny](n): y
done

$ ls
hosts  hosts,v

$ sudo rcs -L hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks: strict


■1.1と1.3の差分を表示

$ sudo rcsdiff -r1.1 -r1.3 hosts
===================================================================
RCS file: hosts,v
retrieving revision 1.1
retrieving revision 1.3
diff -r1.1 -r1.3
0a1,4
> # $Log: hosts,v $
> # Revision 1.3  2013/06/04 13:08:03  root
> # Change Ident Log Only.
> #

■1.2は不要になった。

$ sudo rcs -U hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks:

$ sudo rcs -o1.2 hosts
RCS file: hosts,v
deleting revision 1.2
done

$ sudo rcs -L hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks: strict

■1.2の変更情報が消えた。

$ sudo rlog hosts

RCS file: hosts,v
Working file: hosts
head: 1.3
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 2;     selected revisions: 2
description:
Hello RCS
----------------------------
revision 1.3
date: 2013/06/04 13:08:03;  author: root;  state: Exp;  lines: +1 -0
Change Ident Log Only.
----------------------------
revision 1.1
date: 2013/06/04 13:02:54;  author: root;  state: Exp;
Initial revision
=============================================================================

■誰がロックしているか見るには「grep lock」で良い。
 また、ロック中は所有者も変更不可なので、変更は失敗する。
 
$ sudo rlog hosts | grep lock
locks: strict

$ sudo rcs -o1.3 hosts
RCS file: hosts,v
rcs: hosts,v: can’t remove locked revision 1.3

■やっぱり、一行で済む「$Id$」にしよう。

$ sudo rcs -U hosts;sudo rlog hosts | grep locks
RCS file: hosts,v
done
locks:

$ sudo vim hosts
$ cat hosts
# $Id$
127.0.0.1       localhost
127.0.1.1       dummy.example.jp    dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

$ sudo ci hosts
hosts,v  <--  hosts
new revision: 1.4; previous revision: 1.3
enter log message, terminated with single '.' or end of file:
>> Change indent Log to Id.
>> .
done

$ sudo co hosts
hosts,v  -->  hosts
revision 1.4
done

$ cat hosts
# $Id: hosts,v 1.4 2013/06/04 13:12:05 root Exp $
127.0.0.1       localhost
127.0.1.1       dummy.example.jp    dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

■マージする。

$ sudo rcsmerge -r1.1 -r1.4 hosts
RCS file: hosts,v
retrieving revision 1.1
retrieving revision 1.4
Merging differences between 1.1 and 1.4 into hosts

$ rlog hosts

RCS file: hosts,v
Working file: hosts
head: 1.4
branch:
locks:
access list:
symbolic names:
keyword substitution: kv
total revisions: 3;     selected revisions: 3
description:
Hello RCS
----------------------------
revision 1.4
date: 2013/06/04 13:12:05;  author: root;  state: Exp;  lines: +1 -1
Change indent Log to Id.
----------------------------
revision 1.3
date: 2013/06/04 13:08:03;  author: root;  state: Exp;  lines: +1 -0
Change Ident Log Only.
----------------------------
revision 1.1
date: 2013/06/04 13:02:54;  author: root;  state: Exp;
Initial revision
=============================================================================

$ sudo rcs -o1.1 hosts
RCS file: hosts,v
deleting revision 1.1
done
$ sudo rcs -o1.3 hosts
RCS file: hosts,v
deleting revision 1.3
done

■間違えた。

$ sudo ci -s1.0 hosts
hosts,v  <--  hosts
new revision: 1.5; previous revision: 1.4
enter log message, terminated with single '.' or end of file:
>> 1.0 release.
>>
>> .
done

$ sudo co hosts
hosts,v  -->  hosts
revision 1.5
done

$ cat hosts
# $Id: hosts,v 1.5 2013/06/04 13:20:48 root 1.0 $
127.0.0.1       localhost
127.0.1.1       dummy.example.jp    dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

$ sudo co -r1.4 hosts
hosts,v  -->  hosts
revision 1.4
writable hosts exists; remove it? [ny](n): y
done

$ cat hosts
# $Id: hosts,v 1.4 2013/06/04 13:12:05 root Exp $
127.0.0.1       localhost
127.0.1.1       dummy.example.jp    dummy

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

$ sudo rcs -o1.5 hosts
RCS file: hosts,v
deleting revision 1.5
done

■強制的に「1.0」にして、「Rel」する。
 ※複数人でやると大変なことになるのでローカルのみ。

$ sudo sed -i s/"1.4"/"0.0"/g hosts,v
$ rlog hosts

RCS file: hosts,v
Working file: hosts
head: 0.0
branch:
locks:
access list:
symbolic names:
keyword substitution: kv
total revisions: 1;     selected revisions: 1
description:
Hello RCS
----------------------------
revision 0.0
date: 2013/06/04 13:12:05;  author: root;  state: Exp;
Change indent Log to Id.
=============================================================================

$ sudo ci -srel -r1.0 hosts
hosts,v  <--  hosts
new revision: 1.0; previous revision: 0.0
enter log message, terminated with single '.' or end of file:
>> 1st release.
>> .
done

$ sudo co hosts
hosts,v  -->  hosts
revision 1.0
done

$ sudo rcs -o0.0 hosts
RCS file: hosts,v
deleting revision 0.0
done

$ cat hosts
# $Id: hosts,v 1.0 2013/06/04 13:32:29 root rel $
127.0.0.1       localhost
127.0.1.1       lpic303.test.local      lpic303

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

$ sudo rlog hosts

RCS file: hosts,v
Working file: hosts
head: 1.0
branch:
locks:
access list:
symbolic names:
keyword substitution: kv
total revisions: 1;     selected revisions: 1
description:
Hello RCS
----------------------------
revision 1.0
date: 2013/06/04 13:32:29;  author: root;  state: rel;
1st release.
=============================================================================


$ sudo rcs -L ./hosts
RCS file: ./hosts,v
done

$ sudo rlog ./hosts

RCS file: ./hosts,v
Working file: ./hosts
head: 1.0
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 1;     selected revisions: 1
description:
Hello RCS
----------------------------
revision 1.0
date: 2013/06/04 13:32:29;  author: root;  state: rel;
1st release.
============================================================================

cryptmountパーティション内にACLを設定する

■cryptmountパーティション内にACLを設定する。

 debian Wheezyにdm_cryptを導入
 http://d.hatena.ne.jp/labunix/20130516

 cryptsetupの暗号化方式について
 http://d.hatena.ne.jp/labunix/20130526

■まずは暗号化デバイスを開く

$ sudo cryptsetup luksOpen luks.img luks
Enter passphrase for /home/labunix/luks.img:

■実態は「/dev/dm-0」となる。

$ ls -l /dev/mapper/luks
lrwxrwxrwx 1 root root 7  529 08:55 /dev/mapper/luks -> ../dm-0

$ test -d /media/luksfs || sudo mkdir /media/luksfs
$ sudo mount /dev/dm-0 /media/luksfs

■ext2だが、ACLオプション付でマウントされている。

$ mount | grep luks
/dev/mapper/luks on /media/luksfs type ext2 (rw,relatime,errors=continue,user_xattr,acl)

■ユーザ用のディレクトリを準備

$ sudo mkdir /media/luksfs/`whoami`
$ sudo chown labunix:labunix /media/luksfs/`whoami`
$ ls -ld /media/luksfs/labunix/
drwxr-xr-x 2 labunix labunix 1024  529 09:00 /media/luksfs/labunix/

■デフォルトのACL情報を確認

$ getfacl /media/luksfs/labunix/
getfacl: Removing leading '/' from absolute path names
# file: media/luksfs/labunix/
# owner: labunix
# group: labunix
user::rwx
group::r-x
other::r-x

■まずはテストして、ユーザを追加。

$ setfacl --test -m user:labunix:rwx /media/luksfs/labunix/
/media/luksfs/labunix/: u::rwx,u:labunix:rwx,g::r-x,m::rwx,o::r-x,*

$ setfacl -m user:labunix:rwx /media/luksfs/labunix/
$ getfacl /media/luksfs/labunix/

■ユーザのアクセス権が追加された。

$ getfacl: Removing leading '/' from absolute path names
# file: media/luksfs/labunix/
# owner: labunix
# group: labunix
user::rwx
user:labunix:rwx
group::r-x
mask::rwx
other::r-x

■グループとその他の権限を削除

$ setfacl --test -m group::- /media/luksfs/labunix/
/media/luksfs/labunix/: u::rwx,u:labunix:rwx,g::---,m::rwx,o::r-x,*

$ setfacl -m group::- /media/luksfs/labunix/
$ setfacl -m other::- /media/luksfs/labunix/

■グループのアクセス権はなくなった。

$ getfacl /media/luksfs/labunix/
getfacl: Removing leading '/' from absolute path names
# file: media/luksfs/labunix/
# owner: labunix
# group: labunix
user::rwx
user:labunix:rwx
group::---
mask::rwx
other::---

■ディレクトリを作成。継承はされていない。

$ mkdir /media/luksfs/labunix/Hello
$ getfacl /media/luksfs/labunix/Hello/
getfacl: Removing leading '/' from absolute path names
# file: media/luksfs/labunix/Hello/
# owner: labunix
# group: labunix
user::rwx
group::r-x
other::r-x

■再帰的に変更するには「-R」オプションをつける。

$ setfacl --test -R -m user:labunix:rwx /media/luksfs/labunix/
/media/luksfs/labunix/: *,*
/media/luksfs/labunix//Hello: u::rwx,u:labunix:rwx,g::r-x,m::rwx,o::r-x,*

$ setfacl -R -m group::- /media/luksfs/labunix/
$ setfacl -R -m other::- /media/luksfs/labunix/

$ getfacl /media/luksfs/labunix/Hello/
getfacl: Removing leading '/' from absolute path names
# file: media/luksfs/labunix/Hello/
# owner: labunix
# group: labunix
user::rwx
user:labunix:rwx
group::---
mask::rwx
other::---

■他のユーザでは閲覧出来る。
 通常のグループやその他ユーザが許可されている箇所は出来ない。

$ ls -ld /media/luksfs/labunix/
drwxrwx---+ 3 labunix labunix 1024  529 09:11 /media/luksfs/labunix/

$ sudo -u toor ls /media/luksfs/labunix/
ls: ディレクトリ /media/luksfs/labunix/ を開くことが出来ません: 許可がありません

$ sudo -u toor ls -ld ~/
drwxr-xr-x 12 labunix labunix 4096  528 22:28 /home/labunix/

■ACLオプションをつけずに再マウント

$ sudo umount /media/luksfs
$ sudo mount -o rw,noacl /dev/dm-0 /media/luksfs/
$ mount | grep luks
/dev/mapper/luks on /media/luksfs type ext2 (rw,relatime,errors=continue,user_xattr,noacl)

■ユーザアクセス制御は正しく動作している。

$ ls -l /media/luksfs/labunix/
合計 2
drwxrwx--- 3 labunix labunix 1024  529 09:18 Hello
$ ls -l /media/luksfs/labunix/Hello/
合計 2
drwxr-xr-x 2 labunix labunix 1024  529 09:18 World

$ sudo -u toor ls -l /media/luksfs/labunix/
ls: ディレクトリ /media/luksfs/labunix/ を開くことが出来ません: 許可がありません
$ sudo -u toor ls -l /media/luksfs/labunix/Hello/
ls: /media/luksfs/labunix/Hello/ にアクセスできません: 許可がありません

$ setfacl -m user:toor:r /media/luksfs/labunix/
setfacl: /media/luksfs/labunix/: サポートされていない操作です
$ env LANG=C setfacl -m user:toor:r /media/luksfs/labunix/
setfacl: /media/luksfs/labunix/: Operation not supported

■ACLオプション付きでマウントしなおす。

$ sudo umount /media/luksfs
$ sudo mount /dev/dm-0 /media/luksfs/
$ mount | grep luks
/dev/mapper/luks on /media/luksfs type ext2 (rw,relatime,errors=continue,user_xattr,acl)

■今度は正しく設定出来た。

$ env LANG=C setfacl -m user:toor:r /media/luksfs/labunix/
$ getfacl /media/luksfs/labunix/
getfacl: Removing leading '/' from absolute path names
# file: media/luksfs/labunix/
# owner: labunix
# group: labunix
user::rwx
user:labunix:rwx
user:toor:r--
group::---
mask::rwx
other::---