誰でもできるARPクリア

これ本当なのか?

サーバ交換とかした後に、交換後起動したサーバからそのつながってるスイッチのデフォルトゲートウェウイにPing飛ばしたら、スイッチ側のそのサーバIPのARP情報がよしなに書き換えられるという話。

とりあえず、サーバ同士では書き換わった。

これがうまくいったらスイッチ側でARPクリアとか必要ないような。
ブート時にIP設定してる数だけデフォルトゲートウェイにPing飛ばすスクリプト仕込めばいいだけになってしまう・・・・・

怪しいなぁ。

perlでforkするメモ

perlでforkする実験を色々してみた。
結構色々分かったのでメモ。

  • 親が子を作って、プログラムをコピーして渡して実行する
  • 親が子を作った時のグローバル変数はそのままコピー?ループカウント変数は保持したまま。
  • 子が最初からプログラムを純粋に実行するわけではない?
#!/usr/bin/perl

use strict;
use warnings;

$| = 1;

# 並行して生むことが出来る子の数
my $child_max = 3;
my $child_num = 0;

# 処理は30回
my $roop_max = 30;
my $roop_count = 0;

my ($pid, $wait_pid, $sleep_time);

while ($roop_count != $roop_max) {
    $pid = fork;
    # 親が子を生むときは子のPIDを返す
    # 子がforkするときは0を返す
    # 失敗したら未定義値を返す
    if ($pid ne 0) {
        # 親の処理
        $child_num++;
        print "roop[$roop_count] fork child: ]
            all_child_num[$child_num] child_pid[$pid]\n";
    } elsif (defined $pid) {
        # 子の処理
        $sleep_time = rand 10;
        print "roop[$roop_count] start child process task:
            all_child_num[$child_num] task[sleep $sleep_time]\n";
        sleep $sleep_time;
        exit 0;
    } else {
        exit 1;
    }

    # 親の子プロセス数管理
    if ($child_num == $child_max) {
        print "roop[$roop_count] start  wait child process: 
            all_child_num[$child_num]\n";
        $wait_pid = wait;
        $child_num--;
        print "roop[$roop_count] finish wait child process:
            all_child_num[$child_num] exit_child_pid[$wait_pid]\n";
    }

    $roop_count++;
}

# 子プロセスが全て終わるのを待つ
# wait()はどれかの子プロセスを待つ
# waitする子プロセスが無ければ-1を返す
while ($wait_pid ne "-1") {
    $wait_pid = wait;
    print "roop[$roop_count] wait all child process:
         all_child_num[$child_num] exit_child_pid[$wait_pid]\n";
}

LVMをマウントしてデータを抜き出すメモ

LVMを用いてファイルシステムを構築していて、そのHDDが壊れた時など、データ損傷し過ぎでどうにもこうにもいかなくなることがある。
そこで、別OSを起動してその壊れたHDDをマウントし、必要なデータを抜き出すにはどうしたらいいか。

ちょっと苦戦したので、そのメモ。

1,OS起動中にSATAを認識させる(HDDをSATAケーブルで接続後)

# echo "scsi add-single-device 01 00 01 00" > /proc/scsi/scsi

※数字は「scsi番号 Channel Id Lun」、今回は「01 00 01 00」だった。

2,SATAが認識されたか確認

# cat /proc/scsi/scsi
Host: scsi1 Channel: 00 Id: 01 Lun: 00
  Vendor: ATA      Model: Maxtor 6Y080M0   Rev: YAR5
  Type:   Direct-Access                    ANSI SCSI revision: 05

3,LVMがデバイス内にあるか、物理ボリューム→ボリュームグループ→論理ボリュームの順にスキャン

# pvscan
  PV /dev/sdb2   VG VolGroup00   lvm2 [76.22 GB / 32.00 MB free]
  Total: 1 [76.22 GB] / in use: 1 [76.22 GB] / in no VG: 0 [0   ]

# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "VolGroup00" using metadata type lvm2

# lvscan
  ACTIVE            '/dev/VolGroup00/LogVol00' [74.25 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol01' [1.94 GB] inheri

4,マウントしたいLVMボリュームグループを有効化

# vgchange -ay VolGroup00

5, /dev内にLVMのボリュームが見えるようになったので、マウント

# mount /dev/VolGroup00/LogVol00 /mnt
# ls /mnt/
bin/  boot/  dev/  etc/  home/  lib/  lost+found/  media/  misc/  mnt/  net/  opt/  proc/  root/  sbin/  selinux/  srv/  sys/  tmp/  usr/  var/

6,データ吸出しちゃってください。

Linux起動スクリプトのfunctionsメモ

#!/bin/sh

. /etc/init.d/functions

# 色々書いて・・・
for chek in 1 2 3
do
    # 重要なコマンドを3回実行して・・・
    RETVAL=$?
    [ $RETVAL = 0 ] && success && echo
    [ $RETVAL != 0 ] && failure && echo
done
exit 0

でこれを実行すると、

# ./boot_script.sh
check 1 :                           [失敗]
check 2 :                           [失敗]
check 3 :                           [  OK  ]

てな感じで、起動スクリプトのような出力が可能。

意外と忘れがちなmysqlコマンド

結構使えて、意外と忘れてしまうmysqlのコマンドをメモっとこう。

・数字を大小でソート(数字の桁数をそろえてソートすればおk)。
10桁にそろえて、降順でソート。

mysql> select * from テーブル where カラム like "%ワード%" order by LPAD(size, 10, '0') DESC;

その他色々↓

続きを読む