トラブルシューティング

はじめに

FreeBSDサーバーを運用していて、いろいろトラブルがあり動かないソフトがあったりしたときの対応策をまとめてみます。
ほとんどばブログに書いてあるのをまとめただけだが。

portsdb -Uでエラー

# portsdb -U
Updating the ports index ... Generating INDEX.tmp - please wait.."Makefile", line 56: Could not find bsd.port.options.mk
make: fatal errors encountered -- cannot continue
===> sysutils/apcupsd failed
*** Error code 1

対策は

@/usr/ports を一旦削除
Acvsupで最新版portsを全部ダウンロードする
Bportsdb -F で初期化して見る
Ccp /usr/ports/Mk/bsd.port.options.mk /usr/share/mk/
でファイルコピー(正しいのかは分かりませんが)
これでようやく通るようになりました

省電力化

HDDの回転を止める。しかし、freeBSDでアクセスが遅いとシステムクラッシュする事もあるらしい。
なので、タイムアウトを伸ばしておく必要がある。

カーネルを変更
/usr/src/sys/dev/ata/ata-disk.c
にあるtimeoutを5だったものを31まで増やす。スピン開始してから読み込めるまで30秒以内である事がATAの仕様らしいので、31秒あれば大丈夫だろう。
これでコンパイルして再起動すればOK

次に、HDDを止めるataidleというソフトを入れる。
# cd /usr/ports/sysutils/ataidle/
# make install clean

あとは/etc/rc.confに下記のような設定を入れれば完了
ataidle_enable="YES"
ataidle_devices="ad1 ad2"
ataidle_ad1="-I 2 -S 3"
ataidle_ad2="-I 2 -S 3"

ルートやログディレクトリーなどは止めると再起動が頻繁に起こり、逆に起電力で瞬間的には電力が上がるし
HDDの寿命的にもよろしくないので、ad0などのメインは止めないておいたほうが良いと思う。
今回はデータドライブだけで、自分がアクセスしなければアクセスは無いので回転は止まったままになるはずだが…
1時間になぜか2回くらい起き上がってしまう。snmpで容量確認では起動しないのまでは確認したが、温度チェックで使用しているsmartcltでアクセスすると動いてしまうようなので、勝手に起動してしまう時間に合わせて、1時間に1回だけ温度確認するようにした。
ataidleを設定しても30分に1回勝手に動きだしてしまう。これでは1日に48回も起動してしまうのでHDDの寿命が心配だ。
原因を探るために、NFSを止めたりMRTGを止めたりしていたが、相変わらず動いてしまう…
残るはsmartdくらいなので調べてみると、デフォルトで30分に1回自己診断が動いていることが分かった。
-iオプションでインターバルを設定できるので、1日1回にした。

/etc/rc.conf
smartd_flags="-i 86400"
を追加して、smartdを再起動すれば完了。

------------------------------------------------------------------------------------------------------

CPU速度を自動的に落とす。
これは標準で入っているpowerdがあるので、これを利用する。
rc.confに下記を書くだけ。
powerd_enable="YES"
powerd_flags="-a adaptive -n adaptive"
-aは電源駆動の場合
-bがノーパソの場合バッテリ駆動らしい
-nはそのどちらでもない場合だが、そんなのあるのか?
adaptiveは可変、他にはmaxやminimumなどか?
-mで最低周波数、-Mで最高周波数が設定できるが
特に指定しなければ可能な範囲で自動に設定してくれるので不要。

手動で立ち上げるには
# powerd -a adaptive
でOK
もしくは
# /etc/rc.d/powerd start
動作確認は
# sysctl dev.cpu.0.freq
で周波数が出てくる。

gnutlsのインストールでエラー

pkg-static: Unable to access file /usr/ports/security/gnutls/work/stage/usr/local/bin/tpmtool:No such file or directory
と出てgnutlsがエラーでインストールできない。

調べていたらTPMのオプションを外せと有るのでオフしてインストール。

Try to set MAKE_JOBS_UNSAFE=yes and rebuild before reporting the failure to
the maintainer.
*** Error code 1
と出たら
# setenv MAKE_JOBS_UNSAFE yes
オプションを
DANE,EXAMPLE以外ONにする。

動的IPアドレスの時、起動時にmydns登録

起動時にmydnsのデータを更新するために
/usr/local/etc/rc.d/
へスクリプトを置いて更新しようとしたが、どうもうまくいっていない。
エラーを確認すると
Resolving www.mydns.jp (www.mydns.jp)... failed: hostname nor servname provided, or not known.
wget: unable to resolve host address 'www.mydns.jp'

となっていた。
どうも名前解決が出来ていないようだが、この行のはるか前にunboundは動いている。
ならば確実に動いているはずのプロバイダーDNSを使おうとresolv.confに127.0.0.1は消して
プロバイダーDNSにしてみたが、やはりダメだった。
かと言ってwww.mydns.jpは1つのIPでは無いために直接IPでアクセスも無理だ。
そもそもhttpsなので認証が一致しなくなるし...
hostsに書いてしまうと、更新された時にエラーしてしまうだろうしなぁ〜

オプション
/usr/local/bin/wget --dns-timeout=10
を追記してみたが10秒待たずに流れている感じだ。

さらにsleepを使用してスクリプトを一定時間後に実行するようにしてみた。
#!/bin/sh
(
sleep 10
wget・・・
) &
echo "mydns update backeground"

ところがコマンドラインで実行するとちゃんと10秒後に実行してくれるのだが
起動時にはechoの内容はもちろん表示したが、肝心のコマンドは実行してくれないようだ。
全ての起動が終わるとプロセス終了してしまうのか?

と言う事でcronで@rebootと言うのがあり
ブート後に起動するcronに設定してみたが同じ...
名前解決にはもっと時間を取らないとダメなのか?
ならば@rebootで、かつsleepも使ってみるか?

やってみたけどダメだった
なんでこんな時間かけて動かしても名前解決できないんだ?

wgetのオプションでdnsを指定できるのがあったけど
--dns-servers
ところがlibcaresを有効にして再コンパイルが必要らしい。
しかしportsのconfigにオプションが無いので、ソースからコンパイルする必要があるので断念。
調べていたら似たようなソフトでcurlと言うのがあるらしい。
さっそくインストールしてみる。
# cd /usr/ports/ftp/curl
# make config   で不要なものは削除
# make install clean

シェルスクリプトで
#!/bin/sh
sleep 60
curl --dns-servers XXX.XXX.XXX.XXX -u ユーザー名:パスワード https://www.mydns.jp/login.html

を実行してやると、今度はうまく行った!
なぜかtun0にIPがもらえるまで30秒かかっていたので、時間稼ぎはどちらにせよ必要だった。
こいつをcronで@rebootにて走らせれば完了。

sshブート時にエラー

/etc/ssh/sshd_config line 123: Deprecated option RSAAuthentication
調べたらRSAAuthenticationはもう不要のようだ。
コメントアウトしてエラー回避。

squidワーニング

WARNING: Netmask are deprecated. Please use CIDE masks instead.
WARNING: IPv4 netmasks are particularly nasty when used to compare IPv6 to IPv4 ranges.
WARNING: For now we will assume you meant to write /24

調べたらネットマスクを
***.***.***.0/255.255.255.0
で書いていたが、どうやら
***.***.***.0/24
にしなければならないようだ。

MySQLが動かない

/var/db/mysql/ibdata1
がおかしくなっていたようなので削除して起動すると立ち上がった。

また過去に記載していたパスワードセキュリティを下げる
validate_password_policy = LOW
は使用できなくなったのでmy.cnfには記載しないようにする。

phpが動かない

httpd.conに下記文が記載漏れ
AddHandler application/x-httpd-php .php

MTがDBD::mysqlを認識しない

p5-DBD-mysqlを再インストールしようとするがエラーしてインストールできず。
portsツリーを更新
再度インストールしようとしたが、今度はperlのバージョンが合わず5.26.2しか入っておらず、5.26.3へ更新。
ところが今度はcgiがエラー
/usr/bin/perlはシンボリックリンクで/usr/local/bin/perl5.26.2だったので
/usr/local/bin/perlへ変更。
これでmt-check.cgiでDBDを認識しているのを確認。

.htaccessが動いていなかった

気が付いたら.htaccessが機能していなかった。
/usr/local/etc/apache24/httpd.confで
AllowOverride None
になっていたので
AllowOverride All
に変更。

ついでに.htaccessでローカルIPからの場合はベーシック認証を聞いてこないように修正。
/usr/local/etc/apache24/httpd.conf
Order Deny,Allow
Deny from all
AuthType Basic
AuthUserFile パスワードファイルの場所
AuthGroupFile グループファイルの場所
AuthName "By Password"
Require valid-user
# BASIC認証不要の設定
Allow from 192.168.0.0/24
# それ以外はベーシック認証へ
Satisfy Any

さらに使っていてphpのREMOTE_HOSTがエラーしていた。
HostnameLookups on
が必要のようだ。
全てに逆引きするとパワーを食うので、必要なファイルのみにする。

STARTTLSエラー

sendmailの動作確認をしたら、TLSで送信できなかった。
maillogの表示は
sm-mta[33682]: STARTTLS=server: file /usr/local/etc/letsencrypt/live/miyakoshi.mydns.jp/cert.pem unsafe: World writable directory
TLS以外は動いているので、ここが怪しい。
ファイルやディレクトリーのパーミッションを400などに更新してみたが、変化なし。
まさかとは思ったが、だいぶ上に行って
/usr/local/etc
のパーミッションが775になっていたのが原因だった。
letsencryptを前のマシンからコピーする際に面倒だったので、ディレクトリ以下を圧縮してsambaでコピーした際にパーミッションを広げていたのが影響していた。

マスターブラウザ

Windowsのファイル共有NetBIOSの名前解決でマスターブラウザが重なってしまった。
自分の場合FreeBSDをマスターブラウザにしているので、Windowsがマスターブラウザになるのは好ましくない。
その時のFreeBSDで画面にこのようなエラーが連発。
nmbd[1285]: [2021/09/27 21:27:18.236444, 0] ../../source3/nmbd/nmbd_namequery.c:109(query_name_response)
nmbd[1285]: query_name_response: Multiple (2) responses received for a query on subnet 192.168.0.1 for name HOGEHOGE<1d>.
nmbd[1285]: This response was from IP 192.168.0.2, reporting an IP address of 192.168.0.2.
FreeBSDは192.168.0.1、他にマスターブラウザになってしまった192.168.0.2が重なっているというエラー
FreeBSDはルータにもなっているので確実に24時間稼働なためにFreeBSDに任せたいところ。
なので192.168.0.2のWindowsマシンにはマスターブラウザに自動でならないように設定する。
regeditでレジストリ絵で下を立ち上げ
コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Browser\Parameters
の「MaintainServerList」を「Auto」から「No」に変更する。

なぜこのようになったかと言うと、WindowsのSMB1.0の設定は15日間使用されていないと勝手に削除されるらしい。
よく確認したら自動削除にチェックが入っていたので自動削除のチェックを外すことで15日制限の解除ができると思われる。

しかしSMB1.0はセキュリティー的に使用しないほうが良い。
Sambaもだいぶ更新しているのでSMB1.0じゃなくても使えないか調べたら4.13では十分対応していた。
smb4.conf
min protocol = SMB2
の追記で可能のようなので設定変更し、WindowsのSMB1.0も無効で問題ないことを確認。