teketeke_55の日記

技術メモとか

btrfs使ってるfedoraが起動失敗

fedora19でrootボリュームにbtrfsを使っているのだが、電源が落ちて強制終了後にOS起動が失敗するようになった。

レスキューモードで起動してマウントを試みたところ以下のエラーが。

# sudo mount -t btrfs /dev/sdb /mnt/sysimage
mount: wrong fs type, bad option, bad superblock on /dev/sdb,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

demsgには、

[ 1043.660260] BTRFS error (device sdb) in open_ctree:2816: errno=-22 unknown (Failed to recover log tree)

logtreeが壊れている?

ひとまずrepairを試みてみる。

# btrfsck --repair /dev/sdb
enabling repair mode
Checking filesystem on /dev/sdb
UUID: 9a1ef990-cd73-4b98-b57d-72901991e064
checking extents
checking free space cache
cache and super generation don't match, space cache will be invalidated
checking fs roots
checking csums
checking root refs
found 3945306293 bytes used err is 0
total csum bytes: 11398148
total tree bytes: 382119936
total fs tree bytes: 346251264
total extent tree bytes: 20398080
btree space waste bytes: 111504768                                                                                       
file data blocks allocat                                                                                                 

まだ同じメッセージが出てマウントできない。
logを作り直してみる。

# btrfs-zero-log /dev/sdb   


今度はうまくマウントできた。
中身も無事な模様。
log作り直してるのでどこかおかしいかもしれないけどまあ何とかなるだろう。。。


参考ページ;
https://btrfs.wiki.kernel.org/index.php/Problem_FAQ

redisでaof,saveを有効化している場合にdiskを使い切るとどうなるか

redisはオンメモリで動くがファイルに書き込む設定をいれることで永続性を保つことができる。
そのファイルが書き込めなくなるとどうなるか調べてみた。

redisサーバ情報

amazon linux 3.4.37-40.44.amzn1.x86_64
redis 2.6.10

master slaveの2台構成

以下の設定でそれぞれ調査

#定期dump有効化
save 300 1
#aof出力有効化
appendonly yes
appendfsync everysec

適当にddでtestファイルを使ってdisk容量を増やしておく

$ df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/xvda1            7.9G  7.8G  5.2M 100% /
tmpfs                 298M     0  298M   0% /dev/shm

そしてredisにひたすらセットするだけのスクリプトを叩く

$ ./set.py

でdiskがいっぱいになるとどうなるか見てみる

dump 有効化の場合

自動でbgsaveが走った際にdiskスペースが足りないと次のメッセージがlogに出力され続けた。
手動でbgsaveの場合は1セットのみの出力だった。

[10124] 16 Aug 13:00:07.597 # Write error saving DB on disk: No space left on device
[9532] 16 Aug 13:00:07.606 # Background saving error
[9532] 16 Aug 13:00:07.616 * 1 changes in 30 seconds. Saving...
[9532] 16 Aug 13:00:07.642 * Background saving started by pid 10125

redis-cliからinfoで見ると以下の出力
replicationも止まるようだ。

rdb_last_bgsave_status:err

中略

# Replication
role:master
connected_slaves:1
slave0:10.0.31.222,6379,wait_bgsave

※何度かinfoを打つとたまにconnected_slaveが0になっていた。
slave側ではmaster_link_status:downが確認できた。

この状態になった段階でset.pyで以下のメッセージが返ってきた

redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

redis-cliからも同じ。

redis 127.0.0.1:6379> set 1 a
(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

getは問題なくできた。

redis 127.0.0.1:6379> get 1
"10000000"

どうやら更新を受け付けないらしい。
ソースコードを見るにsave処理が正常に終了するまでは更新させないようにしているようだ。

  • redis.c
1046     shared.bgsaveerr = createObject(REDIS_STRING,sdsnew(
1047         "-MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.     \r\n"));

1607     /* Don't accept write commands if there are problems persisting on disk. */
1608     if (server.stop_writes_on_bgsave_err &&
1609         server.saveparamslen > 0
1610         && server.lastbgsave_status == REDIS_ERR &&
1611         c->cmd->flags & REDIS_CMD_WRITE)
1612     {
1613         flagTransaction(c);
1614         addReply(c, shared.bgsaveerr);
1615         return REDIS_OK;
1616     }

aof出力有効化の場合


set.pyの出力

redis.exceptions.ConnectionError: Error 111 connecting 127.0.0.1:6379. Connection refused.

redis-cliの場合

not connected> 

つなげない。。。

ps -ef |grep [r]edis

いない。。。

どうやらredisのプロセスが落ちた模様

ログを見ると

Aug 15:08:49.067 # Exiting on short write while writing to the append-only file: Success

の出力が最後にがされていた。

まとめ

bgsaveが正常終了しないと更新不能になりレプリケーションが停止する。
※起動時にもbgsaveが走るので失敗するので同じ状態になる

aofファイルにdisk容量の影響で追記できなくなくなるとredisのプロセスが落ちる。
※aofファイルへの追記はハードリンクをしているようで起動中にリネームしても追記はしてくれた。
削除してもredisプロセスに影響はなかった。


redis専用サーバの場合はそうそうDISKがいっぱいになることはないだろうけど
loglevelをdebugのままにしてローテートしてないとかあると容量食ってしまうのでそのあたりも注意しないといけない。
あと監視も。

Linux(fedora17)でshrewvpnを使う時のメモ

インストール

ソースを公式ページよりダウンロード
http://www.shrew.net/download/ike

適当な場所に解凍してディレクトリに移動。

 $ tar xvzf ike-2.1.7-release.tgz
 $ cd ike
 $ cmake -DDEBUG=YES -DQTGUI=YES -DNATT=YES 
 $ make
 $ make install

かなり多くのモジュールが必要になるのでエラーが出たらその都度メッセージを確認してモジュールをインストールする。
fedora17の場合はすべてyum経由でインストールできた。

起動と設定

※事前にSELINUXのポリシーを追加するか、無効にしておくこと。~
getenforce で enforcing以外ならOK~

デーモンの起動

 $ sudo iked
$ sudo ikea

※&をつけて起動したほうがいいかもしれない~

  • 設定

ikeaを起動してwindows用の設定資料を見ながらと同じように設定する。~
一部項目名が微妙に違うものがあるが近いものを選択すればOK。~

接続

そのまま接続しても対向セグメントへのルーティングが入らないので以下のコマンドを実行する。

 $ sudo route add -net 172.16.10.0 gw 192.168.0.0 netmask 255.255.255.0
 $ sudo route add -net 172.16.10.255 gw 192.168.0.0 netmask 255.255.255.255
  • 確認
 $ route
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
 default         web.setup       0.0.0.0         UG    0      0        0 wlan0
xxx.xxx.xxx.xxx web.setup       255.255.255.255 UGH   0      0        0 wlan0
 172.16.10.0     3538-fedora     255.255.255.0   UG    0      0        0 tap0
 172.16.10.255   3538-fedora     255.255.255.255 UGH   0      0        0 tap0
 192.168.0.0     *               255.255.255.0   U     0      0        0 wlan0
 192.168.122.0   *               255.255.255.0   U     0      0        0 virbr0
$ ping 172.16.10.20
 PING 172.16.10.20 (172.16.10.20) 56(84) bytes of data.
 64 bytes from 172.16.10.20: icmp_req=1 ttl=63 time=12.5 ms
 64 bytes from 172.16.10.20: icmp_req=2 ttl=63 time=12.4 ms
 64 bytes from 172.16.10.20: icmp_req=3 ttl=63 time=12.7 ms

何回か接続、接続断を繰り返すと設定しても繋がらなくなることがあるのでその時はPCを再起動してみよう。

vftpdめも

ユーザーの追加

追加する

 useradd [ユーザー名]
 passwd [パスワード]
 mkdir /home/[ユーザー名]/public_html
 chown [ユーザー名]. /home/[ユーザー名]/public_html

接続確認してみる 下の例はコマンドプロンプトから接続

 >telnet ftpsv01.snws.jp 21
 220 Welcome to blah FTP service.
 530 Please login with USER and PASS.
 USER [ユーザー名]
 331 Please specify the password.
 PASS [パスワード]
 230 Login successful.
 quit

ログを確認してエラーが無いか見る

 less /var/log/vsftpd.log
 less /var/log/messages

ユーザー追加時の注意点

local_root=public_html

vftpd.confに上記設定がされている場合はuserlistに追加しても接続ができない~
chrootで各ユーザーのホームディレクトリのpublic_htmlディレクトリに飛ばされるので予め作成をしていなければいけない。

作成していない場合は下記のようなログが出る

Mar 25 10:36:41 ftpsv01 vsftpd: pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=nbgi rhost=113x32x146x154.ap113.ftth.ucom.ne.jp  user=nbgi~
|<<
基本的な設定は↓な感じ
>||
   /etc/vsftpd/vsftpdvsftpd.chroot_list (chroot無効ユーザーリスト)
   /etc/vsftpd/vsftpd.user_list (接続許可ユーザーリスト)
   /etc/vsftpd/vsftpd.ftpusers (接続拒否ユーザーリスト)

apacheめも

apache認証

digest認証

  • httpd.confに以下のような設定を追加する。
 AuthType Digest
 AuthName "Secret Zone"
 AuthDigestDomain /
 AuthUserFile /etc/httpd/.htdigest
 Require user secret

※古いバージョンのapacheではAuthUserFileが使えないのでAuthDigestFileを使う。

  • ダイジェスト認証用のファイルを作成する
htdigest -c .htdigest 'Secret Zone' secret

httdの再起動を行ってブラウザで確認してみる。

SSLの設定 [#q87aae4e]

  • 鍵の作成

>||
openssl genrsa -out server.key
openssl req -new -x509 -key server.key -out server.crt
|

※保存ディレクトリに移動してからやること

  • confの修正

上記のフルパスをapacheSSLのconfに記載する。~

 SSLCertificateFile /etc/pki/tls/certs/server.crt
 SSLCertificateKeyFile /etc/pki/tls/certs/server.key

Logmettマクロめも【teraterm】

自動ログイン

パスワード認証
 ; ******* LogMeTT Macro Template for SSH2 session *******
 ; setting
 
 hostname = 'xxxx'
 username = 'xxxx'
 getpassword 'C:\Users\xxx\Documents\teraterm\terapass.txt' hostname inputstr
 
 ; Openning SSH2 connection using port 22.
 ; User will be prompted for username and password
 
 ; connection & login
 msg = hostname
 strconcat msg ':22 /ssh /2 /auth=password /user='
 strconcat msg username
 strconcat msg ' /passwd='
 strconcat msg inputstr
 connect msg
 settitle 'Connected to xxx'
 
 ; Entering synchronous communication mode(useful in most cases)
 setsync 1

※getpasswordのファイルを指定することでパスワード入力を省略できる。デフォルトでは暗号化される

鍵認証 >||

; ******* LogMeTT Macro Template for SSH2 session *******
; Openning SSH2 connection using port 22.
; User will be prompted for username and password
; setting

hostname = 'xxx'
username = 'xxx'
keyfile = 'C:\Users\xxx\Documents\teraterm\xxx_id_rsa'
getpassword 'C:\Users\xxx\Documents\teraterm\terapass.txt' hostname inputstr

; Openning SSH2 connection using port 22.
; User will be prompted for username and password

; connection & login
msg = hostname
strconcat msg ':22 /ssh /2 /auth=publickey /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg inputstr
strconcat msg ' /keyfile='
strconcat msg keyfile
connect msg
settitle 'Connected to xxx.xxx'

; Entering synchronous communication mode(useful in most cases)
setsync 1
|

多段login

logmettで踏み台の配下に以下のマクロを設置する。

 ; ******* LogMeTT Macro Template for SSH2 session *******
 ; Openning SSH2 connection using port 22.
 ; User will be prompted for username and password
 ; setting
 
 ;; 2段目のSSH接続
 host_2nd = 'xxx@xxx' ; 目的のサーバー(2回目のSSH先)のユーザー名とホスト名。例)otp@xxx.xxx.xxx.xxx
 remote_prompt = '$' ; シェルのプロンプトを指定する。bash系なら「$」、cshなら「%」、tcshなら「>」など
 
 ssh_command = 'ssh '
 strconcat ssh_command host_2nd
 hostname = 'xxx'
 ;username = 'xxx'
 msg = hostname
 passwd_prompt = 'pass'
 connect msg
 
 getpassword 'C:\Users\xxx\Documents\teraterm\terapass.txt' hostname inputstr
 
 wait remote_prompt
 sendln ssh_command
 wait passwd_prompt
 sendln inputstr

PXEブートでCentOSをインストール

環境
CnetOS6.1

必要なパッケージをインストール

  yum install tftp-server tftp xinetd syslinux dhcp

configの設定

 vim /etc/xinetd.d/tftp
 service tftp                                                           
 {                                                                      
        socket_type             = dgram                                 
        protocol                = udp                                   
        wait                    = yes                                   
        user                    = root                                  
        server                  = /usr/sbin/in.tftpd                    
        server_args             = -s -v /var/lib/tftpboot    #-vを追加  
        disable                 = no                         #yesからno 
        per_source              = 11                                    
        cps                     = 100 2                                 
        flags                   = IPv4                                  
 }

CentOSのイメージファイルをマウント

imageはどっかから取得

 mount -t iso9660 -o loop /mnt/iso/CentOS-5.5-i386-bin-1of7.iso /mnt/iso

イメージファイルなどをtftboot下へコピーする

 cp -p  /mnt/iso/isolinux/initrd.img /var/lib/tftpboot/linux-install/
 cp -p /mnt/iso/isolinux/vmlinuz /var/lib/tftpboot/linux-install/ 
 cp -p /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/linux-install/ 
 cp -p /usr/share/syslinux/menu.c32 /var/lib/tftpboot/linux-install/

dhcpサーバの設定

 vim /etc/dhcp/dhcpd.conf
 # dhcpd.conf                                                                                 
 #                                                                                            
 log-facility local7;                                                                         
                                                                                              
 # No service will be given on this subnet, but declaring it helps the                        
 # DHCP server to understand the network topology.                                            
                                                                                              
 subnet 172.16.50.0 netmask 255.255.255.0 {                                                   
        #filename "/linux-install/pxelinux.0";                                                
        range 172.16.50.245 172.16.50.246;                                                    
        option routers 172.16.50.1;                                                           
        #range dynamic-bootp 172.16.50.245 172.16.50.246;    #自動割振りの場合は有効にする。  
        default-lease-time 600;                                                               
        max-lease-time 7200;                                                                  
 }   
                                                                                         
 #自動割振りの場合は以下は不要                                                                
  host pxe-test {                                                                             
                next-server 172.16.50.29;                                                     
                hardware ethernet 00:0c:29:03:84:d3;                                          
                fixed-address 172.16.50.245;                                                  
                filename    "/linux-install/pxelinux.0";                                      
        }                                                                                     
                                                                                              

設定の確認

 # dhcpd -f -d

問題なければdhcpdを起動する。

# /etc/init.d/dhcpd start

kick-startの準備

サンプルをコピーして適当に編集

 # cp -p /root/anakonda.ks.cfg /var/www/html/ks-test.cfg
 # vim /var/www/html/ks-test.cfg
  
 # Kickstart file automatically generated by anaconda.
 #version=DEVEL
 install
 url --url=http://172.16.50.29/pxe
 lang ja_JP.UTF-8
 keyboard jp106
 network --onboot yes --device eth0 --bootproto dhcp --ip  auto --netmask 255.255.255.0 --gateway 172.16.50.1 --nameserver 172.16.20.10 --  hostname CentOS5.5
 rootpw  passwd
 #firewall --service=ssh
 authconfig --enableshadow --passalgo=sha512
 #selinux --enforcing
 timezone Asia/Tokyo
 bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
 # The following is the partition information you requested
 # Note that any partitions you deleted are not expressed
 # here so unless you clear all partitions first, this is
 # not guaranteed to work
 clearpart --all --drives=sda
 part /boot --fstype ext3 --size=100 --ondisk=sda
 part pv.2 --size=0 --grow --ondisk=sda
 volgroup VolGroup00 --pesize=32768 pv.2
 logvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=384 --grow --maxsize=768
 logvol / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --grow

pxeブート用のコンフィグファイルを作成

 vim /var/lib/tftpboot/linux-install/pxelinux.cfg/default

 
 default    menu.c32
 
 label 1
 menu label ^1) CentOS5.5
 kernel vmlinuz
 append load initrd=initrd.img devfs=nomount ks=http://172.16.50.29/ks-test.cfg
 
 label 2
    menu label ^2) Boot from local drive
    localboot

その後はインストールしたい端末をDHCPサーバと同日セグメントに接続して起動する。(BIOSでPXEを有効にしておくこと)