『FreeBSD』 ZFSでsnapshotを取ってzfs send/recvしてバックアップを作成する

ようやくファイルサーバーの移行が終わりました。

ZFSでsnapshotを取ることで履歴を残すことができるようになりました。
これで間違ってファイルを消しちゃった場合でも復活できる可能性があります。

とは言っても、Diskが2台壊れたらデータは吹っ飛びますので念のため他のディスクやマシンにバックアップを取っておく必要があります。
今まではrsyncを使ってバックアップを取っていましたが、ZFSではsnapshotを使ってバックアップを取ることができます。

vol1/hoge@backup0ってスナップショットがあった場合、バックアップ先をvol2/hogeとしたとき、zfs send/recvコマンドを使って次の手順でバックアップがとれます。

# zfs send vol1/hoge@backup0 | zfs recv vol2/hoge

vol2/hogeが既に存在している場合では、-Fオプションをつける必要があったような気がします(その様な場面があった)。

1回バックアップを取ってしまったら次からは差分を送るだけなので時間が短く済みます。
次のスナップショットをvol1/hoge@backup1とすると、

# zfs send -i vol1/hoge@backup1 vol1/hoge@backup0 | zfs recv vol2/hoge

で差分バックアップできます。
これだと、snapshotの履歴もバックアップ先に残るので色々と便利です。

注意点としては、バックアップ先に変更があればzfs send/recvでバックアップはとれません。
atimeを無効にしたのは、ファイルに変更が入ったら困るからです。

もし、ファイルに変更が入ってバックアップがとれなくなったときは、rollbackしてからコマンドを実行します。
#zfs recv -F とすればロールバックもしてくれるらしいのですが、未確認です。

2014/10/26追記
atimeを無効にしてもファイルに修正が入ったので、-Fオプションをつけてzfs recvを試したところ、ちゃんとrollbackしてバックアップをとれました。
スクリプトも修正しています
追記ここまで

以上を踏まえてバックアップの方針を次の通りにしました。
○1時間ごとにsnapshotを取ったらそのままバックアップする
これが一番楽&確実なのです。

前に作成したzfs_snapshot_hourlyをrubyスクリプトにしてバックアップの分も追加しました。
[ruby]
#!/usr/local/bin/ruby
# -*- coding: utf-8 -*-

#snapshot作成
now = Time.now
now_str = now.strftime(“%Y%m%d-%H%M”)

require “open3”

stdin,stdout,stderr = Open3.capture2(‘/sbin/zfs snapshot -r vol1/pub1@’+now_str)
stdin,stdout,stderr = Open3.capture2(‘/sbin/zfs snapshot -r vol1/pub2@’+now_str)

#バックアップ作成
stdin,stdout,stderr = Open3.capture2(‘/sbin/zfs list -o name -S creation -t snapshot’)
snapshot_list = stdin.split(“n”)
snapshot_list.delete_at(0)

def extract_target_snapshot_list(list, target_name)
l = Array.new
list.each do |s|
if s.include?(target_name) then
l.push(s)
end
end
return l
end

pub1_snapshot_list = Array.new
pub1_snapshot_list = extract_target_snapshot_list(snapshot_list,”vol1/pub1@”)

#ソートして結果の先頭が一番新しいsnapshot
pub1_snapshot_list.sort

stdin,stdout,stderr = Open3.capture2(‘/sbin/zfs send -i ‘+ pub1_snapshot_list[1] + ‘ ‘ + pub1_snapshot_list[0] + ‘ | /sbin/zfs recv -F vol2/pub1’)
[/ruby]

FreeBSDのperiodicの仕組みがよく解っていないので、snapshot関係のスクリプトはrootのcrontabに設定して実行させています。

サーバー移行を振り返ってみて、FreeBSDはあまり触りたくは無かったけれども何とかなったなと思いました。

実践FreeBSDサーバ構築・運用ガイド
技術評論社 (2013-05-10)
売り上げランキング: 78,390

『FreeBSD』 ZFSでatimeを無効にする

ZFSではsnapshotをとってそれをzfs send/recvして、別Diskや別マシンにバックアップを取ることができます。
1回バックアップを取ったあとは、snapshotの差分だけを転送する形になりますので短時間でのバックアップが可能になります。

このとき、転送先のpoolには変更を加えてはいけません。
なぜなら、差分の元になる部分で不一致が発生したら差分が解らなくなるからです。

しかしですね、何も触っていないpoolに勝手に変更が加えられて差分バックアップを取るときに不一致でエラーが出ることがたまにあります。

この原因でパッと思いついたのだatimeです。
これ、最後にファイルが参照された時間が記録されるので、catやlessしただけでファイルに変更が入ることになります。
おそらく、cronで何かやっちゃっているんだと思われます。

これはバックアップの運用でかなり困ったことになります。
解決方法はzfsでatimeを無効にすることです。
これはコマンド一発でできます。

#zfs set atime=off pool名
# zfs get atime pool名

NAME  PROPERTY  VALUE  SOURCE
vol1  atime     off    local

これで、zfs send/recvの問題も解決するはずなので、しばらく様子を見ようと思います。

実践FreeBSDサーバ構築・運用ガイド
技術評論社 (2013-05-10)
売り上げランキング: 78,250

『FreeBSD』 DNSが無いローカルネットワークでのマシンの名前解決方法

自宅のネットワーク構成が変わった話とそれに伴うサーバー変更の話を色々と書いてきました。

この過程で一番大きく変わったのが、ファイルサーバーが動的IPアドレスになったことです。
そして、DNSサーバーはマンションに設置しているサーバーを必ず使わなくてはいけなくなりました。

この環境でものすごく困るのが、クライアントマシンからサーバーへsshでログインするときです。
IPアドレスを直うちでログインする訳なのですが、毎日起動の度にIPアドレスが変わります。
また、各Windowsマシンにデータを共有させるためにファイルサーバー経由でrsyncをつかったデータ同期をさせているのですが、ここでもIPアドレスが必要になります。

その様なわけで、コロコロとIPアドレスが変わってしまうと困るわけです。
Windwosのファイル共有はSambaの名前解決機能を使うので特に問題は起きませんし、Macのファイル共有関係(主にTimeMachine)もAvahi-daemonの名前解決機能を使うので問題は起きません。

問題が起きるのは、sshなどのunix系(?)なツールを使うときです。

長々と背景を書いてきましたが要約すると、サーバーを含めてすべて動的IPアドレスで運用されているネットワークにおいて、名前解決をどのように行うかです。

解決方法ですが、Avahiの名前解決機能を使ってやります。
これは、Zeroconfって機能の実装の一つです。
AvahiではAppleが実装したmDNSに対応しています。
Macは標準でmDNS対応ですし、WindowsではiTunesと一緒にインストールされるBonjourで対応できます。

自宅のネットワーク環境ではこれをすべて満たすのでこれらを使って問題解決をしました。

具体的な設定方法ですが、FreeBSDマシン(Linuxマシン)でAvahi-daemonが動いている状態なら特に設定を変更しなくても、iTunesをインストール済みのWindowsマシンやMacから「サーバーのマシン名.local」でアクセス可能になります。
勿論、WindowsマシンやMacが相手でもマシン名.localでアクセス出来ます。

手っ取り早い確認方法は、

# ping 相手マシン名.local

をWindowsマシンやmacで実行することです。

FreeBSDなどのUnix系マシン上での名前解決には、ちょっと設定が必要なのです。
が、今回はWindwosとMacでローカルネットワーク内マシンの名前解決ができたら良いので、そこまで踏み込みません。
#/etc/nsswitch.confを編集するだけみたいですが。

今の今まで、こんな便利な機能を知らなかったなんて!

実践FreeBSDサーバ構築・運用ガイド
技術評論社 (2013-05-10)
売り上げランキング: 78,194

『FreeBSD』 FreeBSD 10+ZFSな環境でのAFT(4KBセクタ)HDDの運用

Debian/kFreeBSDな環境で構築したZFS poolをFreeBSD 10なマシンに持ってきたところ、4KBセクタなHDDだけど、512BセクタなHDDで認識させてるから的なメッセージが出ることを前のエントリーで書きました。
『FreeBSD』 FreeBSD+ZFS+Samba+netatalk環境を構築する – FreeBSDインストール+etc

解決方法としては、ZFS poolを作り直すしかなく、その時に-o ashift=12をつけてcreateさせる必要があります。

が、FreeBSD 10からは、create時にオプション無しでも自動認識して正しく設定しくれるとの情報が。

そこで確認してみたところ、確かにオプション無しでも4KBセクタHDDとして取り扱ってくれました。
過去との互換性のためにデフォルトでは512Bセクタとして取り扱う方針から変わったようです。

結論は、FreeBSD 10なら色々と細かいことを考える必要は無い!って事です。

現在、zfs send/recvコマンドでデータの移動中です・・・・

実践FreeBSDサーバ構築・運用ガイド
技術評論社 (2013-05-10)
売り上げランキング: 78,194

『FreeBSD』 /etc/fstabでuuidでDiskを指定する。

ZFSでのHDDセクターサイズな問題を解決するために、予備で取っておいた2TB×3のHDDをFreeBSDマシンにつないで起動させたら、起動しなくなりました(;つД`)

ドライブレターが変わったために起動シーケンスでファイルシステムをマウントするときに、それが見つからずに起動途中で止まってしまうためです。
HDDを接続するポートをつなぎ替えて起動させましたが、根本的な解決手段が必要です。

最近のLinux系なら、インストールした時点でfstabの設定が、uuidを使った指定になっているからこのような問題は起きないのですが、FreeBSDでは/dev/ada1p2のようなデバイス名(?)で指定されているので、今回のようにドライブレターが変わってしまったら起動しなくなります(なんでや!)。

ちなみに、ZFSで管理されているDiskはドライブレターが変わってもZFS側でよろしくやってくれるので、気にする必要がありません。

解決方法ですが、探していたらそのものズバリなページが見つかりました。
コンピュータ/ソフトウェア関連Tips – FreeBSDのfstabでuuidを使用する

FreeBSDで各Disk、パーティションのuuidを知る方法は、

# gpart list

でできます。

ZFSで管理されているDisk以外のuuidが解りますので、これをメモして、Linuxのt時と同じようにfstabを設定します。

参照ページ→『linux関連』 /etc/fstabの表示形式をUUIDを使った形式にしてみる

インストール時にこの辺はやってくれても良いのに・・・

実践FreeBSDサーバ構築・運用ガイド
技術評論社 (2013-05-10)
売り上げランキング: 78,194

『FreeBSD』 FreeBSD+ZFS+Samba+netatalk環境を構築する – netatalkの設定

『FreeBSD』 FreeBSD+ZFS+Samba+netatalk環境を構築する – FreeBSDインストール+etc
『FreeBSD』 FreeBSD+ZFS+Samba+netatalk環境を構築する – Sambaの設定
からの続きで、netatalkの設定をします。

インストールしたのは、やり方がある程度解っていたnetatalk 2.x系統です。

Debianでは、
apt-get install netatalk
ですべてインストールされたのですが、FreeBSDはそんな訳ではなかったので、少し手間取りました。

インストール

netatalk本体と、avahi-daemonが必要。

# pkg install netatalk-2.2.5_4,1
# pkg install avahi-0.6.31

設定と確認の段階でdbus-daemonも必要ってメッセージが出てきたのですが、気がついたらインストルされていたので、netatalkとavahi-daemonをインストールする段階で勝手にインストールされるのかもしれません。

emacs /etc/rc.conf

dbus_enable=”YES”
avahi_daemon_enable=”YES”
avahi_dnsconfd_enable=”YES”
netatalk_enable=”YES”
cnid_metad_enable=”YES”
afpd_enable=”YES”
を追加

netatalkの設定

afpd.confとAppleVolumes.defaultを設定してやります。

emacs /usr/local/etc/afpd.conf

“サーバー名” -tcp -noddp -uamlist uams_dhx2.so -nosavepassword -setuplog “default log_info /var/log/afpd.log”
を追加

emacs /usr/local/etc/AppleVolumes.default

#~
ディレクトリ名 “HDD名” options:tm volsizelimit:300000
ホームディレクトリをコメントアウトして、TimeMachineの設置を追加

avahiの設定

たぶん、この辺は設定をしなくても良いはずですが、設定した方が良いみたいなので設定します。

TimeMachineのDisk選択で勝手にDiskが出てくるために以下のファイルを追加します。

emacs /usr/local/etc/avahi/services/adiskservice

[xml]


%h

_adisk._tcp 9 sys=adVF=0x100
dk0=adVN=Time Machine,adVF=0x81


[/xml]
先に結論を書いてしまうと、TimeMachineのDisk選択でDiskが勝手に表示されなかったので、何か設定がまずそうです。

参照: NetatalkとAvahiを使ってFreeBSDマシンをTime Capsuleとして使う

ついでに、Samba側もMacのFinderに勝手に表示してくれるようにしました。

# emacs /usr/local/etc/avahi/services/smb.service

[xml]



%h

_smb._tcp 445


[/xml]
こちらは上手く動いてくれました。
でも、何も設定していない状態でもFinderに表示されていた気もします。

動作確認

rebootするか、手動でdbus、avahi、netatalkを起動させてやります。
rebootがお薦めです。

# /usr/local/etc/rc.d/dbus start
# /usr/local/etc/rc.d/avahi-dnsconfd start
# /usr/local/etc/rc.d/avahi-daemon start
# /usr/local/etc/rc.d/netatalk start

で起動すると思う(自信なし)。
ログが出ないからよく解らないんだよな・・・。

Mac側で確認ですが、本来ならTimeMachineの「ディスクを選択」を開いたら対象Diskが出ているはずなのですが出ていません。
Finderからサーバーの接続を選んでサーバー名を
afp://IPアドレス
afp://fqdn (ローカルでDNSを運用している場合など)
afp://マシン名.local
のどれかで接続させると、TimeMachineのDiskが見つかる状態になります。
#マシン名.localで見つかるはず・・・

バックアップがとれたらOKです。

積み残し

avahi-daemon回りの設定とnetatalk3ですかね。
動く形が整ったので、このまま運用を続ける気がします。

APPLE AirMac Time Capsule - 2TB ME177J/A
アップル (2013-06-11)
売り上げランキング: 9,798

『FreeBSD』 FreeBSD+ZFS+Samba+netatalk環境を構築する – Sambaの設定

『FreeBSD』 FreeBSD+ZFS+Samba+netatalk環境を構築する – FreeBSDインストール+etcからの続きで、sambaの設定をします。

Sambaのインストール

# pkg install samba36-3.6.24_2

pkg install net/samba
ってのが正しいインストール方法なのかもしれませんが、その辺りがよく解っていません(;つД`)

# emacs /etc/rc.conf

samba_enable=”YES”
を追加

smb.conf設定

FreeBSDでは
/usr/local/etc/smb.conf
って場所になります。
Slackwareを思い出すファイル配置です。

Debian/kFreeBSDで使っていたsmb.confをそのままコピーしてやりました。
ただし、
directory name cache size = 0
は削除してあります。

ユーザー追加

FreeBSDのユーザーアカウントとリンクさせる方法もありますが、素直にsambaにユーザーを追加してやります。

# smbpasswd -a new_user

動作確認

rebootするか、

# /usr/local/etc/rc.d/samba start

でsambaを起動させます。

このファイル配置はイケていないと思うんですが・・・。

FreeBSD 10 + ZFS + Sambaでは、『Linux/Debian』 Debian/kFreeBSD + ZFS + Samba でWindwosからのディレクトリ表示で同じディレクトリが複数表示される事象が発生て現象が発生しません。

この状態が普通だと思うのですが。。。。

iTunesの音楽ファイルを入れてあるディレクトリを表示させてみると、
directory3

directory4

まともな表示になっています。

これで目的の98%位は達成です。

あとは、Mac用にnetatalkを入れてTimeMachine対応にするだけです。
この件は別エントリーで書きます。

インテル Gigabit CT Desktop Adapter EXPI9301CT
インテル (2012-08-16)
売り上げランキング: 3,179

『FreeBSD』 FreeBSD+ZFS+Samba+netatalk環境を構築する – FreeBSDインストール+etc

Debian/kFreeBSDで意味不明なトラブルが多発したので、結局FreeBSDをインストールしました。
トラブルも無く、時間もかからず環境構築できたので、初めからこっちを入れておくべきだった。
#普段使いのマシンはLinuxにしますが

今回は、ZFSな環境構築+αまでを書きます。

インストール

USBメモリスティックを使ってインストールしました。
USBはWindowsで書き込みソフトを使って作成しました。

インストール自体は特に躓くところは無かったと言いたいところですが、オン・ボードのeternetインタフェースからDHCPでアドレスを取得しようとしたら、アドレス取得に失敗する事象が発生しました。
Realtekのeternetインタフェースです。
手持ちのIntelなeternetカードを使ってインストールをしました。

Debian/kFreeBSDでこのマシンにインストールしたときは認識した、他のマシンでインストール済みFreeBSDが入ったHDDで起動させたときは、このインタフェースを認識したので、インストーラの問題なのかな?
インストール後に動作確認はさせていないので微妙ですが。

他に注意点があるとしたら、
○キーボード選択時にJapanese 106xを選ぶと、Caps LockとCtrlが入れ替わったキーマップになります。
○今回は、他のマシンで使っていたファイルサーバーのDiskを再利用するので、ユーザー名を登録するとき、ユーザー番号は移植元のマシンのユーザー番号とあわせないと、あとで大変になる
○suするためにwheelグループにも追加しておく
って所です。

packageを使えるようにする

FreeBSDはportsってシステムでパッケージ管理をしていると思っていたのですが、最近のFreeBSDはpkgと言うコンパイル済みバイナリのパッケージ管理ツールがあるんですね。
で、いまひとつ使い方が解っていませんので、的外れな書き方をしているかもしれませんが、

# pkg
# pkg update

で使えるようになります。

どんなパッケージが使えるのかを知りたいときには、

# pkg search hoge

で探すのかな?

emacsインストール

私はviを使えないので(ぇ)、emacsを入れます。

# pkg install emacs-nox11-24.3_14,3

Xは必要ないです。
#でも、他のパッケージを入れたら結局インストールされた。。。。。

sshでパスワードログインできるようにする

デフォルトではsshでパスワードログインできません。
他のマシンにおいてある暗号鍵を持っていくためにもsshでパスワードログインしたいのです。
#USBメディアでコピーしろって事かもしれませんが・・・

# /etc/ssh/sshd_config

PasswordAuthentication yes
を追加して

# /etc/rc.d/sshd restart

これで、リモートマシンからパスワードログインできます。
秘密鍵をコピーして、RSA鍵でログインできるようになったら無効にするのが正しい使い方な感じがします。

ロケール設定

日本語が表示出来るようにします。

# emacs ~/.login_conf

me:
:charset=UTF-8:
:lang=ja_JP.UTF-8:
を追加

再ログインしたら日本語表示されます。

ZFSを有効にする

# emacs /boot/loader.conf

zfs_load=”YES”
を追加

# emacs /etc/rc.conf

zfs_enable=”YES”
を追加

FreeBSD 10ではインストール時にZFSファイルシステムを選択できるから、上記の設定は要らないのかもしれません。
これを外して有効になるかは確認していません。

404 Blog Not Found – 備忘録 – HP ProLiant MicroServer + FreeBSD + ZFSを参考に以下の設定を追加します。

# emacs /boot/loader.conf

kern.cam.boot_delay=10000
ahci_load=”YES”
vfs.zfs.txg.timeout=”5″
kern.maxusers=512
vm.kmem_size=”4G”
vm.kmem_size_max=”6G”
vfs.zfs.arc_min=”512M”
vfs.zfs.arc_max=”4G”
を追加

設定追加後にreboot

他のマシンで使っていたZFSなpoolをimportします。

# zpool import -f vol1
# zpool import -f vol1

前に使っていたマシンでexportしていなかったため、-fオプションが必要と言われました。

# zpool status

  pool: vol1
 state: ONLINE
status: One or more devices are configured to use a non-native block size.
        Expect reduced performance.
action: Replace affected devices with devices that support the
        configured block size, or migrate data to a properly configured
        pool.
  scan: scrub repaired 0 in 0h44m with 0 errors on Sun Oct  5 01:41:33 2014
config:

        NAME        STATE     READ WRITE CKSUM
        vol1        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            ada1    ONLINE       0     0     0  block size: 512B configured, 4096B native
            ada2    ONLINE       0     0     0  block size: 512B configured, 4096B native
            ada3    ONLINE       0     0     0  block size: 512B configured, 4096B native

errors: No known data errors

  pool: vol2
 state: ONLINE
status: One or more devices are configured to use a non-native block size.
        Expect reduced performance.
action: Replace affected devices with devices that support the
        configured block size, or migrate data to a properly configured
        pool.
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        vol2        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            ada4    ONLINE       0     0     0  block size: 512B configured, 4096B native
            ada5    ONLINE       0     0     0  block size: 512B configured, 4096B native
            ada6    ONLINE       0     0     0  block size: 512B configured, 4096B native

errors: No known data errors

Debian/kFreeBSDでは出ていなかったのですが、セクタサイズが4kByteだけれども、512byteでpoolを作っちゃったよねてな注意が。
性能落ちるって言うけれども、どのくらい落ちるのかな。
修正しようと思ったらpoolをdestroyしてから-o ashift=12をつけてpoolをcreateする必要があるとのこと

これは、あとで試す。
が、変更させようと思ったら面倒くさい。
2TB×3の空きディスクがあるので、そちらも使ったらデータの移行はできるんだけどね。

rubyのインストール

rubyで書いたスクリプトが結構あるので、rubyをインストールします。

# pkg install ruby-2.0.0.576_1,1

インストール先が
/usr/local/bin/ruby
になっているので、スクリプトの修正が必要になりました。
/usr/bin/rubyへのリンクを作るのがスマートかもです。

Sambaの設定など

Sambaの設定などは別エントリーで

実践FreeBSDサーバ構築・運用ガイド
技術評論社 (2013-05-10)
売り上げランキング: 78,125

『Linux/Debian』 Debian/kFreeBSD + ZFS + Samba でWindwosからのディレクトリ表示で同じディレクトリが複数表示される事象が発生

またもトラブルが。
もうFreeBSDに乗り換えた方が良いのでしょうか。
でも、今回のトラブルは*BSD+ZFS+Sambaの問題のみたいなのですが。

Debian/kFreeBSD + ZFS + Sambaな環境で、あるディレクトリにディレクトリが約300個以上存在する状態で、Windwosからそのディレクトリにアクセスすると、ディレクトリ一覧が正しく取得できない事案が発生しました。

Windowsからアクセスしてみると、ディレクトリ数がまずおかしい。

directory1
これ、表示途中の画像ですが、最終的には120万とかになります。

さらに、
directory2
このように同じディレクトリが何個も表示されます。

調べてみたところ、同じディレクトリに約300個以上ディレクトリが存在するとおかしくなるようです。

このような状態になっていても、ファイルアクセスには問題がありません。

私の場合、iTunesに登録した音楽ファイルはみんな、ファイルサーバー上においてあるのですが、そこのディレクトリを見に行ったことで発覚しました。
iTunesで問題なく音楽を再生出来ていたので気がつくのが遅れました。

で、調べてみたところ、
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=612503
http://www.timberline.se/blog/?p=87
と言うのが出てきて、ZFSの仕様による不具合なんだけど、Samba側では積極的に対応する予定が無く、対処療法てきな手段になるみたい。
Debian側でもSambaの設定をどうにかするつもりは無いらしい。

解決方法は、smb.confのglobalセクションに

directory name cache size = 0

を追加したらOKって事だし、Sambaのドキュメントにもその様に書いてあるのだが、この通りに設定しても問題が解決しません。

Sambaのバージョンは3.6.6です。

調べてみたところ、この問題で困っているって情報がほとんど出てこない。
と言うことは、私の所だけで起きているのか、一般的な使い方では問題が出てこないだけなのかよく解りませんって状態です。

 

2014年10月20日追記

FreeBSD 10をインストールして試してみたところ、directory name cache size = 0が無くても正しく動きました。
これ、DebianもFreeBSD 10系列にしたら直るのか?

『Linux/Debian』 Debian/kFreeBSDマシンで、DHCPで取得した情報を正しく反映されなくて困る事態が発生

非常にレアケースだと思うのですが、Debian/kFreeBSDで構築したzfsなファイルサーバー、DHCPで取得した情報を正確にネットワークインタフェースに反映させなくて、外部との通信や他のマシンとの通信が上手くできない事態が発生してしまいました。
色々と手段を考えて試して解決したのでメモしておきます。

背景

今住んでいる賃貸マンションでは光ネットワークサービスが導入されています。
今はフレッツやau光サービスも利用できますが、私が入渠した当時はNTT系のプロバイダのサービスしか対応しておらず、それを契約して今もずっと使っております。
トータルでみるとかなりお安く済む上に速度もそれなりに出ているので満足はしています。

サービスは2種類あって、一つはプライベートアドレスをもらって通信するサービス。
もう一つは、追加料金は発生するのですが、グローバルIPをもらって通信するサービス。こちらには固定IPと動的IPの2種類に分かれて、固定IPをもらえるサービスを契約して使っておりました。
自宅鯖でWEBを公開するためにです。

ファイルサーバー更新とともに、WEBサーバーをレンタルサーバーに移動させたのを契機に固定IPをもらうサービスを止めて、プライベートアドレスをもらう契約に変更しました。

今までは、自宅鯖がルーターでDHCPサーバーを立ち上げて運用していたのですが、マンション内のルーターがDHCPサーバーを兼ねていてIPアドレスを配ってくれるので、DHCPサーバーはマンション内のを使うようにしました。

その状態で、Debian/kFreeBSDなマシンをファイルサーバーにしてsambaを立ち上げたところ、どうやってもWindowsPCのネットワークの所にファイルサーバーが出てこない。
IPアドレス直うちならアクセス出来る。
コマンドプロンプトでnbtstat -A IPアドレス、をしたあとならマシン名でアクセス出来るようになるが、Windowsネットワークにはマシンは出てこない状態が続く状態になりました。

master browserの設定かと思って試しても改善せず。

色々と調査した結果、ファイルサーバーのサブネットマスクとブロードキャストアドレスが正しく設定されていないことが解りました。

マンション内ネットワーク、各部屋になぜか/23のアドレスを配っているのですが、Debian/kFreeBSDなマシンは、/24として設定しまいます。
Debian/GNU LinuxなマシンやWindowsやMacは/23のネットワークとして設定されています。
普通のFreeBSDではどのような結果になるか試していません。

このため、ファイルサーバーの情報が他のマシンへ正しく伝わらずこのような現象が起きていたのです。
そういえば、Windowsのファイル共有はブロードキャストで情報を伝える仕様だったので、この状態だと他のマシンから見えないのは当然だなと。

この状態でもネットワークインストールやaptでの更新もできていたし、他のマシンからリモートログインもできていたので気がつくのが遅れました。
#インストール時にサブネットマスクがおかしいって気がついていたような気もするけど・・・

解決方法は色々とあるのですが、直球な方法では解決しなかったので、以下、どのようにして解決していったかを書きます。

解決法その1 固定IPにしちゃう

リモートログインする必要もあり、固定IPにするのが最も楽な解決方法です。
が、DHCPサーバーが関与しないIPアドレスがどこか解らないのでバッティングする可能性もあります。

その時はその時でと思って固定IPで設定したところ、Windowsマシンから見えるようになりました。
が、ファイルサーバーから外部にアクセス出来なくなりました。
どうやら、マンションのルーターはDHCPでIPアドレスを配ったPC以外からのアクセスは弾く設定にしてあるようです。

ほとんどの場合、自宅ネットワーク外部へアクセスすることは無いのだけれども、aptが使えなくなるので致命的状況です。

と言うわけで、この解決方法は失敗。

解決方法その2 dhcpclient.confを設定する

ほとんどの場合、これが100%正しい解決方法で、これで解決するはずです。

Debian/kFreeBSDの場合は、/etc/dhcp/dhcpclient.confというファイルを編集してやります。

manで調べると、supersedeでオプションを強制上書きできるとあります。
つまり、dhcpclient.confに

supersede subnet-mask 255.255.254.0;
supersede broadcast-address ブロードキャストアドレス;

を追加してやれば、正しいサブネットマスクとブロードキャストアドレスが設定される事になります。

が、なぜか設定が反映されません。

なんでやねん!

解決方法その3 ifconfigで設定を変更する

こうなると、ifconfigで設定を変更するしかありません。
試しにコマンドプロンプトから

$ifconfig re0 IPアドレス netmask 255.255.254.0 broadcast ブロードキャストアドレス

とやったら解決しました。
当たり前か。

問題はこれを自動でやる方法です。

まずは、以下のスクリプトを書きました。

2014年10月19日追記

このままだとdefault gatewayが設定されていない状態だったので、スクリプトを追加修正しました

追記ここまで

[bash]
#! /bin/bash

ip_adr=$(ifconfig re0 | grep ‘inet ‘ | sed -e ‘s/^.*inet //’ -e ‘s/ .*//’)
ifconfig re0 $ip_adr netmask 255.255.254.0 broadcast ブロードキャストアドレス
route add default デフォルトゲートウェイのIPアドレス
[/bash]
自分のマシンのIPアドレスを調べて、その値を使ってifconfigを使って再設定をします。
ブロードキャストアドレスは正しい値に置き換えてください。

こいつを/etc/network/if-up.d/においてやります。
Debian系ならこのディレクトリになっているはずです。
FreeBSDやDebian系じゃないLinuxの場合は解りません。

すると、マシン起動時やネットワークカードをdown→upしたときに、dhcpでアドレスを取得したあとにこのスクリプトが走って、サブネットマスクとブロードキャストアドレスを設定し直します。

本当はこんな面倒くさいことはしなくて良いはずなのに(;つД`)

まとめ

なんでやねん!って感じですわ。
素直にFreeBSDを使ったら良かったのかなと大後悔中ですわ。

実践FreeBSDサーバ構築・運用ガイド
技術評論社 (2013-05-10)
売り上げランキング: 77,502