FreeBSD (10)


iMac5,1にFreeBSDをインストールする話Vol.1

iMac5,1(12年ほど前の機種)にFreeBSD 11.2(最新バージョン)の「i386 DVD」(CDだと止まる)を入れて起動してみたら、なんとインストーラが起動! さっそくそのまま成功例の多いzfsでbsdinstallまかせでバッと入れて再起動したら、iMacのブートローダに出現! やった!
でも、テキトーにブートコードを入れたらダメでした。

# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0

Snow LeopardのインストールCDを入れてblessしてもダメ。

# bless –device /dev/ada0

ブートローダから消えて焦ったけど、DVDのシェルから以下を打ち込んでリブートしたら復活。

# gpart bootcode -b /boot/pmbr -p /boot/boot1.efifat -i 1 ada0

でもなぜかブートオプションを表示させて(opt押しながら起動)からでないと起動しない…。何とかしたいなーと思いつつ起動させたら、デーモンが表示された。超嬉しかったけど糠喜びで、kernelを読み込んだ直後にフリーズ…なんでや…。

loader promptでなんとかしてみようとしたけど、知識がボロカスになくて不可。ああ…また調べなきゃ…。

だれかタスケテー。

I write my issue in English with effort.

I tried to install with the i386 DVD of the newest FreeBSD 11.2 and it booted! (The installer stopped displaying “CD press any key” when I inserted i386 CD.)
Then I proceeded installing with the easy bsdinstall and installed zfs which many people succeeded with. After completeing install and entered below from the console of temporary Snow Leopard CD:

# bless –device /dev/disk0s1

I made it reboot, then the boot process appeared with the daemon head! Yatta!
But it freezed displaying “Booting…” so I rebooted with DVD and entered a line below:

# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0

After rebooting, iMac failed recognizing HDD UFS! Sad!
Quickly I rebooted and entered this line from FreeBSD console of DVD:

# gpart bootcode -b /boot/pmbr -p /boot/boot1.efifat -i 1 ada0

Then the daemon appeared again! and… freezed. Why!

Help me anyone…




WSGIDaemonProcessの謎

mod_wsgiを設定してみた。
環境は FreeBSD11 + Apache24。

ハマったのは、venv のパス。

/usr/local/lib/python3.6/venv

とかに設定してもダメ。encodings というモジュールがないです、と言われてしまう。

どうも大事なのは以下のコマンド。バーチャルホストのホームディレクトリ(あるいはApacheのドキュメントルートのひとつ上あたりのディレクトリ。要するにPythonアプリケーションをインストールしたあたり)で以下を実行する。

$ python -m venv ./venv

したらば、Apacheの設定ファイルに以下のような設定を書く。

<VirtualHost 127.0.0.1:80>
    ServerName www.example.com
    DocumentRoot /path/to/www.example.com/htdocs
    WSGIDaemonProcess www.example.com python-home=/path/to/www.example.com/venv threads=5
    WSGIProcessGroup www.example.com
    WSGIScriptAlias /myapp/ /path/to/www.example.com/myapp/myapp/wsgi.py process-group=www.example.com
    WSGIScriptReloading On
    <Directory /path/to/www.example.com/pyapp/pyapp>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
</VirtualHost>

python-home=/path/to/www.example.com/venv は、さっき作った venv ディレクトリの絶対パス。

これでなんとか動きました。
が…。
今度は、djangoが認識されない。アプリをウェブから叩いて動かそうとすると、「djangoモジュールが見つからないです」(意訳)とapacheのエラーログに吐き出される。

どうして!? Django公式ドキュメント通りにやってるのに!
と悩むことしばし。

ふと基本に立ち返って「rootじゃダメだよなぁ」と、バーチャルホストのユーザーに切り替えて、バーチャルホストのユーザーディレクトリであれこれコマンドを打ち込んだら、なんとかなった。

わたしがハマった最大の要因は、すべての作業を root で行ったこと。
本来はバーチャルホストのユーザーで行わなくてはいけない。
(わたしはバーチャルホストごとにユーザーを分けています)

そして、バーチャルホストのユーザーディレクトリで完結するように「環境」を整えないといけない。
さすがはPython! PHPとは違う。

$ cd www.example.com
$ python -m venv ./venv
$ ./venv/bin/pip install django
$ ./venv/bin/django-admin startproject myapp
$ ... (以下python公式ドキュメントと同じ。)

こんな感じで、バーチャルホストのディレクトリで作業を完結させる。
すると、「モジュールないですエラー」は出なくなる。

次の問題は…「myappモジュールないですエラー」
わけがわからない…。




Nginx+Apache×2+SSL(+WordPress)

獲得目標は以下の通りです。
●SSLの設定をしたNginxでリバースプロキシをさせて、バックエンドのApacheに渡す。
●Wordpressも動くようにする。

ではさっそく。

Nginx(エンジンエックスと読むそうですね!):

http {
    upstream MidgenasiaServers {
        # バックエンドサーバーの設定をします。
        server 10.0.0.80:8080; # 8080番ポートでhttp通信をListenしているIP 10.0.0.80上のApache 
        server 10.0.0.81:8080; # 8080番ポートでhttp通信をListenしているIP 10.0.0.81上のApache
    }
    upstream OtherServers {
        # こちらもバックエンドサーバーの設定です。上と同じサーバーに格納されている想定です。
        server 10.0.0.80:8081;
        server 10.0.0.81:8081;
    }
    server {
        # http通信はすべてhttpsに301リダイレクトします。
        listen 80;
        return 301 https://$host$request_uri;
    }
    server {
        listen 443 ssl;
        server_name  www.midgen.asia;
        charset utf-8;

        # SSL
        ssl_certificate      path/to/server.crt;
        ssl_certificate_key  path/to/server.key;
        ssl_session_cache  builtin:1000  shared:SSL:10m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
        ssl_prefer_server_ciphers  on;
        # server.keyにパスフレーズを指定してある場合はたぶん必要。パスフレーズだけ書いておけばOK。
        ssl_password_file path/to/server-password;

        location / {
            # upstreamの場所で指定した名称をここに書きます。
            proxy_pass          http://MidgenasiaServers;
            proxy_redirect      off;
            proxy_set_header    Host    $host;
            proxy_set_header    X-Real-IP    $remote_addr;
            proxy_set_header    X-Forwarded-Proto     https;
            proxy_set_header    X-Forwarded-Host      $host;
            proxy_set_header    X-Forwarded-Server    $host;
            proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        }
    }

    # 2つ目のドメインの設定も続けて書きます。
    server {
        server_name  www.another.domain.com;
        charset utf-8;

        ssl_certificate      path/to/another.domain.com.crt;
        ssl_certificate_key  path/to/another.domain.com.key;
        ssl_session_cache  builtin:1000  shared:SSL:10m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
        ssl_prefer_server_ciphers  on;
        ssl_password_file path/to/another.domain.com-password;

        location / {
            # 上記と同様に、upstreamの場所で指定した名称をここに書きます。
            proxy_pass    http://OtherServers;
            proxy_redirect      off;
            proxy_set_header    Host    $host;
            proxy_set_header    X-Real-IP    $remote_addr;
            proxy_set_header    X-Forwarded-Proto     https;
            proxy_set_header    X-Forwarded-Host      $host;
            proxy_set_header    X-Forwarded-Server    $host;
            proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        }
    }
}

※要旨に関係がないコメントや設定は削除してあります。

Apache:

Listen 8080
Listen 8081

>VirtualHost 10.0.0.80:8080<
    ServerName www.midgen.asia
    DocumentRoot "/path/to/midgen.asia.htdocs"
>/VirtualHost<

>VirtualHost 10.0.0.80:8081<
    ServerName www.gowest-comewest.net
    DocumentRoot "/path/to/another.domain.com.htdocs"
>/VirtualHost<

ここまででNginx+SSLとラウンドロビンなApacheは完成。
あとは…Wordpress。リバースプロキシ+SSLという環境下では、特殊な記述をwp-config.phpに加える必要があるようです。

WordPress(wp-config.phpの上のほうに書きます):

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
    && $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
  $_SERVER['HTTPS'] = 'on';
}
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

参考: WordPressをhttps化してnginx reverse proxy配下で使うには

これでWordpressのCSSやJavaScriptが読み込まれないという状況も打破できます。

できてよかった!




samba4.8でファイル共有

いつものことながら詰まりまくったのでまとめておく。

smb4.confについては、毎度の通り調べて書くわけですが、その際に忘れてはいけないのが、以下。セクションはマウントポイントの名前で大丈夫。

security = user
ntlm auth = yes

次はマウント。最低限必要なのは以下。文字コード等は適当に合わせる。

mount_smbfs -I smb.example.com //user@smb.example.com/mnt /mnt

smb.example.com はIPアドレスでもかまわない。

/mnt はマウントポイント。

/サーバー /クライアント

とする。

そして自動マウント。/etc/fstab に書く。noauto である理由はよくわからないのだけど、ネットワーク越しのマウントだから、完全自動ではなく接続が安定しているときにマウントすべし、ということであろう。もし気になるのであれば調べてください。

//user@smb.example.com/mnt /mnt smbfs rw,-I smb.example.com,-N,noauto

仕上げに、 snmb.conf に自動ログインの記述をする。ファイルの末尾に、

[SMB.EXAMPLE.COM:USER]
user=user
password=yourpassword

などと書く。パスワードはできれば暗号化して、ファイルのパーミッションを600などにするのが望ましい。

マウントは以下のようにコマンドを打てばOK。

mount /mnt

以上!




MySQLが立ち上がらなくて

RaspberryPi3(この、今ご覧になっているサイトのサーバー)のMySQL80-serverが立ち上がらなくなった。
原因は、急に電源を落としたこと。

/var/db/mysql/****.err の中に見つかったエラーメッセージは、こんな感じ。

2018-04-12T13:21:02.033081Z 0 [ERROR] I/O error reading the header from the bina
ry log, errno=175, io cache code=0
2018-04-12T13:21:02.033284Z 0 [ERROR] I/O error reading the header from the bina
ry log
2018-04-12T13:21:02.033352Z 0 [ERROR] Can't init tc log
2018-04-12T13:21:02.033446Z 0 [ERROR] Aborting

ログファイルがおかしいようである。というわけで調べてみた。
見つかったのは以下のブログ。
http://raafat.tawasol.net/mysql-crashes-io-error/

要約すると「怪しいログファイルを削除せよ」

そう言われてもわたしにはよくわからなかったので、

find /var/db/mysql/mysql-bin\* | xargs tar zcvf /tmp/mysql-bin.tgz

などとして退避し、さらにそれらのログをすべて削除したのち、

server mysql-server start

無事起動しました!




FreeBSDのコンソールに日本語を表示できるようにする設定

以下の記事を参考にしました。

確かにできました! うれしい!!!

日本語表示できた



さくらのレンタルサーバー[スタンダードプラン FreeBSD]にsubversionを入れる方法

FreeBSD環境下におけるsubversionのインストールにはほんのちょっとだけ工夫がいるのでした。

[参考] https://apr.apache.org/compiling_unix.html

“Note that if you are compiling directly from the Subversion repository, you’ll need GNU autoconf and GNU libtool installed, and you’ll need to run ./buildconf before running the commands listed above.”だそうです。わたしは気がついたけれど、気づかないひともおられるかも、ということで、書き残しておきます。

あと、非技術者だけどさくらのレンタルサーバーにsubversionを入れたい、というひとのために。

※ ホームディレクトリが散らかるので、それが嫌なひとは ~/src みたいなディレクトリを作って作業するといいと思います。作業が終わったあとでまとめて消せてラクです。
※ わたしは ~/local というディレクトリを作ってその中にインストールしましたが、作らずに ./configure –prefix=$HOME などとやっても大多数のひとにはたぶん問題ないです。その場合はパスを通す作業は必要ないです。
※ aprとsubversionのバージョンは、特別な理由がない限り、最新のものをそろえたほうがいいと思います。

[準備]
% cd
% fetch http://ftp.jaist.ac.jp/pub/apache/apr/apr-1.5.2.tar.bz2
% fetch http://ftp.jaist.ac.jp/pub/apache/apr/apr-util-1.5.4.tar.bz2
% fetch http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/subversion/subversion-1.9.5.tar.bz2
% tar jxf apr-1.5.2.tar.bz2
% tar jxf apr-util-1.5.4.tar.bz2
% tar jxf subversion-1.9.5.tar.bz2
% mkdir local

[apr]
% cd $HOME/apr-1.5.2/
% ./buildconf
% ./configure --prefix=$HOME/local
% make test
% make
% make install

[apr-util]
% cd $HOME/apr-1.5.4/
% ./buildconf --with-apr=$HOME/apr-1.5.2
% ./configure --prefix=$HOME/local --with-apr=$HOME/apr-1.5.2
% make test
% make
% make install

[subversion]
% cd $HOME/subversion-1.9.5/
% ./configure --prefix=$HOME/local --with-apr=$HOME/apr-1.5.2 --with-apr-util=$HOME/apr-util-1.5.4
% make test
% make
% make install

[パスを通す]
% vi ~/.cshrc
% source ~/.cshrc

set path の最後に $HOME/local/bin をつけ足す。以下のようになります。

set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin $HOME/local/bin)

[動作確認]
% cd
% svnadmin help
>>> 実行結果が表示されれば成功! <<<

[かたづけ]
% cd
% rm -rf apr-* subversion-1.9.5*

以上。




FreeBSD12 on Raspberry pi 3: Installing Device::BCM2835 version 1.9

ハマってしまってものすごく苦労したので簡単にメモにします。

bcm2835.h というのを以下から入手して、解凍の上、インストールします。

http://www.airspayce.com/mikem/bcm2835/

ここまではOKですよね。解凍は tar zxf ****.tar.gz 的な。解凍時間は一瞬のはずです。

次に、以下のページを確認しましょう。bcm2835のインストールの次のDevice::BCM2835のインストールで、わたしも同様のエラーに見舞われました。解決策は一番下に書いてあります。

https://github.com/momenso/node-dht-sensor/issues/33

「-fPICをつけて再度コンパイルせよ」と言われるのですが、その対象を見誤るわけです。BCM2835.oではなく、bcm2835そのものである、ということに気がつくまでに数時間・・・。

./configure
make CFLAGS='-g -O2 -fPIC'
make check
make install

でbcm2835のビルド→インストールはOKです。

次は、Device::BCM2835。上記の下準備がしてあれば、パッケージ中のREADMEの通りにやれば大丈夫です。

fetch http://search.cpan.org/CPAN/authors/id/M/MI/MIKEM/Device-BCM2835-1.9.tar.gz
tar zxf Device-BCM2835-1.9.tar.gz
cd Device-BCM2835-1.9
perl Makefile.PL
make
make test
make install

以上。




外部ドライブとして GW3.5AX2-SU3/REV2.0 を使用する際の問題

この GW3.5AX2-SU3/REV2.0 には「電源連動機能」という機能が備わっており、そのせいでHDDの起動が遅れるため、起動時にRaspberry pi側で認識されず、fstabに書いておくとエラーで起動しないという問題がありました。
その際のマウントについての記事です。

fstabでマウントできないのはどうしようもないので、起動後にcronで「マウントされていなければマウントする」的なスクリプトを定期的に実行させます。

まず、ファイルシステムがcleanでないとマウントしてくれないので、/etc/crontab に以下のように書き込みます。

@reboot /sbin/fsck -Fy /dev/da0p1
@reboot /sbin/fsck -Fy /dev/da0p2
@reboot /sbin/fsck -Fy /dev/da0p3
@reboot /sbin/fsck -Fy /dev/da1p1
@reboot /sbin/fsck -Fy /dev/da1p2
@reboot /sbin/fsck -Fy /dev/da1p3

自動マウントしてもらうスクリプト automount.sh は、以下のようにしました。
df | grep “mirror” | wc -l というコマンドの結果がマウントすべきデバイス数に到達するまで、マウントを実行します。

#!/bin/sh

DEVICE_N=3
COUNT=`/bin/df | /usr/bin/grep "mirror" | /usr/bin/wc -l`

if [ $COUNT -lt $DEVICE_N ]; then
        /sbin/gmirror load
        /sbin/mount -aF /etc/fstab.afterboot
fi

これを、/etc/crontab に追記します。chmod も忘れずに。

@every_minute   root /root/automount.sh

fstab.afterboot を指定して、マウントのトライをしています。
fstab.afterboot は以下の通りです。

# fstab read by /root/automount.sh
/dev/mirror/disk1       /home           ufs     rw      1       0
/dev/mirror/disk2       /usr/local      ufs     rw      1       0
/dev/mirror/disk3       /var/dbms       ufs     rw      1       0

RAID1 の設定は、FreeBSDのマニュアルを見ながらやってください。Google先生に尋ねるのもいい方法です。

わたしの環境での gmirror list の結果は、以下の通りです。

# gmirror list
Geom name: disk3
State: COMPLETE
Components: 2
Balance: round-robin
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 3676360296
Providers:
1. Name: mirror/disk3
   Mediasize: 33837202944 (32G)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e1
Consumers:
1. Name: da1p3
   Mediasize: 33837203456 (32G)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: DIRTY
   GenID: 0
   SyncID: 1
   ID: 528158967
2. Name: da0p3
   Mediasize: 33837203456 (32G)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: DIRTY
   GenID: 0
   SyncID: 1
   ID: 1200476790

Geom name: disk2
State: COMPLETE
Components: 2
Balance: round-robin
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 1608483283
Providers:
1. Name: mirror/disk2
   Mediasize: 53687090688 (50G)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e1
Consumers:
1. Name: da0p2
   Mediasize: 53687091200 (50G)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: NONE
   GenID: 0
   SyncID: 1
   ID: 1738622893
2. Name: da1p2
   Mediasize: 53687091200 (50G)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: NONE
   GenID: 0
   SyncID: 1
   ID: 4277851247

Geom name: disk1
State: COMPLETE
Components: 2
Balance: round-robin
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 1382660050
Providers:
1. Name: mirror/disk1
   Mediasize: 912680549888 (850G)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e1
Consumers:
1. Name: da1p1
   Mediasize: 912680550400 (850G)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: NONE
   GenID: 0
   SyncID: 1
   ID: 3428454778
2. Name: da0p1
   Mediasize: 912680550400 (850G)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: NONE
   GenID: 0
   SyncID: 1
   ID: 1625864176

これで、なんとかなりました。起動に時間はかかりますが、確実に立ち上がるので、良しとしています。
ご参考まで。




Mysql5.6 on Raspberry pi 2: サーバーを落ちないようにする

mysqldが落ちて落ちてしかたがない! という状況に陥ったわたしが探し当てた解決策。

大したことではないですが、初心者には大事なこと。

http://easyramble.com/example-of-mysql-options.html

上記ウェブサイトで紹介されていた設定を以下のように変えてmy.cnfに単純に追記しただけで、落ちなくなりました。

max_connections = 3
max_user_connections = 1

単純に、接続制限をかけただけです。が、効果はてきめん!
F5攻撃を行っても、単に接続エラーが発生するだけで、落ちなくなりました。

ついでにhttpd(apache24)のmpmの設定でも接続制限をして、ひと安心。