サーバのデータ移行

最終的にはOSバージョンアップしましたが、何かの時の為にと失敗した内容のメモです。

サーバ用に使っていたPCが壊れました。幸いHDDは無傷でしたが既に古いPCで同じものは有りません。
そこでなぜかノートPCが用意されてこれでよろしくとのこと・・・
マザーボードからCPUもメモリもHDDサイズも何もかも違いますがそこに全てのデータを移行し
使えるようにしなければいけなくなりました。

dumpを取ってrescureモードでリストアする事をすぐに思いつきましたが
旧サーバのdumpを取れるHDDがありません。
さらにインストールしたメディアもありません。
※私が構築したサーバでは無いです
ひとまず直接ハードディスクからコピーできるddコマンドを使ってデータ移行してみる事にしました。

旧サーバのHDDを取り出してUSB接続にします。
それを新しくもらったノートPCにUSBで接続します。

linuxOSのCDを入れて、linux rescureモードで立ち上げます。

diskのフォーマットを聞かれるが既にフォーマット済みなので「NO」で進めます。

レスキューモードで立ち上がってきたらひとまず認識状況を確認

sh-3.2# fdisk -l
Disk /dev/sda: 251.0 GB, 251041677312 bytes
255 heads, 63 sectors/track, 30520 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot Start End Blocks Id System
/dev/xvdc1 * 1 1044 8385898+ 83 Linux
/dev/xvdc2 1045 2088 8385930 83 Linux
/dev/xvdc3 2089 2610 4192965 82 Linux swap / Solaris
/dev/xvdc4 2611 30515 224146912+ 5 拡張領域
/dev/xvdc5 2611 30515 224146881 83 Linux

Disk /dev/sdb: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot Start End Blocks Id System

どうやらUSBで接続している方をsdaとして認識している模様
ノートPCのDiskはまだ何もされていない状態です。

まずfdiskで旧ディスクのパーティションとまったく同じパーティションを作成します。
1~3がプライマリ、4に拡張を入れて5に拡張パーティションをつくります。

sh-3.2# fdisk /dev/sdb

n

extended
primary

w

作成が終わったら
ddコマンドにてデバイスを丸ごとコピーします。
エラーが発生した時の事を考えてエラーは無視させます。

# dd if=/dev/sda of=/dev/sdb bs=512 conv=noerror,sync

エラーもなく問題なく完了

再起動するとkernelパニックで起動できない・・・

> mount:could not find filesystem ‘/dev/root’
> setuproot:moving /dev failed:No such file or directory
> setuproot:error /proc :No such file or directory
> setuproot:error /sys :No such file or directory
> switchroot: mount failed:No such file or directory

エラー内容をみるとrootパーティションが見つけられないようでした

そこでもう一度rescureモードで起動

grub.confを編集
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-8.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-8.el5 ro
root=LABEL=/ ⇒ root=/dev/sda1 直接デバイスを指定
initrd /boot/initrd-2.6.18-8.el5.img

再起動しましたがやはり同じ所でエラー
initrd.img部分の問題が考えられるので再設定をしようとした所、
depmodでカーネルが違う事に気がつく
元のOSはcentOS5、レスキューに使ってるOSはcentOS5.4
仕方ないのでカーネルバージョンを5.4に合わせて作ってみる

initrdの再設定

chroot /mnt/sysimage
depmod -a
uname -r
mv /boot/initrd-******.img /boot/initrd-******.img.org
mkinitrd /boot/initrd-*****.img *******

再起動しましたが結局エラー

カーネルの再構築も考えましたがなんとCentOS5.4のカーネル2.6.18-164.el5は
コンパイルできませんでした。
“`init/built- in.o’ に必要なターゲット `init/main.o’ を make するルールがありません。中止。”と言われる。

困った・・・

今日(2013年6月25日)CentOS5.0を探す事も難しい

そのあといろいろ調べたのですがどうやらブートドライブをIDEからSATAに変更した事が
問題のようでした。

必要なモジュールを入れてinitrdを再作成すればよいようです。

カーネルの再構築の実施

linux rescueでカーネルを再構築する事は初めてですがやってみました。
現在2.6.18-8.el5
入れるもの2.6.18-348.el5

kernel-2.6.18-348.el5.src.rpmをダウンロード

ネットワークの設定をせずに入っていたので既存のネットワークを起動します。
# /etc/init.d/network [OK]
無事起動

直接wgetもできるかもですがひとまずローカルのlinuxサーバからsftpで取ってきます。
※sftpなので元のssh_keyに登録されていないサーバは新規で登録できないので注意

とりあえず以前接続してssh_key登録のあるサーバからダウンロードしました。

rpmインストールを実施

# rpm -ivh kernel-2.6.18-348.el5.src.rpm

warning: user mockbuild does not exitst – using root
warning: group mockbuild does not exitst – using root

上記のエラーが大量にでました。

恐る恐るkernelソース関連ファイルがあるかどうか確認
/usr/src/redhat/SPECS/
/usr/src/redhat/SOURCES/

お!ちゃんとできてる

とりあえずスルーして作業を進める

ハードウェアを確認してパッチを適用する
# uname -m
i686

# rpmbuild -bp –target=i686 /usr/src/redhat/SPECS/kernel.spec

Error: Failed build dependencies:

依存関係のエラーがでました。

ここは依存関係を無視して進みます。

# rpmbuild -bp –nodeps –target=i686 /usr/src/redhat/SPECS/kernel.spec

一応終わりました。

/usr/src/redhat/BUILD/kernel-2.6.18 ができてその下に
linux-2.6.18-348.el5.i686というフォルダができているので移動

# cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18-348.el5.i686

ここにはカーネルをビルドする為のファイルがあります。
そのままでもいいかもしれませんがひとまず初期化します。
もし現在の.configをとっておきたいのであればどこかに退避して下さい。

初期化
# make mrproper

やはり大量にwarningがでるがスルー

初期設定ファイルをコピーする
# cp configs/kernel-2.6.18-i686.config .config

カーネルに組み込む設定をする
# make menuconfig

GRUBなのでbzImageでコンパイルする
# make bzImage

なぜかループしている模様・・・
warning: Clock skew detected. Your build may be incomplete.

と出ている。時刻がおかしいようだ。

# ntpdate NTPサーバ

時刻を合わせると進みました。

Root device is (8, 1)
Boot sector 512 bytes.
Setup is 7266 bytes.
System is 1858 kB
Kernel: arch/i386/boot/bzImage is ready

終わるとarch/i386/boot/bzImageという名前のカーネルが作成される

モジュールのコンパイルとインストールの実行
# make modules
# make modules_install

カーネルの配置
作成したカーネルをbootディレクトリに移動する
名前はなんでもいいがひとまず下記の通りにしました。

# cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.18-348.el5

# cp System.map /boot/System.map-2.6.18-348.el5

カーネル起動に必要なモジュールを待ちめて

# mkinitrd /boot/initrd-2.6.18-348.el5.img 2.6.18-prep

GRUBの設定

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/sda1
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=1
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-8.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=/LABEL=/
title CentOS-base (2.6.18-348.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-348.el5 ro root=LABEL=/
initrd /boot/initrd-2.6.18-348.el5.img

結局NGですた・・・

OS入れなおしかと思ってとりあえず最後にOSのバージョンアップ
を実施しました。(元のOSがもうないので)

バージョンアップしたら正常に動きました・・・

う~ん、何が問題だったのか謎のままです(´;ω;`)

apacheでのアクセス制限

ブログサイトを運用しているとSPAM書き込みにうんざりする事があります。
そこで今回はapacheでアクセス制限を行いたいと思います。

まず、ドキュメントルートでブロックする場合httpd.confにdeny fromを追加します。

# vi /etc/httpd/conf/httpd.conf

<Directory “/var/www/html”>
Order allow,deny
Allow from all
Deny from 192.168.1.254 ←ここに接続させないIPを記載
</Directory>

ポリシーとしてはorderで許可と拒否の順番を決めます。
上記の例ではallw,denyなので許可してから拒否になります。
Allow from allで全てを許可してからDeny fromで拒否するIPを入れます。

allow,denyが一般的と思いますがセキュアなサーバで接続できるclientが
少ない場合は逆にDeny from allからAllow from 192.168.1.1のような感じ
で許可するIPを制限できます。

この制限はディレクトリ単位やファイル単位で制限できるので
ここだけは制限したいとかいう場合には結構有効です。

私の場合はwordpressにSPAM書き込みを何度も行うIPに対してアクセス制限をかけています。

# vi /etc/httpd/conf.d/wordpress.conf
Alias /wordpress /var/www/wordpress
<Directory /var/www/wordpress>
Options ExecCGI FollowSymLinks
Order allow,deny
Allow from all
Deny from 205.164.24.90
AllowOverride all
</Directory>

上記のような感じでDeny fromを増やしていきます。

そもそもサーバに接続させたくないのであれば/etc/hosts.denyで制限したほうがいいです。

プライベートMIBの追加

snmpでmibファイルを追加した時の覚え書き

アプライアンス機器等でベンダーが独自に定義しているMIBが必要な際は
プライベートMIBを入れる必要があります。

snmpをrpmで入れた場合、デフォルトのMIBファイルは
/usr/share/snmp/mibs
ディレクトリに保存されています。
そこにプライベートMIBの定義ファイルを入れればいいかと
入れてみましたがだめでした。

そこでsnmpを使用するユーザー毎の設定になりますが、
MIBファイルを保存するディレクトリとコンフィグを作成します。

ひとまずプライベートMIBファイルはHOMEディレクトリにおきます。

続いてMIB設置用のディレクトリを作成
$ mkdir -p $HOME/.snmp/mibs

MIBファイルをコピーします。
$ cp -p “MIBファイル” $HOME/.snmp/mibs

snmpwalkの設定ファイルを作成する
$ vi $HOME/.snmp/snmp.conf
MIBDIRS /usr/share/snmp/mibs:$HOME/.snmp/mibs
MIBS all

MIBDIRSでMIBファイルが保存されているレクトリを指定します。
パスのセパレータはコロン(:)なので間違えないようにして下さい
MIBS allで全てのMIBモジュールを読み込むようになります。

これでsnmpwalkやsnmpgetではプライベートMIB情報が反映されます。

設定前
$ snmptranslate 1.3.6.1.4.1.5951.4.1.2.1.1.5
SNMPv2-SMI::enterprises.5951.4.1.2.1.1.5

設定後
$ snmptranslate 1.3.6.1.4.1.5951.4.1.2.1.1.5
NS-ROOT-MIB::svcState

これで分かりやすくなりました。

squidでのホワイトリストとブラックリスト

proxyでの管理でコンフィグファイルをいちいち変更しないでいいようにブラックリストとホワイトリストの運用にしたいと思い作った時のメモです。

いつもはsquid.confに直接記述していましたがaclでリストを読み込む方法に変更します。

aclのベースは下記の通りです。

http_port 8080

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network

acl localnet src 172.16.0.0/12 # RFC1918 possible internal network

acl localnet src 192.168.0.0/16 # RFC1918 possible internal network

http_access allow localnet

http_access allow localhost

http_access deny all

ここからaclにファイルを読み込ませる設定を追記します。
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
↓ 間に記述する
## acl allow policy
acl whitelist dstdomain “/usr/local/squid/etc/whitelist” ←ファイルの場所を指定
## acl deny policy
acl blacklist dstdomain “/usr/local/squid/etc/blacklist” ←ファイルの場所を指定

## allow rule
http_access allow whitelist
## deny rule
http_access deny blacklist
↑ 間に記述する
http_access allow localnet

簡単に説明するとaclで読み込むファイルを指定してhttp_accessでallowかdenyか決めています。
注意する所としてはファストマッチなのでallowの上にブラックリストのdenyポリシーを入れることでリストのものだけブロックが可能です。さらにその上にホワイトリストのallowポリシーを入れることでリストのものだけ通過させる事が可能です。
今回は宛先のドメインでの制御にしていますが、dstdoaminをsrcに変更することでクライアントIP等での制御も可能です。

2つに該当しないものはデフォルトのポリシーのlocalnetからの通信は許可して他はすべて禁止にします。

リストの場所はどこでもいいですがなるべくわかりやすい所がいいと思います。

リストの書き方
whitelistで許可するドメインをサブドメインを含む形で書きます。
subdomain.nekofamily.ddo.jp

blacklistではブロックするドメインを書きます。
.nekofamily.ddo.jp ←最初に.を入れることでサブドメインも含む形でブロックできます。

上記の設定だとnekofamily.ddo.jpへのアクセスはできないが、subdomain.nekofamily.ddo.jpだけアクセスできるという形になります。

linux disk領域拡張

最近はLVMを使っているので需要はないかもしれませんが
通常のext3の領域拡張の方法について記載します。
たまたまリストア先のdiskが大きかったので余っている部分を
有効活用しようという事で実施しています。

現状を確認

# fdisk -l
Disk /dev/sda: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/xvdc1 * 1 1044 8385898+ 83 Linux
/dev/xvdc2 1045 2088 8385930 83 Linux
/dev/xvdc3 2089 2610 4192965 82 Linux swap / Solaris
/dev/xvdc4 2611 30515 224146912+ 5 Extended
/dev/xvdc5 2611 30515 224146881 83 Linux

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 7.8G 6.1G 1.4G 83% /
tmpfs 755M 0 755M 0% /dev/shm
/dev/sda5 208G 128G 70G 65% /home
/dev/sda2 7.8G 693M 6.7G 10% /var

今回は残っている領域を/homeに割あてます。

まずパーティションサイズを変更します。
unmountが必要なので今回はシングルユーザーモードで行います。
# init 1

シングルユーザーになったら/homeをunmount
sh-3.2# umount /dev/sda5

マウントされていない事を確認
sh-3.2# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 7.8G 6.1G 1.4G 83% /
tmpfs 755M 0 755M 0% /dev/shm
/dev/sda2 7.8G 693M 6.7G 10% /var

パーティションを再作成
sh-3.2# fdisk /dev/sda

The number of cylinders for this disk is set to 38913.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): m ←ヘルプを見ればだいたいわかります。
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition’s system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

Command (m for help): d ←領域を削除(fdiskの表示を参考、忘れたらpで確認すればOK)
Partition number(1-5): 4 ←拡張領域のサイズ変更なのでまず拡張領域を削除

Command (m for help): d
Partition number(1-5): 5 ←増やすパーティション部分を削除

Command (m for help): p ←消えているか確認
Disk /dev/sda: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/xvdc1 * 1 1044 8385898+ 83 Linux
/dev/xvdc2 1045 2088 8385930 83 Linux
/dev/xvdc3 2089 2610 4192965 82 Linux swap / Solaris

Command (m for help): n ←新規で作成
Command action
e extended
p primary partition (1-4)
e ←拡張領域
Partition number (1-4):
4 ←消した所に復活させる
First cylinder (2611-38913, default 2611): ←以前と場所が変わらないように注意
Using default value 2611
Last cylinder, +cylinders or +size{K,M,G} (2611-38913, default 38913): ←終了シリンダー番号、全部割り当てるので最後までにしてます。

次に拡張領域に割り当てていた領域を作成
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (2611-38913, default 2611): ←これも次のシリンダーの初めにセットされているのでそのまま
Using default value 2611
Last cylinder, +cylinders or +size{K,M,G} (2611-38913, default 38913): ←終了シリンダー番号、全部割り当てるので最後までにしてます。

Command (m for help): p ←割り当てられたか確認

Disk /dev/sda: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 1044 8385898+ 83 Linux
/dev/sda2 1045 2088 8385930 83 Linux
/dev/sda3 2089 2610 4192965 82 Linux swap / Solaris
/dev/sda4 2611 38913 291603847+ 5 Extended
/dev/sda5 2611 38913 291603816 83 Linux

問題なさそうです。

最後に書き込みをして終了です。
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

これでシングルユーザーモードでの作業は完了です。
一応マウントしました。再起動とかでfstabに書いてあるので自動マウントしますけどね
sh-3.2# mount -t ext3 /dev/sda5

起動したら状況を確認

# fdisk -l
Disk /dev/sda: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 1044 8385898+ 83 Linux
/dev/sda2 1045 2088 8385930 83 Linux
/dev/sda3 2089 2610 4192965 82 Linux swap / Solaris
/dev/sda4 2611 38913 291603847+ 5 Extended
/dev/sda5 2611 38913 291603816 83 Linux

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 7.8G 6.1G 1.4G 83% /
tmpfs 755M 0 755M 0% /dev/shm
/dev/sda5 208G 128G 70G 65% /home
/dev/sda2 7.8G 693M 6.7G 10% /var

fdiskでパーティションは増えているけど実領域は増えていない事がわかります。
状態としては外の容器は大きくしたけど中の容器はまだそのままという状態です。

次にファイルシステムをサイズ変更します。
resize2fsで使える領域のMAXまで割り当ててくれるので簡単に拡張できます。
# resize2fs /dev/sda5
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/sda5 is mounted on /home; on-line resizing required
Performing an on-line resize of /dev/sda5 to 72900954 (4k) blocks.
The filesystem on /dev/sda5 is now 72900954 blocks long.

無事領域を拡張できました。
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 7.8G 6.1G 1.4G 83% /
tmpfs 755M 0 755M 0% /dev/shm
/dev/sda5 270G 128G 129G 50% /home
/dev/sda2 7.8G 695M 6.7G 10% /var

ntp設定

ログの時間がずれているサーバがあったので確認してみたらなぜかNTPが入っていなかった(;´ Д`)
あまり大層な設定ではないですが入っていないと大変な事になりかねないですよ。。。
忘れないようにNTPインストールのメモ書きです。

yumでサクッとインストール

# yum -y install ntp

同期をとる公開サーバの設定をします。
社内で決まったNTPサーバがあればそれに合わせます。
もしNTPサーバとして使う場合はrestrictにてアクセス許可とiptablesにて
ntpを許可して下さい。
今回は公開されている福岡大学のNTPサーバを利用しました。

# vi /etc/ntpd.conf
server 133.100.9.2
server 133.100.11.8

restrict 192.168.1.0 mask 255.255.255.0 notrust nomodify notrap ←NTPサーバにする場合は許可するネットワークを設定して下さい。

NTPを起動するとntpdateで手動同期ができないのでまず先に手動で同期をとります。
# ntpdate clock.nc.fukuoka-u.ac.jp
4 Mar 13:36:36 ntpdate[2665]: adjust time server 133.100.9.2 offset -0.002717 sec

設定が終わったらNTPを起動して設定を有効化します。
# /etc/init.d/ntpd start
ntpdを停止中: [ OK ]
ntpdを起動中: [ OK ]

自動起動を設定
# chkconfig ntpd on
# choconfig –list ntpd (一応確認)
ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

NTPの動作確認
「ntpq -p」コマンドにて確認します。
*が左端にあるNTPサーバが現在参照中のサーバです。
# ntpq -p
remote refid st t when poll reach delay offset jitter
============================================================================
+clock.nc.fukuok .GPS. 1 u 71 64 176 23.856 0.379 0.452
*clock.tl.fukuok .GPS. 1 u 13 64 177 29.024 -0.377 5.948

なお、ntp -p 実行時に、No association ID’s returned と表示された場合は、NTPサーバーとの同期がとれていません。
/etc/ntp.conf の内容をもう一度よく確認してください。
※すぐに自動同期をとるわけではないのでしばらく待ってから確認して下さい。