SSMTPによるメール送信環境の構築

さて、サーバーとして運用するからには少なくともレポートメールの送信ぐらいはできないと困る。しかし、メールの送信は必要だが受信は不要なので、それにもってこいな送信専用sendmailであるSSMTPをインストールしよう。

apt-get install ssmtp

で、インストールされたら/etc/ssmtp/ssmtp.confを設定する。

root=***@***.*** (ルート宛メールの転送先のアドレスを設定)

mailhub=mail.asahi-net.or.jp:587 (asahi-netのSMTPサーバーはFrom:アドレスが自由なので、こういうメールリレーハブの投げる先にはもってこい。もちろんプロバイダーにお金払ってるからできることだけど)

AuthUser=***

AuthPass=***

AuthMethod=cram-md5 (asahi-netのSMTP認証に必要な情報をベタ書き。セキュリティー的にはよろしくないけど対策は後述)

#rewriteDomain= (自ドメインのFrom:じゃないとSMTPリレーを拒否するサーバーの場合に、送信されたメールの発信元ドメインを書き換える設定。asahi-netの場合は問題なしなので、コメントアウトのままで)

hostname=***.*** (これも同じくFQDNでダイナミックDNSのホスト名を)

#FromLineOverride=YES (ユーザーが好きなFrom:アドレスを書いてもいいという設定だがrootのレポートメールだけなら不要なのでコメントアウトのままで)

以上で設定完了。しかし、このままではベタ書きにした認証情報が誰にでも見える状態になっているので気持ち悪い。ところが、ssmtp.confファイル自体はメールを送信する人にreadパーミッションを許可しないとそもそもメールが送れない。そこで、今回はmailグループに入ってる人だけメールが送れるようにする。

gpasswd -a %user% mail (まずは自分をmailグループに加える)

chown root:mail /etc/ssmtp/ssmtp.conf

chmod 640 /etc/ssmtp/ssmtp.conf

これでrootとmailグループに入ってる人しかファイルを読めないので一応は大丈夫。あとはユーザーからメールが送信できるかテストする。

echo  “This is a test mail.” | mail -v -s “Test mail” root

-vオプションのおかげで正しくリレーハブとの間でネゴシエーションが行われているかどうか確認できる。これでメールが無事に届けばテスト成功!

 

外部からのサーバーアクセス環境の構築

さて、外部からサーバーにアクセスできないと意味がないので、ダイナミックDNSに登録する。幸い、今のルーターはいくつかのダイナミックDNSで自動更新が可能なので、とりあえずNo-IPに無料アカウントを作成してホスト名を登録した。これをルーターのDDNSに設定して、IPの自動更新をさせる。

次に、ルーターのDHCPの設定でRaspberry Pi 2のMACアドレスには自動的に同じIPが割り当てられる様に設定。こうしておかないとポート転送が設定できない。

最後にまずはSSHのポート22だけをRaspberry Pi 2に転送するように設定する。これで外部から気が向いたときにダイナミックDNSのホスト名でSSHしていじれるようになった。いずれサービスを提供するときは、適宜新しいポートを開いていこう。必要なポートだけしか開かなければRaspberry Pi 2側でファイヤーウォールの設定をする必要もないしね。 🙂

 

Raspberry Pi 2によるサーバー構築 その3

さて、初期設定が完了したところで、まずは最低限の環境構築。ここからはルート作業なのでsudo -sしておくとよい。

apt-get update

apt-get dist-upgrade

システムが最新になったところで、今度はファームウェアも最新にしておこう。といってもRaspberry Pi 2にはオンボードの記憶領域がないので、実はこれはSDカードの隠しエリアに書き込まれる。起動時にはそこからファームウェアを読み込んで起動するというわけだ。

まずはツールをインストール。

apt-get install rpi-update

rpi-update

ここで問題発生。なぜかTranscendのSDカードだと、この後再起動した時点でSDカードへのアクセスがエラーになって起動できなくなる。いろいろ調べた結果、誰もが単純にTranscendはクソ、という結論だったので、あきらめてSandisk Ultraに変えてみたところ、なんのエラーもなくすんなりアップデート後にも起動した。なんだかなあ。

というわけで、ファームウェアのアップデートを完了したら有効にするために再起動。

再起動後はデフォルトユーザーのpiを無効にしておきたい。

というわけで、まずはadduserで新規ユーザーを作成する。もちろんルート作業。

adduser %user% (%user%はお好きなユーザー名)

gpasswd -a %user% sudo (sudoできるようにsudoグループに追加する)

ここで一度ログアウトして今度は作成したユーザーでログインしなおす。あとはデフォルトユーザーを無効にするだけ。実はRaspbian Jessieだと自動でデフォルトユーザーでデスクトップが立ち上がる設定になってるので、これをraspi-configから無効にしないとデフォルトユーザーを削除できないのだが、LITEではオートログインには設定されていないので単純に削除できる。

deluser -remove-home pi

これで新規サーバーの最低限の構築が完了した。

 

Raspberry Pi 2によるサーバー構築 その2

さて、ハードウェア的にはセットアップが完了したので、あとはターミナルからのアクセスで全てを行う。まずは初期セットアップのためのログイン。Rasbpianは最初からsshサーバーが起動しているのでsshでアクセス。さて、ホスト名だが、これも最初からavahiが稼働していてmDNSで名前を解決できる。不思議なことに、Raspbian Jessieではraspberrypi-2.localだが、LITEだとraspberrypi.localになっている。mDNSが引けないOSではなんとか頑張ってください。

ssh pi@raspberrypi.local

初期ユーザーはuser:pi,passwd:raspberryなので、これでログインする。ログインできなかったらハードウェア的に何か問題が起きているのでヘッドレスでのセットアップはあきらめてください。ログインしたら初期設定。

sudo raspi-config

ここでやることはルート領域の拡張、ロケールの設定、タイムゾーンの設定、そしてホスト名の設定だ。順番にやっていく。

ルート領域の拡張はSDカードの余っている部分いっぱいにルート領域を拡張する作業。これをやっておかないともったいない。

ロケールはja_JP.UTF-8にチェックを入れて、これをデフォルトロケールにする。これでターミナルアクセスで日本語でいろいろメッセージが表示される。

タイムゾーンは設置場所次第で。

ホスト名は、デフォルトでもいいんですが、それじゃまあ味気ないよね。 😛

全て完了したらraspi-configを抜けると自動的に再起動する。しばしまったら新しいホスト名を使ってsshで再ログインしてdf -hでちゃんとルートが拡張されてることを確認しておこう。

 

Raspberry Pi 2によるサーバー構築 その1

自宅にメンテナンスの簡単なサーバーを新たに構築しようと思ったが、いまさらPCサーバーを新しく構築するというのも面白くないので、Raspberry Pi 2を使うことにした。

買ったのはRaspberry Pi 2と専用ケース。Class 10 32GBのmicroSDはTranscend製が安かったので買ったのだが、これは失敗だった。これについては後述。後日、Sandisk Ultraに買い替えた。

運用は、1.5A供給のUSBチャージャーからmicroUSBで給電、短小イーサネットケーブルでルーターの空いてるポートに有線直結。あとはディスプレイもキーボードも全く繋がない状態でセットアップから運用までやってしまおう。

さて、最初にセットアップに必要なイメージをmicroSDに書き込む必要がある。一般的なセットアップではNOOBを選ぶのだが、これはデスクトップとして設定するためのもの。ここは最初からRaspbian Jessie LITEのイメージをダウンロードする。unzipしてimgファイルを取り出しておく。

さて、イメージを焼くのにOS Xを使うので、OS X用のイメージ焼きツールをダウンロード(https://alltheware.wordpress.com/2012/12/11/easiest-way-sd-card-setup/)する。ddでもいいんだけど、面倒なのでね。Safariでアクセスするとなぜかダウンロードできないので、ChromeでアクセスしてRPi-sd card builderをダウンロードして準備。

さて、ここでSDカードをカードリーダーに挿入。ディスクユーティリティーからMBRパーティション、MS-DOS(FAT)フォーマットで初期化する。初期化が完了したらRPi-sd card builderでRaspbian Jessie LITEのイメージを指定してSDカードに書き込む。完了したらSDカードをRaspberry Pi 2のmicroSDカードスロットに差し込む。SDカードの表面がRaspberry Pi 2の底面側になるので注意。

これで準備完了。microUSB給電して起動。Raspberry Pi 2には電源スイッチはないので、給電したら即起動する。しかし、この時点ではヘッドレスなので何が起きてるかは分からない。とほほ。これがサーバー運営の醍醐味って奴かな。

 

オンライン / パーティション拡張

さすがに、カーネルのアップデートが出る度にいちいち旧カーネルを先にパージなんてことをしていたらいつ起動不能になるかわかったものではないので、なんとか / パーティションを拡張する方法はないかと考えていたら、実は / パーティションはLVMで管理されていることに気がついた。 🙂

sudo /sbin/lvscan

ACTIVE ‘/dev/bam-system/root’ [332.00 MiB] inherit
ACTIVE ‘/dev/bam-system/usr’ [8.38 GiB] inherit
ACTIVE ‘/dev/bam-system/var’ [2.79 GiB] inherit
ACTIVE ‘/dev/bam-system/swap_1’ [5.52 GiB] inherit
ACTIVE ‘/dev/bam-system/tmp’ [380.00 MiB] inherit
ACTIVE ‘/dev/bam-system/home’ [38.27 GiB] inherit

しかもext4フォーマットだからオンラインで拡張処理が出来る。ということは、どこかのパーティションを減らせば、それを拡張に割り当てることが出来るというわけだ。

ただ、縮小処理はアンマウントしないといけないので、ありあまってる /home から取るのはちょっとリモート操作では躊躇われる。なので、ここはぐっと我慢してswapを少し減らしてそれを / に回すことにしよう。

ますは、swapをオフラインにする。

sudo swapoff -a

次に swap パーティションを300MBほど減らす。

sudo /sbin/lvreduce -L -300M /dev/bam-system/swap_1

lvscanで無事にサイズが減ってることを確認したら再びswapをオンにするために、新しいswapを作成する。

sudo /sbin/mkswap /dev/bam-system/swap_1

sudo swapon /dev/bam-system/swap_1

さて、pvscanを使って、LVMに空きが300MB出来てることを確認しよう。

sudo /sbin/pvscan

PV /dev/sda5 VG bam-system lvm2 [55.66 GiB / 300.00 MiB free]
Total: 1 [55.66 GiB] / in use: 1 [55.66 GiB] / in no VG: 0 [0 ]

よしよし。空きを300MB確保出来た。次はext4のオンライン拡張だが、これはまずボリューム割当を増やし、そしてファイルシステムを拡張するという二段階を踏む必要がある。

sudo /sbin/lvextend -L +300M /dev/bam-system/root

減らした300MB分だけ / パーティションを増やす。念のため、容量をlvscanで確認。

sudo /sbin/lvscan

ACTIVE ‘/dev/bam-system/root’ [632.00 MiB] inherit
ACTIVE ‘/dev/bam-system/usr’ [8.38 GiB] inherit
ACTIVE ‘/dev/bam-system/var’ [2.79 GiB] inherit
ACTIVE ‘/dev/bam-system/swap_1’ [5.22 GiB] inherit
ACTIVE ‘/dev/bam-system/tmp’ [380.00 MiB] inherit
ACTIVE ‘/dev/bam-system/home’ [38.27 GiB] inherit

というわけで、計632MBに増えていることが確認出来た。linux-imageのサイズがだいたい170MBぐらいなので、この分だと3カーネルは保持出来る。十分だ。

ここで、祈れるものには何でも祈りながら、ext4のオンライン拡張を実行する。

sudo /sbin/resize2fs /dev/bam-system/root 632M

無事に完了したらファイルシステムが実際に増えていることを確認しよう。

df -h

なんとか延命完了。

 

/ 容量不足

このサーバーのパーティションはDebianのインストーラーのデフォルトのままにしてあるのだが、wheezyからjessieへのアップグレードで問題発生。

なんと、肥大化したlinuxのmoduleが/libを圧迫して、/の容量の半分を超えるまでになってしまったのだ。

結果、linux-imageにアップデートがあっても容量不足でインストールできないという事態に。さすがにこれはまずいが、現状、サーバーを構築し直す余裕はないので、危険を承知で一旦linux-imageをパージしてから再インストールするという手段をとらざるをえない。

以下、手順。

screen (セッション中断に備える)

sudo apt-get dist-upgrade (アップデートに失敗するが、パッケージのダウンロードは完了させる)

sudo dpkg -l | grep linux-image (インストールされてるパッケージのバージョンナンバーを確認)

sudo apt-get purge linux-image-3.16.*-*-amd64 (*はバージョンナンバーを指定してパッケージのパージ。警告が出るが強行する)

sudo apt-get install linux-image-amd64 (即座に再インストール。ダウンロード済みのパッケージが使われる。grubが正しく新しいカーネルを利用してることを確認する)

sudo apt-get dist-upgrade (アップデートし残しがないか確認)

exit (screenから抜ける)

sudo shutdown -r now (運を天に祈る)