Yamamoto's Laboratory
メンテナンス
コンピューター 自宅サーバー 二代目 WEB server のメンテナンス

Ubuntu server 14.04メンテナンス

自宅のサーバー Ubuntu 14.04 のメンテナンスに関するメモです.内容は,IPの自動通知,データのバックアップ方法(自動と手動),OSのアップグレードについて説明します.

目次


ダイナミックIPのDDNSの問題

自宅のサーバーで「固定IP」を使える人はほとんどいないでしょう.通常は,IPアドレスが変わる「ダイナミックIP」です.このように動的に変化するIPアドレスに対しては、一意のホスト・ドメイン(私の場合,www.yamamo10.jp)をあたえるダイナミックDNS(DDNS)が使われます.この仕組みでは,ホスト側のIPアドレスが変更されるとDDNS側は,ホスト側のIPを調べる手段が無くなります.そのため,IPアドレスが変わったときには,ホスト側はDDNS側にIPアドレスを通知する必要があります.もちろん,手動で通知は可能ですが,面倒です.ここでは,自動的にIPアドレスを通知する方法を示します.

ここで示す方法は,VALUE-DOMAIN.COM で確認しています.これは,私が契約しているDDNSサービスを提供する業者です.

ダイナミックDNS IP設定スクリプト(IP_update)

IPアドレスを通知するスクリプト(IP_update.pl)について説明します.これは,あにょの自宅サーバ構築メモ(Fedora)の「IPアドレス自動更新スクリプト」に書かれていたものを適当に修正したものです.

スクリプトは,下に示すとおりです.その動作は単純です.以前に設定したIPアドレスと現在のIPアドレスを比較し,それらが異なっていれば,httpでサーバーにアクセスするだけです.サーバーは呼び出し側のIPアドレスが分かるので,それを元に再設定を行います.短いので,すぐに動作は理解できると思います.スクリプトで分かりにくいところは,以下の通りです.

  • 14行目でIPアドレスを取得しています.この行のhttp://以下を引数ipを付けて呼び出すと,IPアドレスが戻り値として返ってきます.それを,オプションOで指定したファイルに書き出しています.オプションqはログファイルを書き出さない—という指定です.
  • 22行目でhttpを用いてサーバーにアクセスしています.getメソッドで必要な情報を送っています.

ダイナミックDNS IP設定スクリプト(IP_update.pl).

001   #!/usr/bin/perl
002   #
003   $OLD_IPF = 'OLD_IP.dat';
004   $NEW_IPF = 'NEW_IP.dat';
005   $WGET_RESULT = 'wget.log';
006   $LOG = '/var/log/ddns.log';
007   
008   open INPUT,"$OLD_IPF";
009   $OLD_IP=<INPUT>;
010   chomp($OLD_IP);
011   $OLD_IP =~ s/^\s*(.*?)\s*$/$1/;
012   close INPUT;
013   
014   system("wget -q -O $NEW_IPF http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip");
015   open(INPUT,$NEW_IPF);
016   $NEW_IP = <INPUT>;
017   chomp($NEW_IP);
018   $NEW_IP =~ s/^\s*(.*?)\s*$/$1/;
019   close(INPUT);
020   
021   if($NEW_IP ne "" && $OLD_IP ne $NEW_IP){
022       system("wget -q -O $WGET_RESULT 'http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=ドメイン&p=パスワード&h=*'");
023   
024       open WLOG,"$WGET_RESULT";
025       $wgr=<WLOG>;
026       chomp($wgr);
027       $wgr =~ s/^\s*(.*?)\s*$/$1/;
028       close WLOG;
029   
030       if($wgr eq "status=0"){
031           open(OUTPUT, ">$OLD_IPF");
032                  print OUTPUT $NEW_IP;
033               close OUTPUT;
034       }
035   
036           $now = localtime;
037           open (OUTPUT ,">>$LOG");
038           print OUTPUT "$now DDNS IP Address Updated. $OLD_IP to $NEW_IP $wgr\n";
039           close OUTPUT;
040   }

設定

ダイナミックIPの場合,IPアドレスが変わるタイミングが分かりません.ただし,IPアドレスの変更は,それほど頻繁ではありません.とはいえ,人がIPアドレスを監視するわけにも生きませんので,先ほどのスクリプトを定期的に実行させる必要があります.定期的なコマンド実行には,cronが便利です.ファイル「/var/spool/cron/crontabs/root」に以下を追加することにより,2時間毎に「IP_update.pl」が実行されます.

0 */1 * * * /usr/local/ddns/IP_update.pl

IPアドレスの確認

サーバーのダイナミックIPのアドレスの確認は,いろいろの方法でできます.たとえば,以下のようにします.

  • WEB上のサービスを利用します.以下のようなものがあります.
  • ルーターの設定を確認します.私の場合,NTTのPR-S300NEを使っています.ルーターの[現在の状態]→[機器状態情報]→[接続先1]→[WAN側IPアドレス]です.

逆にホスト・ドメイン名からIPアドレスを調べる方法もいろいろあります.たとえば,以下のようにします.

  • WEB上のサービスを利用します.以下のようなものがあります.
  • ドメイン登録代行業者と契約している場合,そこから調べることができます.私は,VALUE-DOMAIN.COMと契約しています.ログイン後,[ドメイン操作]→[取得済みドメイン一覧]→[ダイナミックDNS情報]を選択します.そして,ドメインを選択して,[変更]ボタンを押します.すると,必要なパラメーター情報の欄にIPアドレスが表示されます.

自動的にファイルのバックアップ

自宅のサーバーだとファイルの破損が怖いので自動でバックアップをとるようにします.バックアップの方法は,初代のサーバーと同じ方法を使います.

バックアップ用スクリプト

サーバーの運用では,データを失わないようにすることが最も重要です.そのために,データのバックアップが効果的です.これは,手動ではとても面倒なので,自動的にコンピューターにやらせることにします.そのために,次のような Perl のスクリプトを作成しました.これを coron を使い定期的に実行させると,「/home」と「データベース」が自動的にバックアップできます.バックアップ先は,「/mnt/LinkStation/web_backup」です.これはファイルサーバー(NAS)で,webサーバーとは別の場所にあります.

バックアッププログラム(program/backup.pl).

001   #!/usr/bin/perl
002   #============================================================================
003   # サーバーのデータバックアップ
004   #   元ネタは、次のWEBページ.
005   #     http://lucenhangul.com/wiki/lucenwiki?itemid=68
006   #   ここに書かれていたシェルスクリプトを Perl に直した.
007   #                    Masashi Yamamoto
008   #                          ymm10m34@khaki.plala.or.jp
009   #============================================================================
010   $today       = `date +%Y%m%d`;                      # 本日の日付
011   $oldday      = `date --d "1 months ago" +%Y%m%d`;   # これよりも古いものは削除
012   $mysql       = "/usr/bin/mysql";
013   $db_dump     = "/usr/bin/mysqldump";
014   $db_user     = "yamamoto";                          # データベースのユーザー名
015   $db_passwd   = "XXXXXXXXXXXXXX";                    # データベースのパスワード
016   $home_dir    = "/home";                             # バックアップ対象ディレクトリー
017   $backup_dir  = "/mnt/LinkStation/web_backup";       # バックアップの場所
018   $backup_HOME = "HOME";
019   $backup_DB   = "DB";
020   $log_file    = "log.txt";
021   
022   chomp $today;
023   chomp $oldday;
024   
025   &open_log;
026   &mk_dir;
027   &home_backup;
028   &db_backup;
029   &rm_old_backup;
030   &close_log;
031   
032   #============================================================================
033   # ログファイルのオープン
034   #============================================================================
035   sub open_log{
036       my $time;
037       $time=localtime;
038       open(LOG, ">>$log_file");
039       printf LOG "$time\n";
040       printf LOG "$today\n";
041   }
042   
043   #============================================================================
044   # ログファイルのクローズ
045   #============================================================================
046   sub close_log{
047       my $time;
048       $time=localtime;
049       printf LOG "$time\n\n";
050       close LOG;
051   }
052   
053   #============================================================================
054   # バックアップ用のディレクトリーの作成
055   #============================================================================
056   sub mk_dir{
057       if(! -e "$backup_dir/$today"){
058   
059           `mkdir -p $backup_dir/$today/$backup_DB`;
060       if(-d "$backup_dir/$today/$backup_DB"){
061           printf LOG "make DB  \t$backup_dir/$today/$backup_DB \n";
062       }
063   
064       `mkdir -p $backup_dir/$today/$backup_HOME`;
065       if(-d "$backup_dir/$today/$backup_HOME"){
066           printf LOG "make HOME\t$backup_dir/$today/$backup_HOME\n";
067       }
068       }
069   }
070   
071   #============================================================================
072   # ホームディレクトリーのバックアップ
073   #============================================================================
074   sub home_backup{
075       my $user, @user_list;
076       my $ret;
077   
078       opendir(DIR, $home_dir);
079   
080       while (defined($user=readdir(DIR))){   # ディレクトリー名の取得
081       if((-d $home_dir.'/'.$user) && 
082          ($user ne ".") && ($user ne "..")){
083           push(@user_list, $user);
084       }
085       }
086       
087       foreach(@user_list){                   # tarを使ってバックアップ
088       $ret=system("tar cPfz $backup_dir/$today/$backup_HOME/$_.tar.gz \\
089                         $home_dir/$_");
090       printf LOG "backup home dir\t$_\t\t$ret\n";
091       }
092   
093       closedir(DIR);
094   }
095   
096   #============================================================================
097   # データベースのバックアップ
098   #============================================================================
099   sub db_backup(){
100       my $database, @list;
101       my $ret;
102   
103       $database = 
104       `$mysql -u $db_user --password=$db_passwd -e "show databases" | 
105                grep -v Database`;
106   
107       print $database;
108   
109       @list = split(/\n/,$database);
110   
111       foreach(@list){
112       if($_ eq "information_schema" || $_ eq "performance_schema" || $_ eq "mysql"){next;}
113       $ret =  system("$db_dump -u $db_user --password=$db_passwd $_ > \\
114               $backup_dir/$today/$backup_DB/$_.DB.sql");
115       printf LOG "backup data base\t$_\t\t$ret\n";
116       }
117   }
118   
119   #============================================================================
120   # 期限の過ぎたバックアップの削除
121   #============================================================================
122   sub rm_old_backup(){
123       my $dir, @dir_list;
124       my $ret;
125   
126       opendir(DIR, $backup_dir);
127   
128       while (defined($dir=readdir(DIR))){   # ディレクトリー名の取得
129       if((-d $backup_dir.'/'.$dir) && 
130          ($dir ne ".") && ($dir ne "..")){
131           push(@dir_list, $dir);
132       }
133       }
134   
135       close DIR;
136   
137       @sort_dir_list = sort{$a<=>$b}@dir_list;
138   
139       for($i=0; $i<@sort_dir_list; $i++){
140       if(($i < @sort_dir_list-1) && ($sort_dir_list[$i]<$oldday)){
141           $ret = system("rm -rf $backup_dir/$sort_dir_list[$i]");
142           printf LOG "delete old backup\t$sort_dir_list[$i]\t$ret\n";
143       }
144       }
145   }
146   
147   

定期的に実行

いざというときに大事なデータを復旧させるためには,まめにバックアップ作業を行っておく必要があります.サーバーのハードディスクが壊れたとき,バックアップは二年前のものしかないとなると泣けてきます.定期的にコマンドを実行させるには,cron を使うのが良いでしょう.私の場合は,1週間に1回バックアップをとれば十分なので,cronの設定ファイル「/var/spool/cron/crontabs/root」に以下を追記しました.

02 04 * * 2 mount -a
03 04 * * 2 /root/BackUp/backup.pl

これで,毎週火曜日の AM 04:03 に定期的にバックアップスクリプトが実行されます.その前の AM 04:02 にファイルをマウントするコマンド「mout -a」が実行されます.理由は分かりませんが,外部のディスクがマウントポイントから外れることがあるからです.

確認

動作の確認は,以下のように行います.

  1. cron の動作の確認
    $  service cron status
  2. cron によって実行されるコマンドの表 (table) の表示
    $ sudo cronrab -l

手動でバックアップ

スクリプトの起動

自動バックアップのスクリプト (backup.pl) を,手動で実行させます.これが最も簡単なバックアップ方法です.

$ sudo /root/BackUp/backup.pl

完全手動

samba で WEB サーバーのホームディレクトリーを共有しているので,バックアップ (コピー) は簡単です.データベースのバックアップは,「データの引っ越し」のとおりです.

Dropbox

Dropbox はクラウドにファイルが保存されるとともに,複数の PC でファイル共有ができるので便利です.

インストール

Linux 64 ビット版のインストールは,以下のようにします.

$ cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

サーバーでは GUI は使えないので,コマンドラインで操作できるようにします.Python プログラムをダウンロードし,実行可能にします.

$ sudo wget 'https://www.dropbox.com/download?dl=packages/dropbox.py' -O /usr/local/sbin/dropbox
$ sudo chmod u+x /usr/local/sbin/dropbox

これは,不要かも.初回のインストールと実行します.

$ sudo dropbox start -i

次に,一般ユーザーでも dropbox コマンドが使えるようにします.

$ sudo chown ユーザー名 /usr/local/sbin/dropbox

この dropbox コマンドは「dropbox コマンド オプション」で構成され,様々な設定が可能です.コマンドは「dropbox help」で調べることができます.あるいは「dropbox help コマンド」でオプションまで調べることが可能です.容易されているコマンドは以下の通りです.詳細は「Linux で Dropbox を利用する」を参照してください.

コマンド 動作
autostart ログイン時に,自動的に Dropbox をスタートします.
exclude ディレクトリを同期から除外します.
filestatus ファイルの同期のステータスを取得します.
help ヘルプを表示します.
lansync LAN 同期機能の有効/無効の設定を行います.
ls 現在の同期ステータスでディレクトリの内容を一覧表示します.
proxy Dropbox のプロキシの設定を行います.
puburl DropboxのパブリックフォルダにあるファイルのパブリックURLを取得します.
running Dropboxが実行されているかどうかを返します.
sharelink Dropbox 内のファイルの共有リンクを取得する.
start dropboxd (Dropbox デーモン) の開始.
stop dropboxd (Dropbox デーモン) の停止.
throttle Dropbox のバンド幅の制限の設定.
update 最新バージョンの Dropbox のダウンロードします.
version Dropbox のバージョン情報の表示.

設定

同期するディレクトリー

Dropbox で同期するディレクトリーを作成します.

$ mkdir ~/Dropbox

次に,Dropbox を起動します.

$ dropbox start

同期するファイルの設定を行います.そのためのコマンドは,以下のとおりです.

コマンド 動作
dropbox filestatus ファイルの同期状況を確認します.
dropbox exclude 同期の対象になっていないディレクトリのリストを表示します.
dropbox exclude add [ディレクトリ] [ディレクトリ] … 同期削除ディレクトリーリストに追加します.
dropbox exclude remove [ディレクトリ] [ディレクトリ] … 同期削除ディレクトリーリストから削除します.

自動起動

アップグレード (14.04 LTS)

Ubuntu server 12.04 LTS から,14.04 LTS にアップグレードします.

まずは,コマンド 「lsb_release -a」 を使い現在のバージョンを確認します.

lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.5 LTS
Release:        12.04
Codename:       precise

コマンド 「sudo do-release-upgrade -d」 を使う.

$ sudo do-release-upgrade

ページ作成情報

参考資料

  1. IPアドレスを通知するスクリプト(IP_update.pl)は,あにょの自宅サーバ構築メモ(Fedora)の「IPアドレス自動更新スクリプト」を参考にしました.
  2. Ubuntu server 14.04 LTS へのアップグレード方法は,「ubuntu server 12.04 LTSを14.04 LTSにアップグレード」を参考にしました.
  3. Dropbox のインストール方法は,インストール — Dropbox を参考にしました.
  4. Dropbox の設定は「UbuntuサーバーでDropboxでファイルを同期する」が詳しいです.また,「CUI環境のDebian 64bit版でDropboxを使う」も良いです.
  5. Dropbox のコマンドは「Linux で Dropbox を利用する」が詳しいです.

更新履歴

2012年09月頃 ページの新規作成


no counter