私のメモです。参考になればいいですが、間違っていたらごめんなさい。
NUC DN2820FYKH に対応しているカーネルを採用しているLinuxが2014年06月の時点でこれしかありませんでした。幸いDebianから派生したLinuxでなので、Debianと同じ流儀で設定や操作ができるため、DN2820FYKHにはこれをインストールすることにしました。
DN2820FYKHはセキュアBIOSを採用しており、Linuxのインストールには苦労するようです。僕の環境ではBIOSの設定以前に以下ではまりました。。。
キーボードについては慌ててを安いキーボードTK-FCM062BKを買ってきて解決しましたが、外付けHDDは諦めました。一度起動したらそのままなので。
まず、BIOSをアップデートします。あらかじめBIOSファイルをダウンロードしてUSBメモリに保存しておきます。画面が起動したらF7を押し、BIOSアップデートユーティリティを起動してBIOSをアップデートします(詳細はIntelのページ)。
ようやくBIOSの設定です。デフォルトの状態ではインストールできません。僕は「断片/DN2820FYKHDebian」を参考に、Advanced画面から以下の設定をしました。BIOSの全画面はこちらのページからご覧になれます(このBIOSはキャプチャ機能が付いてます)。また、最初にF9を押して、デフォルトを読み込んでから設定しています。
BIOSの設定を終えたら、Ubuntuのインストールディスクが入った外付けDVDドライブを前面に挿し、外付けHDDを背面のUSBに挿して電源を入れます。外付けHDDを認識しない場合、Ctrl+Alt+Delキーで再起動して、起動直後にF10キーを押します。すると、起動ドライブの選択画面が現れますので、外付けHDDが表示されていることを確認してからDVDドライブから起動すると良いようです。起動ドライブ選択画面に外付けHDDが認識されていない場合、再度Ctrl+Alt+Delキーで再起動を繰り返します。
今回はUbuntu Server 14.04 LTSのmini.isoを使ってネットワークインストールを行いました。選択したパッケージはBasic Ubuntu server、OpenSSH server、Samba file serverです。ウェブサーバのためにBasic、PuttyでログインするためにOpenSSHサーバ、ファイルサーバのためにSambaサーバを選択しました。
インストールが終了したら、最初にファイアウォールの設定です。ubuntuではNetworkManagerやiptalbes-restore/saveコマンドなどで管理する方法もあるようですが、僕はOld Styleの/etc/network/interfaceで設定しました。Debianではこの方法で設定した場合、/etc/init.d/networking restartによって設定を反映できましたが、ubuntuではサーバ自体の再起動が必要でした。
設定した内容は次の通りです。ここの「サーバ」とはubuntuをインストールしたNUCのことです。
実際のinterfaceファイルはこちらをご覧下さい。また、UbuntuのiptablesコマンドはDNS逆引きオプションがオンになっています。iptalbes -Lで設定を確認する際は、iptables -nLとDNS逆引きをオフにすると表示が速いです。
Puttyを使ってコンソールでサーバにアクセスするため、OpenSSHとPutty用の設定をします。PuttyのWindowsでの設定はWindowsのページをご覧下さい。
Puttyを使ってログインできればよく、ユーザは僕一人であるため、公開鍵を使ってProtocol2のみの認証を許可するように設定します。設定ファイルは/etc/ssh/sshd_configです。以下の項目を設定(または確認)しました。
|
|
|
上記の設定後、/etc/init.d/ssh restartでsshdを再起動して設定を反映させます。また、PuTTYで作成したssh2用の公開鍵をユーザの.sshディレクトリ(/home/username/.ssh)にauthorized_keys2という名前でコピーし、パーミッションを400に設定します。これでPuTTYを使ってWindowsからログインできるようになります。
実際のsshd_configファイルはこちらになります。
Debianで使っていたこれまでの設定ファイルを引き継いで使えます。デフォルトファイルからの変更点は次の通りです。太字の項目は、Debianで使っていた設定ファイルに記載がなく(あるいはコメントアウトされていて)、Ubuntuのデフォルトファイルにある項目です。斜体の項目はその逆です。
|
|
|
socket optionsはSamba Client1の場合だけ効果があるようです。また、下手に設定するとTCP stackを損なう可能性があるため、コメントアウト(行頭に";"を追加)しました。
Linuxにはログインしないsamba専用ユーザとして登録する場合、シェルログインしないよう、次のコマンドでユーザを追加します。
|
|
|
共有フォルダの設定は、複数のユーザが居ることを前提に次の方針で設定しました。
|
[フォルダ1]
或いは
[フォルダ1]
[フォルダ2]
|
|
|
|
|
|
|
|
[フォルダ3] |
|
実際に共有フォルダが読み書き可能かは、Sambaの設定だけでなくディレクトリの所有者、パーミッションによって決まります。上の場合、ディレクトリの所有者をUSER1、パーミッションは所有者のみに許可されているので、Sambaでwrite list = USER1,USER2と指定してもUSER2は閲覧さえ出来ません。
実際のsmb.confファイルはこちらになります。
これまで設定ファイルを使いまわしていましたが、よく見るとversion 2になった際に不要になったモジュールの設定までapache2.confに記載していました。これまでの設定ファイルは使わず、デフォルトファイルから以下を変更して使うことにしました。
|
|
|
読み込むモジュールの設定を変えたい場合、/etc/apache2/mods-available以下にあるモジュール名.confファイルを編集します。たとえば、Webページを表示する際の言語の優先順位で日本語を最優先にしたい場合、negotiationモジュールの設定ファイルnegotiation.confで、LanguagePriorityを以下のように編集します。
モジュールを読み込む際は、a2enmod モジュール名 で読み込みます。このコマンドを実行すると、/etc/apache2/mods-enabled以下に/etc/apache2/mods-availableへのシンボリックリンクが作成され、apache2を再起動してa2enmodで読み込むように設定したモジュールが読み込まれます。a2enmodコマンド、a2dismodコマンドは、このシンボリックを作成、削除するコマンドでしかないため、モジュールの設定を変えたらapache2を再起動するまで設定は変更されません。
SSI(Serve Side Include)に必要なIncludeモジュールを読み込んでからapache2を再起動するまでの手順は次のようになります。。
|
|
ちなみに、読み込み可能なモジュールは、/etc/apache2/mods-available以下にあります。どのようなモジュールが読み込まれているかは、apache2ctl -l、apache2ctl -M で確認できます。さらに、サーバの状態はapache2ctl -V で表示されます。
apache2の設定を終えたら、siteの設定を行います。siteの設定は、000-default.confを編集する、或いは/etc/apache2/site-available以下にファイルを作成して行います。作成したサイトを有効にするには、a2ensite 作成したファイル名 を実行します。これもa2enmod同様、/etc/apache2/sites-availableにシンボリックリンクを作成するだけです。そのため、設定変更を有効にするにはapache2を再起動する必要があります。
僕のウェブページのように、トップページに設定したカウンタをSSIで動かす場合、/var/www/htmlディレクトリに次のように記述します。SSI用にOptionにIncludesを入れておく必要があります。また、index.htmlファイルがない場合、ディレクトリの一覧を表示しないようIndexesオプションを外しています。
<Directory /home/httpd/html>
Options Includes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
cgiを動かす場合、/etc/apache2/conf-availableにあるserve-cgi-bin.confを修正して使います。以下の例は、serve-cgi-bin.confでcgiのディレクトリを/var/www/cgi-binに変更しただけの例です。
<IfModule mod_alias.c>
<IfModule mod_cgi.c>
Define ENABLE_USR_LIB_CGI_BIN
</IfModule>
<IfModule mod_cgid.c>
Define ENABLE_USR_LIB_CGI_BIN
</IfModule>
<IfDefine ENABLE_USR_LIB_CGI_BIN>
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory "/var/www/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
</IfDefine>
</IfModule>
serve-cgi-bin.confを有効にするために、site設定ファイルに以下の1行を加えます。
Include conf-available/serve-cgi-bin.conf
また、cgiのモジュールを有効にするため、次のコマンドでcgidモジュールを有効にします。
# a2enmod cgid
認証が必要なディレクトリは、次のようにディレクティブを記述します。これまではBasic認証(パスワードがそのまま流れる認証)で行ってきましたが、最近のブラウザはDigest認証(パスワードが暗号化して流れる認証)に対応しているため、この機会に変更することにしました。この例は、/var/www/html/secret以下のディレクトリに、Digest認証をパスする全ての人(valid-user)にアクセスを認める設定です。ユーザIDとパスワードのファイルはAuthUserFileに記述されたファイル(/etc/apache2/.htdigest)となります。
<Directory /var/www/html/secret>
AuthName "Restricted Space"
AuthType Digest
AuthDigestDomain /secret/
AuthUserFile /etc/apache2/.htdigest
require valid-user
</Directory>
次に、パスワードファイルを作成します。たとえば、fishers fellowというユーザIDを作成する場合、次のように入力します。
# htdigest -c /etc/apache2/.htdigest 'Restricted Space' 'fishers fellow'
# Adding password for fishers fellow in realm Restricted Space.
# New password:{パスワードを入力}
# Re-type new password:{パスワードを再入力}
パスワードファイルにユーザIDとパスワードを追加する場合、-cオプションが不要です。たとえば、fishers guestというユーザIDを追加する場合、次のように入力します。
# htdigest /etc/apache2/.htdigest 'Restricted Space' 'fishers guest'
# Adding password for fishers guest in realm Restricted Space.
# New password:{パスワードを入力}
# Re-type new password:{パスワードを再入力}
上記でDigest認証の設定が終わりました。最後にDigest認証が可能になるように、auth_digestモジュールを有効にしてから、apache2を再起動します。
# a2enmod auth_digest
# service apache2 restart
ちなみに、auth_digestモジュールを有効にする前にapache2を再起動しようとするとエラーになります。
検索機能はCGIで行うため、Hyper-Estraierを設定する前にCGIを使えるようにしておきます(CGIの設定を参照)。また、make、gccがインストールされていない場合、apt-get installでmakeとgccをインストールします。
その後、Hyper-Estraierをインストールして設定します。その方法はHyper-Estraierのイントロダクションのページに記述されたやり方そのものです。僕の環境では、Hyper-Estraierの他に、libicnv、QDBM、zlibも必要でした。以下、それらのtarballをダウンロード&インストールした後、Hyper-Estraierをインストールする手順を示します(libiconv、QDBM、zlibも同様の手順でインストールできます)。
|
|
|
以上でインストールは終了です。もしHyper-Estraierをアンインストールしたいならば、tarballを展開したディレクトリでmake uninstallを行います。
次にコンフィグファイルを編集し、検索用インデックスを作成します。コンフィグファイル(estseek.conf)をエディタで開き、次の箇所を修正します。
|
|
|
上の編集を終えたら、好みでテンプレート(estseek.tmpl)やトップページ(estseek.top)も編集します。 もちろん、estseek.confでtmplfileとtopファイルに自前のものを用いても問題ありません。編集が終えたら、estseek.cgiのパーミッションを100に、テンプレートなどは400に変更し、ユーザ、グループをwww-dataに変更します。
|
|
最後に、検索用インデックスを下のコマンドで作成します。その際、estseek.confのindexnameに指定したディレクトリに検索用インデックスを作成しなくてはなりません。
|
|
|
estcmdには指定したディレクトリ以下を除外するオプションがありません(ファイル単位ならばあります)。 そのため、例えば/var/www/html/friendを検索結果に表示したくない場合、後から逐一friend配下のファイルを 除外することになるのが少し面倒です。。。
Ubuntu Server 14.04 LTSのカーネルは、dmesgで以下のように表示され、デフォルトでワイヤレスLANを認識します(ちなみにBluetoothも認識します)。
[ 13.024498] Intel(R) Wireless WiFi driver for Linux, in-tree:
[ 13.024503] Copyright(c) 2003-2013 Intel Corporation
[ 13.024706] iwlwifi 0000:02:00.0: irq 106 for MSI/MSI-X
[ 13.406227] iwlwifi 0000:02:00.0: Direct firmware load failed with error -2
[ 13.406233] iwlwifi 0000:02:00.0: Falling back to user helper
・
・
・
[ 14.231778] iwlwifi 0000:02:00.0: Detected Intel(R) Wireless N 7260, REV=0x144
ワイヤレスLANの設定には、iwというパッケージが必要です。apt-get install iwでインストールします。その後、archlinuxのWireless Setup(日本語)を参考にセットアップしました。
まず、モジュールが読み込まれているか確認します。必要なモジュールは次のものです。
iwlmvm :IntelのワイヤレスLANドライバ
iwlwifi :IntelのワイヤレスLANドライバのファームウェア
mac80211:ドライバのフレームワーク
cfg80211:IEEE802.11の設定用API
読み込まれていないモジュールがあれば、modprobe モジュール名 で読み込みましょう。ただ、これらのモジュールは僕の環境では自動で読み込まれていました。
今後はワイヤレスLANのデバイス名を調べます。iw dev を実行すると表示されます。
# iw dev
phy#0
Interface wlan0
ifindex 3
type managed
上記では、デバイス名はwlan0です。
もし、僕の環境のように、iptablesでwlan0がブロックされているならば、以下のコマンドでwlan0を通過するパケットを通すようにしておきます。
# iptables -A INPUT -i wlan0 j ACCEPT
# iptables -A OUTPUT -o wlan0 -j ACCEPT
次に、デバイスを有効にします。ipコマンドを使って、次のように入力します。
# ip link set wlan0 up
デバイスwlan0が有効になったかを、次のipコマンドで確認します。
# ip link show wlan0
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether ac:7b:a1:e7:98:bb brd ff:ff:ff:ff:ff:ff
上の表示のように、UPが出力されていればデバイスが有効になっています。ipコマンドでデバイスを有効にしましたが、ifconfig wlan0 up でも同じです。
デバイスが有効になったら、wpa_supplicantを使ってワイヤレスLANの認証などの設定します。但し、wpa_supplicantは開発途上のため、バージョンによって多少の変更があるようです。ここではv2.1で設定しています。
WPAやWPA2認証でwpa_supplicantを使用するには、まず暗号化されたWPA認証キーを作成した方が良いです。次のコマンドで作成できます。
# wpa_passphrase SSID 認証キー >> /etc/wpa_supplicant/wpa_supplicant.conf
上のコマンドでは、/etc/wpa_supplicant/wpa_supplicant.confに暗号化された認証キーが書き出されます。一例として、SSIDを「TEST_ID」、認証キーを「ninsyou_key」で作成したwpa_supplicant.confを以下に示します。
network={
ssid="TEST_ID"
#psk="ninsyou_key"
psk=2a0e54f69929d141237a32d35257a6da1865d64e41e165a59bba9c45b6d98cce
}
#psk=の行には、暗号化されていないパスワードが確認用に書き出されます。確認を終えたら消しておきましょう。
次の、自分のネットワーク環境に合わせてwpa_supplicant.confの「network={」以下に追記します。WPA2-PSK(AES)でステルスSSIDに接続するには次のようになります。
network={
ssid="TEST_ID"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
group=CCMP
psk=2a0e54f69929d141237a32d35257a6da1865d64e41e165a59bba9c45b6d
scan_ssid=1
}
各設定項目の意味は次の通りです。他の設定項目は、「Gentoo Linuxドキュメントの無線ネットワーク」などを参考にしてください。
| 説明 | |
| 特定のアクセスポイントに接続する場合は必須 | |
| 暗号化方式。WPA2ならRSN、WPAならWPAで、WEPの場合は不要です。 RSN WPAを併記すると、複数の暗号化方式を試します。 | |
| キーマネージメントプロトコル。WPA-PSKまたはWPA-EAPが入ります。 個人の使用ではWPA-PSKがほとんどです。 | |
| WPAの一対一の暗号化手法。AESはCCMP、TKIPはTKIPを指定します。WEPの場合はnoneとなります。 | |
| WPAのブロードキャスト時の暗号化手法。AESはCCMP、TKIPはTKIPを指定します。WEPの場合はnoneとなります。 | |
| SSIDのスキャン方法の指定。ステルスSSIDの場合は1を指定しないと繋がらない。 |
wpa_supplicant.confの設定を終えたら、次のコマンドでアクセスポイントに接続します。
# wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
無事に接続できると、次のようなメッセージが表示されます。以下の「AP」はアクセスポイントの略称です。
Successfully initialized wpa_supplicant
wlan0: CTRL-EVENT-SCAN-STARTED
wlan0: SME: Trying to authenticate with APのMACアドレス (SSID='TEST_ID' freq=2417 MHz)
wlan0: Trying to associate with APのMACアドレス (SSID='TEST_ID' freq=2417 MHz)
wlan0: Associated with APのMACアドレス
wlan0: WPA: Key negotiation completed with APのMACアドレス [PTK=CCMP GTK=CCMP]
wlan0: CTRL-EVENT-CONNECTED - Connection to APのMACアドレス completed [id=0 id_str=]
wlan0: WPA: Group rekeying completed with APのMACアドレス [GTK=CCMP]
wpa_supplicantコマンドを実行するとシェルが入力できなくなります。そこで、接続を確認できたら「-B」オプションを付けてバックグランドで実行します。
# wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -B
無事に接続できたかを確認するには、iwconfig wlan0 を実行し、「Access Point」にアクセスポイントのMACアドレスが表示されていればOKです。接続できていない場合、「Not-Associated」と表示されます。
最後にIPアドレスを与えます。固定IPアドレスの場合は次の通りです。ここではIPアドレスを192.168.0.9/24の例です。
# ip addr add 192.168.0.9/24 dev wlan0
DHCPの場合は次の通りです。
# dhclient wlan0
通信ができているかどうかは、ifconfig wlan0で確認できます。
ワイヤレスLANを切断する場合、次のコマンドを実行します。
# ifconfig wlan0 down
# ip addr del 192.168.0.9/24 dev wlan0
# ps ax |grep wpa_supplicant
# kill -9 上記のプロセスID番号
起動時にワイヤレスLANが繋がるようにするには、/etc/network/interfacesファイルに以下を追記します。iptablesの設定の前に記述しましょう。
# The secondary network interface
auto wlan0
iface wlan0 inet static
address 192.168.0.9
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.145
dns-nameservers ネームサーバのIPアドレス
dns-search localdomain
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
USBの外付けハードディスクが意外とうるさく、再起動にたまに失敗することから、内臓ハードディスクへ変更することにしました。結局は再度インストールしたのですが、Ubuntuのパーティションがext3ならばPartedを使って、パーティションのコピーとリサイズができると思います。
パーティションをコピーした後、GRUBをがUbuntuのパーティションの先頭にインストールしていれば、Ubuntuのパーティションをアクティブにしておくと起動できるかも知れません。一方、MBRにGRUBをインストールしている場合、内臓ハードディスクのMBRにGRUBを再度インストールする必要があります。
GRUBを再インストールするにはUbuntuのインストールディスクを使います。手順は次の通りです。
ちなみに、レスキュー操作の画面には、選択したデバイス(例 /dev/sda1など)内でシェルを動かすこともできます。このシェルを用いると、設定ファイルなどを見ることができますが、書き込みができない状態になっています。これはデバイスを読み取り専用でマウントしているためです。その場合、次のコマンドで再マウントすると読み書きできるようになります。
# mount -o remount,rw /
パーティションの一つが壊れて起動できなくなった際、/etc/fstabを編集する必要が生じます。このような時にレスキューモードとルートファイルシステムの再マウントで/etc/fstabを編集できるようになります。