ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2015年4月11日土曜日

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(5)

■Squid3のインストール


 現在のバージョンは3.1.20。
$ sudo apt-get install squid3

 初期設定を確認するなら
$ cat /etc/privoxy/config | grep -v ^#

 そして設定。
$ sudo nano /etc/squid3/squid.conf

 設定ファイルが超長い!!ので、公式のminimum settingを手直しして、ファイルを1から作ったほうがいいかも。
 ウチの設定はこんな感じ。
http_port [port of Squid3]
htcp_port 0
icp_port 0
cache_peer localhost parent [port of Ziproxy] 0 no-query no-digest no-netdb-exchange
cache_mem 64 MB
cache_dir ufs /var/spool/squid3 1024 16 256
maximum_object_size 32 MB
maximum_object_size_in_memory 64 KB
refresh_pattern ftp: 1440 20% 10080
refresh_pattern gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
hierarchy_stoplist cgi-bin ?
half_closed_clients off
negative_ttl 1 minutes
pipeline_prefetch on
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 192.168.x.0/24 # RFC 1918 possible internal network
acl to_ipv6 dst ipv6
acl winupdate dstdomain .microsoft.com .windowsupdate.com
acl manager url_regex -i ^cache_object:// +i ^https?://[^/]+/squid-internal-mgr/
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
http_access deny to_ipv6 !all
http_access allow manager localhost
http_access deny manager
http_access allow winupdate
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow localnet
http_access deny all
tcp_outgoing_address [RPi2-IPAddr.] !to_ipv6
tcp_outgoing_address [RPi2-IPv6-Addr.] to_ipv6

 IPv6化のための設定をして、他に少し盛り込んである感じ。
 詳しいことは公式faqを参照。
 設定したら再起動。
$ sudo /etc/init.d/squid3 restart

■Privoxyのインストール


 現在のバージョンは3.0.19。
$ sudo apt-get install privoxy

 そして設定。
$ sudo nano /etc/privoxy/config
user-manual /usr/share/doc/privoxy/user-manual
confdir /etc/privoxy
logdir /var/log/privoxy
actionsfile match-all.action
actionsfile default.action
actionsfile user.action
filterfile default.filter
filterfile user.filter
logfile logfile
listen-address  :[port of Privoxy]
toggle 1
enable-remote-toggle 1
enable-remote-http-toggle 1
enable-edit-actions 1
enforce-blocks 0
permit-access 192.168.x.0/24
buffer-limit 8192
forward / localhost:[port of Squid3]
forwarded-connect-retries  0
accept-intercepted-requests 0
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 5
socket-timeout 300

 フィルタ内容は割と頻繁に変えると思うので、WebGUIは殺さずに残しておいた。
 フィルタ内容は「/etc/privoxy/user.action」を直接書いてもいいし、プロキシを通す設定をしたブラウザから「http://p.p/」で現れるPrivoxyのWebUIから設定しても良い。
$ sudo /etc/init.d/privoxy restart

 ウチの場合はWebGUIからmatch-all.actionを編集し、「Set to Cautious」で設定しておいた。
 GIF de-animation?NO!NO!NOooo!
 match-all.actionの設定についてはマニュアルを参照。

 user.actionのフィルタは各自で適宜設定する。
 自分の場合は、Android上でFilterProxyを使っていたので、その設定を流用した。

■Muninのインストール


 RPi2を監視できるよう、ついにで入れておく。バージョンは2.0.6。
 以下のページを参考に、OwncloudPieでインストールされたnginxでMuninが参照できるように設定した。

- mk-mode BLOG
Debian 7 Wheezy - サーバ監視ツール munin 導入!

 ウチでは一週間使用して、500MB~700MBで安定して推移している。

■それ以外の設定


 カーネルパラメータの設定とかしてみるといいかもしれない。
 ネットワーク環境がジャンボフレームに対応してるなら、MTUを変えてみてもいいんじゃないだろうか。
(ウチはルータにヤマハのRTX810を使っているため、ジャンボフレーム化はしていない)

 せっかくdnsmasqで宅内DNSキャッシュサーバを立てたのに、IPv6優先設定をしたWindows機だと、先にIPv6を使って、IPv6のDHCP元のISPのDNSに問い合わせてしまって、宅内DNSを使ってくれないのが残念。
 まぁサーバ内部で使う機会が一番多いからいいんですけどね…。

■結果


 Squidのログを確認したところ、SquidからZiproxyに接続できない場合があるため、原因を調査したところ、ZiproxyはIPv6に対応していないことが判明。
 どうやらIPv6アドレスをリクエストした時にZiproxyに接続できず、Squidが直接リクエストを処理していたため気づかなかった模様。
 解決法は以下の2通り。

  1. Squid→Polipoにプロキシをバイパスする(Ziproxyを諦め、IPv6に対応する)
  2. 「/etc/modules」のIPv6モジュールを削除して、PolipoをIPv4対応に戻して不貞寝(IPv6を諦める)

さあ!不貞寝の時間だ!
(2.を選んだ模様)

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(4)

■Polipoのインストール


 現在のバージョンは1.0.4.1。
$ sudo apt-get install polipo

 そして設定。
$ sudo nano /etc/polipo/config

 のち再起動。
$ sudo /etc/init.d/polipo restart

 ウチの設定内容を晒しておくと…
proxyAddress = "::0"
proxyPort = [port of Polipo]
allowedClients = 127.0.0.1, 192.168.x.0/24
diskCacheRoot = ""
dnsQueryIPv6 = happily
dnsUseGethostbyname = true
pmmFirstSize = 65536
pmmSize = 32768
disableLocalInterface = true
relaxTransparency = maybe

 「relaxTransparency = maybe」は、パイプライン取得に対応していないサイトを表示した場合に502(実際には206)エラーとなるのを回避する。
 具体的にはZiproxyの公式ページから「Download」や「faq」に遷移した場合にエラーとなるのを回避している。

■Ziproxyのインストール


 現在のバージョンは3.2.0。
$ sudo apt-get install ziproxy

 そして設定。
$ sudo nano /etc/ziproxy/ziproxy.conf
Port = [port of Ziproxy]
OnlyFrom = "192.168.x.1-192.168.x.254"
NextProxy="[RPi2-IPAddr.]"
NextPort=[port of Polipo]
UseContentLength = false
ProcessGIF = false
ProcessHTML = false
ProcessCSS = false
ProcessJS = false
ImageQuality = {50,50,80,0}

 また、ownCloudでやりとりする画像まで圧縮しないように、「noprocess.list」に以下を追加。
$ sudo nano /etc/ziproxy/noprocess.list
http://192.168.x.*/*

 のち再起動
$ sudo /etc/init.d/ziproxy restart

 設定については、Ziproxyのソースを落としてREADMEに書いてあることを読んでおくことを推奨。
 元のziproxy.confには「Image quality is specified in integers between 100 (best) and 0 (worst).」と書いてあるけど、0を指定した場合、実際にはZiproxyは処理を行わずに画像をバイパスする。
 また、HTMLを圧縮する設定にしても、子プロキシがSquidの場合は圧縮したHTMLを渡さない、とも書いてある。
 実際に、IE11でF11キーを押して出てくるデバッグモードから確認すると、確かにSquidを通す場合と通さない場合でHTMLの受信サイズ(展開後のサイズではない)が違うので、ZiproxyをSquidの親として設定する場合は、不要な処理をしないように「ProcessHTML」等をfalseにしておくと良い。
 ProcessGIFは…GIFアニメーションが静止画になってしまうのでfalseに。

 自分の場合は、ある程度大きい画像はコンテンツの一部としてみなして圧縮せず、小さい画像はページの装飾物とみなし、画質をある程度落とす程度とした。
 サムネが多い画像掲示板やTumblr、また装飾物が多い楽天のショップ等は、これで結構軽くなった。


キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(5)に続く...

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(3)

■Dnsmasqのインストール

現在の(Raspbian-wheezyでの)バージョンは2.62。

$ sudo apt-get install dnsmasq
$ sudo nano /etc/resolv.conf
nameserver 127.0.0.1
nameserver [ISPのDNSサーバ]
 あとは「/etc/hosts」に好きに書いて、再起動すればいいじゃない。
$ sudo /etc/init.d/dnsmasq restart

■ownCloudのインストール


 面倒なのでOwncloudPieを使用。

- GitHub - petrockblog
OwncloudPie

 wheezyのphpバージョンは5.4だけど、php-apcまで導入済み。
 その上、nginxとvarnishまで入るので、既に最適化はされている模様。
 OwncloudPieでは、ownCloudのバージョンは最新版(latest)が入る。
$ sudo apt-get install -y git dialog
$ cd
$ git clone git://github.com/petrockblog/OwncloudPie.git
$ cd OwncloudPie
$ chmod +x owncloudpie_setup.sh
$ sudo ./owncloudpie_setup.sh

 オレオレ証明書の作成は適当に。入力しない項目は“.”を入力すること。

 ちなみに、Apache2版を入れた場合、現在のバージョンのownCloud8では「.htaccessに書かれてるバージョンが違う」と言われてハマる。特別な事情がない限り、素直にnginx版を入れたほうが無難。

 このままでもownCloudは使えるけども、DBにsqliteを使ってしまう。
 sqliteでは管理するファイルが増えてきた場合に遅くなってきてしまう。また、そうなってから別DBに移行しようとすると超絶面倒&失敗すると全てがパァなので、最初からMySQLを使うように設定しておく。
$ sudo apt-get install mysql-server

 インストール時にMySQLのパスワードを設定しておく。
$ sudo apt-get install php5-mysql
$ sudo mysql -u root -p

 ここでMySQLのパスワードを聞かれるため、インストール時に設定したパスワードを入力する。
mysql> create database owncloud default character set utf8;
mysql> show databases;
mysql> grant all on owncloud.* to owncloud@localhost identified by '[owncloud@localhostのパスワード]';
mysql> \q

 あとは「http://[RPi2-IPAddr.]/owncloud」で現れるowncloudの初期設定画面から、DBにMySQLを使うよう設定すればOK。

 TS-121のownCloud6より、ずっと早い!!
 Android機での同期速度は2MB/sくらい(FolderSyncを使用)ですが、実際にUp/Downを頻繁にするわけでもないので、まぁこれはこれで。

 2GB程度の同期チェックで1分程度なので、遅いと見るか早いと見るか…。
 物足りない人はBittorent Syncなんかを使うといいかも。


キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(4)に続く...

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(2)

■RaspbianをUSB-SSDから起動させる


 USBメディアから起動させる方法は、調べればチラチラ出てきます。
 無駄なくキチンとやりたい場合は、以下のようなページを参考にどうぞ。

- 屋根裏Linux
05 Raspberry PiファイルシステムHDD化 その1/3 (HDD接続~データ移行)

- 月と杜
Raspberry Pi USB HDD起動

 自分の場合は…面倒なので、以下の方法を取りました。
 富豪的アプローチで良ければこちらをどうそ。

  1. 4GB以上のmiscroSDカードにRaspbianを焼く
  2. そのままUSB-SSDにもRaspbianを焼く
  3. 1.で焼いたmicroSDカードのconfig.txtとcmdline.txtを書き換える
  4. GParted等のパーティション操作ツールでSSD上のext領域を拡張する

…というもの。SSDの先頭60MBくらいは無駄に空くけど、FATフォーマットして設定ファイルのバックアップ先として使ってもいいんじゃないの?(適当)

 1.と2.は…特に特殊なことはせず、3.ではUSBの電力アップと、起動先の変更のために以下を変更。

【config.txtに追記】

safe_mode_gpio=4
max_usb_current=1
gpu_mem=16

【cmdline.txtを変更】

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
↓
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline rootwait

 microSDはFAT領域に書かれた内容(/boot)しか使わないので、容量が少ない別のmicroSDをFATフォーマットして、そっちに内容を移してもいい。自分は1GBのmicroSDに内容を移して使っている。

 4.も各自好きな方法で…LiveCDとかUSBからUbuntuとかのLinuxを立ち上げてGPartedを使ったり、PartitionMagicを使ったりとかで。
 自分の場合はEeePC901X上のLinuxBeanでGPartedを使って拡張した。
 ちなみに、raspi-configで4.をやろうとしても、「SDカードじゃないからできないよ」的なメッセージが出るので注意。

 sda2を最大拡張してもいいけど、inodeが気になる人は別パーティションを作って、SquidのキャッシュとかownCloudのデータをそっちに退避させると良いかも。

 ここまでで準備したmicroSDとUSB-SSDとUSB-GbEアダプタと、ひとまずHDMIとUSBキーボードもRPi2に繋いで、電源オン。

 raspi-configとかrpi-updateとかする前に、まずはUSB-GbEアダプタを使えるように設定。
$ sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth1
iface eth1 inet static
address [RPi2 IPAddress]
netmask 255.255.255.0
gateway [Gateway IPAddress]
broadcast [Broadcast IPAddress]
 broadcastは無くても良いが…。

■IPv6対応&ポート閉塞


 次に、IPv6対応させるための設定。(IPv6対応させない場合は飛ばして良い)
 ついでに、音なんて鳴らさないのでサウンドモジュールはコメントアウト。
$ sudo nano /etc/modules
#snd-bcm2835
ipv6
 後はraspi-configでお好きな初期設定を。
$ sudo raspi-config
一応、raspi-config自体をupdateして、

  • Xを起動しない
  • サーバ名変更
  • timezone変更
  • ja-JP.UTF-8とja-JP.EUCの追加(LANGはen-GB.UTF-8のまま)
  • enable SSH

をするくらいか。RPi2の場合はoverclockしなくてもよいかと。
 さらに、サーバとして使用するのに不要なパッケージを削除。
$ sudo aptitude

 出てくるメニューから、以下の項目を探して“_”→“g”→“g”でパッケージ削除。

  • X11
  • gnome

 さらにdbus関連と、何やら残るゴミも削除。
$ sudo apt-get remove dbus
$ sudo apt-get autoremove
$ sudo apt-get autoclean
$ rm -rf /home/pi/python_games/
$ sudo rmdir /usr/local/games/
$ sudo rmdir /usr/games/

 ここまでできたらようやく最新化。

$ sudo rpi-update
$ sudo apt-get update
$ sudo apt-get dist-upgrade
 IPv6の場合は、ルータのファイアウォールでは外部パケットが弾かれないため、外部から直接アクセスできてしまう。
そのため、iptablesを変更してRPi2へIPv6でアクセスすることを禁止する。
 自分の場合はufwで全ポートを閉じ、IPv4のみポートを開く設定とした。
$ sudo apt-get install ufw
$ sudo ufw enable
$ sudo ufw default DENY
$ sudo ufw allow from 192.168.x.0/24

 セグメントは適宜変えておくこと。
 ufwについてはUbuntu Weekly Recepiの76回と77回を参考にした。慣れてて良かったUbuntu。ありがとう技術評論社。

 ここまでしたら電源を落として、USB-GbEにLANケーブルを繋げて再起動。
 HDMIとUSBキーボードも不要の場合はここで外してしまって良い。
$ sudo halt

 続けて「shutdown -h now」しなくて良いなんて、いい時代になったなぁ…。
 もう本体自体は弄らないので、RPi2を設置場所へ持って行ったら電源投入して、あとはSSH接続で以下続行。

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する(3)に続く...

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(1)

※このページは能書きのため、実際の設定は以下のページを参照。
※「IPv6対応」と謳いながら、ZiproxyはIPv6に対応できていない。詳細は「■結果」を参照。

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(2)
 ■RaspbianをUSB-SSDから起動させる
 ■IPv6対応&ポート閉塞

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(3)
 ■ownCloudのインストール
 ■Dnsmasqのインストール

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(4)
 ■Polipoのインストール
 ■Ziproxyのインストール

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(5)
 ■Squid3のインストール
 ■Privoxyのインストール
 ■Muninのインストール
 ■それ以外の設定
 ■結果

 2012~2013年は、新居の設計、引っ越し、転職…といろいろあったけど、それはそれとして一気に省略。
 2012年のおれに言いたいこととしては…
  • 全てのコンセントは3極にしておけ!
  • 壁面に埋め込まれるLANのケーブルは、黙ってカテゴリ7にしておけ!
という事くらい。あとは概ねいいチョイスだったぞ!過去のおれ!

■キャッシュサーバをCubox→TS-121→RaspberryPi2に移行するまで


 引っ越しの際、NASをQNAP TS-121に変更したため、Squid、PrivoxyはCuboxからこちらに移行。
 空いたCuboxにGeexboxを入れてUSB-DACに繋いで遊ぶか…と思い立ち、久々にCuboxを触ると、SolidRunのHPからCuboxのWikiが消えてしまい、ググっても出てくるのはCubox-iとHummingBoardの情報ばかり。
 Geexboxも、Cubox-Installerから入れられるのはarmhf版のNightlyBuildだけで、USB-DACを繋ぐとフリーズするので、公式ページを覗きに行くと、まさかのISISクラッキング。
 こりゃちょっと安心して遊べないぞ…ということで、代替わりしたRaspberryPi2(以下RPi2)でいろいろ遊んでいたところ、以下のページを発見。

- Midwestern Mac, LLC
Getting Gigabit Networking on a Raspberry Pi 2 and B+


 そういや、丁度手元にUSB3.0のUSB-GbEアダプタがあるな…とpingを使って簡単に計測すると、200Mbpsとまではいかないが、160Mbpsは出ている計算。

  60000(Bytes ping packet) * 2(Times[Up/Down]) * 8(byte to bit) / 0.006(sec) = 160Mbps
    ※玄人志向 GbE-USB3.0S2とサンワサプライ 400-HUB022で確認。どちらも同値。

 暗号化しないFTPでも150~200Mbpsは出ているので、これは案外使えるんじゃね?ということで、ついカッとなってRPi2をサーバに仕立てて遊んでみた。後悔はしていない。…多分。
(もうすぐDebian-jessieがリリースされるのにwheezyか…とかその辺は置いとく)
 初代RPi(メモリ256MB版)でも実測120Mbpsは出ているので、そちらでもメモリが許す限りの範囲でサーバ化は可能なんじゃないだろうか。
(512MBは実測前に友人に譲渡したので不明。B+、A+はそもそも持ってないので実測していない)

■RPi2をサーバ化してやってみたいこと

  • TS-121にownCloud6を入れて、あまりの遅さに使用を断念したので、RPi2上のownCloud8はどんなモンだか使ってみたい
  • 引っ越しに当たり、NGNのIPv6-IPoE環境に移行したので、入れるサーバもIPv6化しておきたい
  • Polipo+Ziproxy+Squid3+Privoxy+dnsmasqで「ぼくのかんがえたさいきょうのキャッシュサーバ」を作ってみたい
というわけで、Cuboxで使っていた64GB-SSDもSATA-USB変換をカマして接続し、本格的にサーバ化してみたのでした。
 ちなみに、構成としては以下の通り。

THE INTERNET !!
↑
Polipo
↑
Ziproxy
↑
Squid3
↑
Privoxy
↑
Client(PC, Tablet, etc...)

Polipo:外部サーバとのアクセスをHTTP1.1化
Ziproxy:画像ファイルの画質をある程度犠牲にして再圧縮して省サイズ化
Squid3:ziproxyで圧縮した状態のファイルをキャッシュ
Privoxy:広告等の不要なリクエストをリジェクト

…という構成。IPv6対応させるためにSquidは2系じゃなく3系を使用。
 普段はPolipo+Squid3で、スマホやVPNの場合だけZiproxy+Privoxyを使う、という場合は、SquidとZiproxyを入れ替えてもいいかもしれない。
 また、Privoxyより上位のプロキシに直接接続できるよう、意図的に接続先を絞っていないので、プロキシ全体が安定してきたら、接続先を絞っておくと良い。

 「IPv6-IPoEならPPPoEの速度制限を受けないから、キャッシュ要らなくね?」という問いには聞こえないフリをしますよ?


キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(2)に続く...

2013年1月16日水曜日

RaspberryPiでMusicPlayerDaemonサーバを構築する


【2013/3/27 修正】

  • 日本語ロケール化をしないよう修正
  • PulseAudioのインストール手順が抜けていたのを修正
  • mount.cifsのマウントオプション「codepage」が指定できなくなっていることに対応



自宅で使っているミニコンポでネットワーク上の音楽を手軽に聴くため、RaspberryPi(RAM512MB版)のRaspbian"Wheezy"上にMusicPlayerDaemon(MPD)を入れてみたので、その時のメモをまとめておく。
主に参考にしたサイトはこちら。

■n-mmra.net Web Site
Raspberry Piのいたずら
Raspberry Pi+MPDの設定

RaspberryPiでMPDサーバを立てよう!と考えている人は多く、どのページも上手にまとめられているが、上記のページは特に丁寧にまとめられているので、詳しく知りたい方はこちらを参照した方が良いだろう。
先人の方々、ホントにありがとうございます…m(__)m


【前提】
RaspberryPiの内部音源のみでMPDを構築しようとした場合、

  1. 内臓音源の起動/停止時(電源ON/OFF時)
  2. 演奏の開始/停止時(音源サスペンドON/OFF時)
に発生するポップノイズが大きな障害となる。
ここでは2.のポップノイズに対処する方法と、RaspberryPi+USB-DACで運用する方法の2通りを紹介する。
※1.のポップノイズはソフトウェアでの対応は難しいため断念した。

  • SSH接続で運用するため、GUIは使わない。
  • USB-DACを使用する場合はALSA経由で接続する。
  • USB-DACを使用せず内臓音源を使用する場合はPulseAudio経由で接続し、RaspberryPiを常時稼働させる。
  • MPDの操作はスマートデバイス(Android端末)上で行う。

【物理的に準備するもの】

  • RaspberryPi(USB-DACを使用する場合は512版を推奨)
  • RaspberryPi用の電源(5V700mAが必要だが、USB-DACを利用したり、USBメモリを抜き差しするなら1A以上推奨)
  • SDカード(RaspberryPiとの相性は事前に調べておくと良い)
  • USBキーボード
  • HDMI入力かRCA映像入力(懐かしの黄色いビデオ端子)を持つディスプレイ
  • 母艦(Windows)


【下準備】
RaspberryPiにディスプレイとキーボードをつないでおく


■Raspbianのインストール
Windows母艦でRaspbianのイメージをSDカードに書き込む。
公式ページではWin32DiskImagerでRaspbianのイメージをSDに書き込め、と書いてあるので、それをそのまま実行。
現在のRaspbian配布イメージだと、何もしなくても512MBのRAMを認識してくれるので、ファームウェア更新等の必要は無し。
raspi-configでSDカードの領域拡張した後は、以下の項目を設定しておく。


  • change_locale:"en_GB.UTF-8 UTF-8","en_US.UTF-8 UTF-8","ja_JP.UTF-8 UTF-8"(default_locale:"en_US.UTF-8")
  • change_timezone:"Asia - Tokyo"
  • memory_split:"16MB"
  • ssh:"enable"
  • boot_behaviour:"no"


overclockはお好みで。とはいえ、700MHz動作でも、MPDだけならCPU負荷は20%程度(PulseAudioの場合は25%程度)なので、他に何もさせない場合は安定性の面から"none"を推奨。
SDカードの領域拡張処理は再起動後に行われるため、再起動に時間がかかる。


■利用ユーザの追加
初期ユーザ"pi"、パスワード"raspberry"でログイン後、新しいユーザを追加する。
$ sudo adduser [UserName]
$ sudo visudo
新しいユーザでsudoが利用できるよう、以下の行を追加。
[UserName] ALL=(ALL) ALL


■SDカードの領域をjournal_data_writeback modeにする
SDカードの領域はext4でフォーマットされているので、Cubox同様にjournal_data_writeback modeにしておく。
$ sudo tune2fs -c 0 -o journal_data_writeback /dev/root


■初期ユーザの停止
ログアウト後、追加したユーザでログインし、sudoが使えることを確認がてら、初期ユーザ"pi"を削除する。
$ sudo userdel -r pi


■日本語対応
日本語表示と日本語入力に対応させておく。
SSH接続がメインになるので、不要かもしれないが…将来のメンテナンス用に。
$ sudo apt-get install fonts-ipafont ttf-vlgothic xfonts-intl-japanese xfonts-intl-japanese-big
$ sudo apt-get install ibus-anthy
$ sudo dpkg-reconfigure locales
$ echo "export LANG=ja_JP.UTF-8" >>~/.profile


■ホスト名変更
固定IPで運用する場合は/etc/network/interfacesに設定を行う。

$ sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback
iface eth0 inet static
address [RPi-StaticIP]
netmask 255.255.255.0
broadcast 192.168.XXX.255
gateway [DefaultGatewayIP]
dns-nameservers [DNSServerIP]
以下のファイルにホスト名を設定しておく。

$ sudo nano /etc/hostname
[HostName]
$ sudo nano /etc/hosts
127.0.1.1 [HostName]
また、再起動後、ifconfigで現在のIPアドレスを確認しておくと、ここから先の作業はSSH経由で可能となる。
$ ifconfig eth0
他の端末からホスト名でアクセスしたい場合はSambaを入れておく。
$ sudo apt-get install samba


■MPDのインストール
MPDと、MPDを操作するためのクライアント(MPC)をインストールする。
$ sudo apt-get install mpd mpc
$ sudo apt-get install alsa-utils


■USB-DACの設定
USB-DACを使用する場合は、ここでDACを接続して認識されることを確認しておく。
ウチの場合(LXU-OT2)は以下のように認識された
--------------------------------------------------
$ dmesg
[  647.493275] usb 1-1.3: new full-speed USB device number 4 using dwc_otg
[  647.596953] usb 1-1.3: New USB device found, idVendor=08bb, idProduct=2704
[  647.596984] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  647.597001] usb 1-1.3: Product: LUXMAN LXU-OT2
[  647.597013] usb 1-1.3: Manufacturer: LUXMAN LXU-OT2
[  647.608224] input: LUXMAN LXU-OT2                   LUXMAN LXU-OT2   as /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.2/input/input0
[  647.608337] generic-usb 0003:08BB:2704.0001: input: USB HID v1.00 Device [LUXMAN LXU-OT2                   LUXMAN LXU-OT2  ] on usb-bcm2708_usb-1.3/input2
[  647.839017] usbcore: registered new interface driver snd-usb-audio
$ cat /proc/asound/cards
 0 [ALSA           ]: BRCM bcm2835 ALSbcm2835 ALSA - bcm2835 ALSA
                      bcm2835 ALSA
 1 [LXUOT2         ]: USB-Audio - LUXMAN LXU-OT2
                      LUXMAN LXU-OT2 LUXMAN LXU-OT2 at usb-bcm2708_usb-1.3, full speed
--------------------------------------------------
このままではALSAによって内臓音源が優先して利用されてしまうため、ALSAの設定を変更する。
$ sudo nano /etc/modprobe.d/alsa-base.conf
以下の行をコメントアウト
#options snd-usb-audio index=-2


■内臓音源の設定
内臓音源をそのまま使用した場合、演奏の開始/停止時(音源サスペンドON/OFF時)に、割と大きなポップノイズが出てしまうため、PulseAudioを使用し、内臓音源をサスペンドさせないようにすることで対処する。
$ sudo apt-get install pulseaudio
$ sudo nano /etc/pulse/default.pa
以下の行をコメントアウトする。
#load-module module-suspend-on-idle
設定変更後にPulseAudioを再起動する。(ポップノイズが出ます)
$ sudo /etc/init.d/pulseaudio restart


■MPDの設定
MPDの設定を変更する。
$ sudo nano /etc/mpd.conf
以下の行をコメントアウト。
#bind_to_address "localhost"
USB-DACを使用する場合は、audio_outputの設定を以下のように変更する。(コメントアウトされているものを解除する)
audio_output {
type "alsa"
name "My ALSA Device"
device "hw:0,0" # optional
}
内臓音源を使用する場合は、audio_outputの設定を以下のように変更する。(コメントアウトされているものを解除する)
audio_output {
type “pulse”
name “MPD PulseAudio Output”
}
また、偶にMPDが音源をコントロールできないエラーを吐くことがあるので、以下のデバイスの権限を変更しておく。
$ sudo chmod 770 /dev/snd -R && sudo chgrp audio /dev/snd -R
ここまで設定できたらMPDを再起動する。
$ sudo /etc/init.d/mpd restart


■USBメモリ上の楽曲ファイルを認識させる場合
RaspberryPiにUSBメモリを刺しこんだ時にオートマウントさせて、USBメモリ上の楽曲をMPDに認識させるために、以下の設定をしておく。
$ sudo apt-get install usbmount
$ sudo ln -s /media/usb0 /var/lib/mpd/music


■NAS上の楽曲ファイルを認識させる場合
NAS上で管理されている楽曲ファイルを認識させる場合、/etc/fstabに記述を追加する。
ここではWindows上から閲覧できるNAS(Samba等)からファイルを参照することを想定している。
$ sudo nano /etc/fstab
//[NASHostName]/[TargetDirectory] /var/lib/mpd/music/[LinkName] cifs codepage=cp932,iocharset=utf8,r,defaults 0 0

※2013/03/27追記
現在の最新版「2013-02-09-wheezy-raspbian」では、mount.cifsのオプション「codepage」の指定ができないため、/etc/fstabのcodepage指定を除去した。
どうやらRaspbianに限らず、Ubuntu等のDebian系Distribution全体で、mount.cifsのオプション「codepage」が使えなくなっているらしい。
「codepage」を指定した場合のエラー内容は以下の通り。

$ sudo mount //[Server]/[TargetDir] /var/lib/mpd/music/[TargetName] -t cifs -o codepage=cp932,iocharset=utf8,r,defaults
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
$ sudo dmesg | tail -n1
[23499.354795] CIFS: Unknown mount option "codepage=cp932"



■RaspberryPiの再起動とMPC
再起動後、MPCから音出しして確認する。
$ sudo reboot
"/var/lib/mpd/music"以下に楽曲ファイルを配置しておくと、MPD側で認識される。
以下のコマンドで、配置された楽曲ファイルを全て演奏する。
$ mpc update
$ mpc ls
$ mpc ls | mpc add
$ mpc play
演奏停止は以下のコマンドで行う。
$ mpc stop
MPCのコマンドについては、エレキジャックの「Music Player Daemon (MPD) を使ってみる」を参照。


MPDの設定はここまで。Android用のMPDクライアントには「MPDroid」を使ってるけど、なかなか便利。
ただ、Android4.2だとMPDへのコネクション切断がうまくいかずに残ってしまうバグがあるようなので、Nexus7では他のアプリを使った方が良さそうだなぁ。
※クライアントの接続情報は以下のコマンドで確認可能
$ netstat -a --programs | grep 6600
RaspberryPiはNICが100Baseと貧弱なので、使いどころが難しいけど、

  • 無線LANアダプタを繋いで無線LANアクセスポイント化
  • CUPSを立ち上げてプリンタサーバ化
  • ウェブカメラを繋いで簡易な監視カメラ化

なんかが面白そうかな。まぁ、また時間ができた時にでも…。


2012年12月30日日曜日

Cuboxでコンテンツフィルタ+キャッシュサーバを構築する。


  • スマートデバイス(Android、iOS両方)でブラウジング中に出てくる広告が超ウザい。
  • スマートデバイスのブラウザで「戻る」ボタンを押しても、キャッシュ再読み込みではなくページの再取得をしてしまう。
  • 宅内の端末が増えてきたので、adblockやFilterProxy等の設定をするのが面倒。


という問題を解消するため、Debian-Squeezeを入れたCuboxにSquidGuard+Squid+Polipoを入れて、宅内LAN用のコンテンツフィルタとキャッシュサーバを立てたので、その時のメモをまとめておく。


■TXキュー長の変更
CuboxのNIC(カードじゃないけど…)は内部でバッファを持っているので、OSのTXキュー長を"0"に設定しておく。
(ちなみにデフォルト値は"1000")
# ifconfig eth0 txqueuelen 0


■Polipoのインストール
外部サーバとの通信高速化のためPolipoを利用する。
キャッシュプロキシには後述のSquidを利用するため、Polipo側のキャッシュは利用しない。
# sudo apt-get install polipo
# nano /etc/polipo/config
うちのconfigはこんな感じ。
とりあえずIPv4にのみ対応させておいたけど、そろそろIPv6にも対応させておいたおいた方がいいかな…。
Debian-Wheezyが出たら(もしくは引っ越し後に)考えよう。
--------------------------------------------------
proxyAddress = "0.0.0.0"
allowedClients = 127.0.0.1, 192.168.1.0/24
chunkHighMark = 819200
objectHighMark = 512
diskCacheRoot = ""
localDocumentRoot = ""
disableIndexing = false
disableServersList = false
dnsQueryIPv6 = no
dnsUseGethostbyname = yes
pmmFirstSize = 524288
pmmSize = 262144
relaxTransparency = maybe
--------------------------------------------------
設定したらPolipoを再起動しておく。
# sudo /etc/init.d/polipo restart


■Squidのインストール
Squidをキャッシュプロキシとして利用する。
PolipoとSquidのどちらを親プロキシにするかは諸説あるが、今回は
クライアント → (SquidGuard) → Squid → Polipo → 外部サーバ
となるよう、Polipoを親プロキシとして設定する。
# apt-get install squid
# cp -p /etc/squid/squid.conf /etc/squid/squid.conf.org
# nano /etc/squid/squid.conf
以下はCuboxをSDカードのみで利用し、メモリキャッシュのみで運用する場合の設定例。
MicrosoftUpdateやニコニコ動画等のページ、cgi等の結果はキャッシュしないようにしている。

--------------------------------------------------
redirect_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
redirect_children 5
redirector_bypass on
acl query urlpath_regex cgi-bin \? \.php$ \.asp$ \.shtml$ \.cfm$ \.cfml$ \.phtml$ \.php3$ \.js \.jsp
acl nocache-domain dstdomain .microsoft.com .nicovideo.jp .smilevideo.jp
always_direct allow query
always_direct allow nocache-domain
no_cache deny query
no_cache deny nocache-domain
acl all src all
(以下、acl関連は省略)
http_port 8080
cache_peer 127.0.0.1 parent 8123 7 no-query no-digest no-netdb-exchange http11 default
hierarchy_stoplist cgi-bin ?
cache_mem 256 MB
cache_dir null /var/tmp
maximum_object_size 20480 KB
access_log none
cache_store_log none
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320
negative_ttl 1 minutes
acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]
upgrade_http0.9 deny shoutcast
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
extension_methods REPORT MERGE MKACTIVITY CHECKOUT
header_access X-Forwarded-For deny all
header_access Via deny all
header_access Cache-Control deny all
half_closed_clients off
visible_hostname ProxyServer
nonhierarchical_direct off
prefer_direct off
never_direct allow all
tcp_recv_bufsize 65535 bytes
hosts_file /etc/hosts
ipcache_size 4096
forwarded_for off
coredump_dir none
pipeline_prefetch on
--------------------------------------------------


ウチではeSATA接続のSSD上にキャッシュを配置しているため、実際には"cache_mem"をコメントアウトし、以下の設定を有効にしている。
--------------------------------------------------
cache_dir coss [cache_dir]/cache_s  128 block-size=512 max-size=16384  membufs=4
cache_dir coss [cache_dir]/cache_m 1024 block-size=512 max-size=131072 membufs=8
cache_dir aufs [cache_dir]/cache_l 4096 16 64
maximum_object_size 1024 MB
--------------------------------------------------
redirect_programにSquidGuardを指定しているため、サービス再起動等はSquidGuardのインストール後に行う。



■SquidGuardのインストール
コンテンツフィルタとしてSquidGuardを利用する。
# apt-get install squidGuard
# cp -p /etc/squid/squidGuard.conf /etc/squid/squidGuard.conf.org
フィルタ用のブラックリストは用意されていないため、別途取得して展開しておく。以下はその取得例。
# cd /tmp
# wget http://urlblacklist.com/cgi-bin/commercialdownload.pl?type=download&file=bigblacklist
# tar zxvf bigblacklists.tar.gz
# cd blacklists
# cp -Rf * /var/lib/squidguard/db/
# cd /var/lib/squidguard/db
# chown -R proxy:proxy db
フィルタリングしたいブラックリストをSquidGuardに設定する。
# nano /etc/squid/squid.conf
ウチの設定はこんな感じ。
good と local は、自前で用意したホワイトリストとブラックリストを設定している。存在しない場合は設定自体の削除が必要。
usersとdefaultの設定を分ける必要は無いけど、まぁ将来の拡張用ということで。

--------------------------------------------------
dbhome /var/lib/squidguard/db
logdir /var/log/squid
src users {
    ip 192.168.1.0/24
}
dest good {
    domainlist good/domains
    urllist good/urls
}
dest local {
    domainlist local/domains
    urllist local/urls
    expressionlist local/expressions
}
dest antispyware {
    domainlist antispyware/domains
    urllist antispyware/urls
}
dest ads {
    domainlist ads/domains
    urllist ads/urls
}
dest spyware {
    domainlist spyware/domains
}
acl {
    users {
        pass good !local !antispyware !ads !spyware all
        redirect http://[CuboxAddress]/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
    }
    default {
        pass good !local !antispyware !ads !spyware all
        redirect http://[CuboxAddress]/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
    }
}
--------------------------------------------------
ここまで来たら、一旦SquidGuardの設定をチェック。

# squid -f /etc/squid/squid.conf -z
問題が無いようなら、SquidGuardで設定したブラックリスト、ホワイトリストをBerkleyDB化してSquidを再起動する。
# squidGuard -d -C all
# service squid reload
# /etc/init.d/squid restart
あとはクライアント側からCuboxの8080ポートをプロキシに設定すれば設定完了。
とりあえず、Squidのみの状態で一週間、Polipoも入れた状態でさらに一週間使ってるけど、特に問題らしい問題も発生していないので、安定してると言えるかと。

Cuboxの今後の課題(というか、やりたいこと)は…

  • Privoxy+Ziproxyでフィルタリングの強化&高速化
  • IPv6対応
  • 透過プロキシ化
  • DNSキャッシュサーバを構築して高速化
  • L2TP/IPSecのVPNサーバを構築

くらいかなぁ。
RaspberryPiと違って、NICが1000Baseに対応してるのと、AES復号化に使える専用コプロセッサを積んでるのはCuboxの強みだしね。

RaspberryPiは、ひとまずMPDサーバとか、宅内WebAPサーバとして使っていくことにしよう。
…丁度よく、「月刊Stereo」2013年1月号付録のUSB-DAC『LXU-OT2』も確保してあることだし!

【2015/04/11追記】CuboxからRaspberryPi2にキャッシュサーバを移行したため、興味のある方はそちらもご覧ください。
キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(1)

2012年9月9日日曜日

CuboxへDebian-SqueezeをNetworkInstallする


armhfなWheezyがstableになってないからSqueezeにしてみた。
…なんかタイトルといい、「アルファがベータをカッパらったらイプシロンした。なぜだろう?」に近いものがあるな…。
主に参考にしたサイトはこちら。

■SolidRun CuBox Wiki
Debian Installer netboot

■真・死して屍拾う者無しw
SolidRun CuBox を使ってみる(その1〜その7)

他にもいろいろと参考にしたサイトはあるけども、自分にとって一番勉強になったのが上記のサイト。
先人の方々、ホントにありがとうございます…m(__)m

【前提】
・インストール先のSDHCは1パーティション構成とする。
・FAT32でフォーマットしたUSBメモリからネットワークインストーラを起動する。
・インストール作業はLinux母艦と接続したシリアルコンソール上で行う。

【物理的に準備するもの】
・CuBox一式(付属のSDカードも含む)
・Linux母艦(今回はUbuntu12.04入りのEeePC901-Xを使用)
・有線LANのネット接続環境
・MicroUSBケーブル
・USBメモリ(60MB程度しか使わない)
・インストール対象のMicroSDカード(今回はSDHC32GB-CL10のものを使用)
…あとはタップリの時間、ですかね…。

【下準備】
■CuBox側
CuBoxは有線LANに接続し、電源アダプタは抜いておく。
インストール対象のMicroSDカードは、母艦での操作に使用しないのでCuBoxに差しておく。

■母艦側
(1)uboot関連のmake用に、uboot-mkimageをインストールする。
(ここで「u-boot-tools」も同時にインストールされる)
それと、ターミナルからシリアルコンソールに接続するためのcuコマンドもインストールしておく。
$ sudo apt-get install uboot-mkimage
$ sudo apt-get install cu
(2)SolidRun社のCuBox-Wiki「Debian Installer netboot」で指定されているリンクから、Debian-Squeeze(stable)のネットワークインストーラーイメージを取得。
$ wget http://ftp.debian.org/debian/dists/stable/main/installer-armel/current/images/versatile/netboot/initrd.gz
(3)取得したネットワークインストーラーイメージから、u-boot用の「uInitrd」に変換する。
$ mkimage -A arm -O linux -T ramdisk -C gzip -n "Debian netboot" -d initrd.gz uInitrd
(4)CuBox付属SDカードの先頭パーティション(容量が少ない方)から「boot」以下にあるカーネル「uImage」をコピーする。

(5)CuBox付属SDカードのセカンドパーティション(容量が多い方)から、「lib/modules」以下のカーネルドライバを全てgzipで圧縮しコピーする。
$ cd /[MountedMedia]/lib/modules
$ tar -cf - 2.6.32.9-dove-5.4.2|gzip -c - >  2.6.32.9-dove-5.4.2.tar.gz
(6)以下の内容の「boot.txt」を作成する。
CuBox付属SDカードの内容からは、起動パーティションとカーネル読み込みアドレスを変えてあります。
(読み込みアドレスはu-boot上で"printenv"した時の値から抜粋)
※赤太字部分はCuBox付属SDカードの/boot/boot.scrとの差分
----------↓boot.txtの内容はここから↓----------
echo ======== Setting bootargs ========
setenv bootargs 'console=ttyS0,115200n8 vmalloc=384M root=/dev/mmcblk0p1 video=dovefb:lcd0:1920x1080-32@60-edid clcd.lcd0_enable=1 clcd.lcd1_enable=0'
echo ======== Loading kernel ========
ext2load mmc 0:1 0x2000000 /boot/uImage
echo ======== Booting kernel ========
bootm 0x2000000
----------↑boot.txtの内容はここまで↑----------

(7)上記の「boot.txt」から「boot.scr」を生成する。
$ mkimage -A arm -O linux -T script -C none -n "U-Boot script" -d boot.txt boot.scr
(8)ここまでで準備した…
・「uImage」 (u-boot用カーネル)
・「2.6.32.9-dove-5.4.2.tar.gz」(u-boot用カーネルドライバ群)
・「uInitrd」 (u-boot用ネットワークインストーラーイメージ)
・「boot.scr」(u-boot用カーネルの起動用スクリプトファイル)
…の4ファイルをUSBメモリへコピーする。

【インストール作業】
■母艦とCuBoxの接続
(1)CuBoxと母艦をUSBで接続。(CuBox側のMicroUSB-B端子に接続する)
(2)接続後、dmesgで接続先のシリアルコンソールを確認しておく。
(以下の赤太字部分が接続先。環境によって変わるので注意!)
$ dmesg
:
FTDI USB Serial Device converter now attached to ttyUSB0
(3)接続先のシリアルコンソールに対してアクセス権を設定しておく。
$ sudo adduser lassie dialout
$ sudo chmod a+rw /dev/ttyUSB0
(4)ターミナルからCuBoxのシリアルコンソールに接続。
$ cu -l ttyUSB0 -s 115200
"Connected."と出れば成功。

■Debianのインストール
(1)USBメモリをCuBoxのUSB#0(上段)に差し込んでCuBoxを起動する。
ターミナルに起動メッセージが流れるが、
"Hit any key to stop autoboot:  3"
の表示が出たら、3から0へカウントダウンする間に何かのキーを押す。

(2)u-bootコンソールから以下のコマンドを叩いて、USBからインストーラーを起動する。
> usb start
> mmcinfo
> setenv bootargs console=ttyS0,115200n8
> fatload usb 0:1 0x2000000 uImage
> fatload usb 0:1 0x3000000 uInitrd
> bootm 0x2000000 0x3000000
(3)インストールオプションの設定
"Select a language"
→ここではインストーラの表示言語ではなく、Linux上の"LANG"パラメータで指定するローカライズを設定する。
ここはローカライズ無しの"C"を選択。

"Select your location"
→"Asia">"Japan"を選択。
この後、ネットワーク設定に入るが、DHCP環境下なら特に設定無く次へ進む。

"Configure the network"
→ホスト名を設定。次の画面ではネットワーク接続用のドメインを設定。

"Choose a mirror of the Debian archive"
→"Japan">"ftp.jp.debian.org"を選択。次の画面では接続用のProxyを設定。

"Download installer components"
→「カーネルが無いよ!」と言われているが、後で「uImage」を入れるから大丈夫。
"Yes"を選択。

"Set up users and passwords"
→以下の順番でrootパスワードと一般ユーザーのアカウントを設定する。
1.rootのパスワードを設定する。確認含めて2回。
2.一般ユーザーのフルネームを設定する。
3.一般ユーザーのアカウントを設定する。
4.一般ユーザーのパスワードを設定する。確認含めて2回。

"Partition disks"
→以下の順番でMicroSDのパーティションを設定する。
1.「ソフトウェアRAIDが使えないよ!」と言われるが、使わないので無問題。
"Continue"を選択。
2.次の画面ではパーテイションの設定をガイドに任せるか手動で設定するかを選択する。
ここでは1パーティション構成にするため"Guided - use entire disk">"MMC/SD card #1 (mmcblk0)">"All files in one partition (recommended for new users)">"Finish partitioning and write changes to disk">"Yes"を選択する。
ここで、SDカードのパーティション構成は以下のように設定される。
----------↓SDHC32GBのパーティション構成↓----------
MMC/SD card #1 (mmcblk0) - 31.9 GB SD SU32G
> #1 primary 30.6 GB B F ext3 /
> #5 logical 1.3 GB F swap swap

----------↑SDHC32GBのパーティション構成↑----------

「/」がext3でフォーマットされるが、SDカード等のフラッシュメモリではext4の方が高速なので、後の作業で変換する。
※2パーティション以上の構成にする場合は、「boot.scr」も編集する必要があるので注意!

"Install the base system"
→「カーネルが無いよ!」と(以下略)
"Yes"を選択。

"Configuring popularity-contest"
→通称popcon。投票しないので"No"を選択。

"Software selection"
→必要なパッケージをチェック。ウチの構成はこんな感じ。
----------↓パッケージ設定例↓----------
[ ] Graphical desktop environment
[*] Web server
[ ] Print server
[*] DNS server
[*] File server
[ ] Mail server
[ ] SQL database
[*] SSH server
[ ] Laptop
[*] Standard system utilities
----------↑パッケージ設定例↑----------

GUIは緊急用に入れておいて、後でgdmで切る、っていう手もあるけど、まぁ勉強のために今回は入れない方向で。
Mailも悩んだけど、RaspberryPiを使い始めたらまた考えよう、ということで一旦保留。
WebServerはMuninで使うためチェック。DNSは…OCN環境下のYouTube対策に、宅内DNSも検討しとこうかな、と…。
SSHとStandard system utilitiesはほぼ必須かと。
この後はインストールするパッケージ毎に必要な設定を聞かれる。

"Continue without boot loader"
→「何か特殊なアーキテクチャだからブートローダー入らんかった」(意訳)という感じ。
後で「boot.scr」を入れればいいので"Continue"を選択。…他に選択肢なんか無いけど。

"Finish the installation"
→まだ終わっちゃらめぇぇぇ!!!壊れちゃうよぉぉぉ!!!
…まぁ、「壊れちゃう」は言い過ぎだけど。
このまま再起動されても自動起動してくれないので"Go Back"を選択。
"Go Back"を選択。(大事な事なので2度)

"Debian installer main menu"
→ここから今までの選択内容の見直しができるが、今回は手作業でチョイチョイ修正するので"Execute a shell">"Continue"を選択。
さて、コマンドが打てる状態になったところで、以下を実行する。

[ext4への変換(CuBox側)]
SDカードのアクセスは、ext3よりもext4の方が高速に行えるため、インストール時にext3でフォーマットされた「/」の領域をext4に変換する。
(正確には、ext4相当の情報に書き換えておき、後で母艦側でfsckを行い実際のext4変換を行う)
# tune2fs -O extents,uninit_bg,dir_index /dev/mmcblk0p1
# nano /target/etc/fstab
→fstab中のext3となっている部分をext4に書き換えておく。
[no journaling modeにする]
パフォーマンス重視な人はこちらも。
# tune2fs -c 0 -O ^has_journal /dev/mmcblk0p1
ただ、瞬断等のデータ破壊が怖いので、ウチの場合は次の「journal_data_writeback」モードにしておいた。

[journal_data_writeback modeにする]
フルジャーナルより早くて、ノンジャーナルよりは安心、という中庸設定。
ジャーナル情報があれば、間違ってrm-rfしても、extundeleteで復活できるってのは大きなメリットだと思うので、ウチの場合はこちらを採用。
# tune2fs -c 0 -o journal_data_writeback /dev/mmcblk0p1
[USBメモリからのファイルコピー]
あとはUSBメモリの「uImage」「2.6.32.9-dove-5.4.2.tar.gz」「boot.scr」をCuBoxのSDカードに書きだしてやればひとまずOK。
このExecute Shellの段階では、CuBoxのSDカードは「/target」にマウントされている。
# mount -t vfat /dev/sda1 /mnt
# cd /mnt
# cp boot.scr uImage /target/boot/
# cd /target/lib/modules/
# gunzip -dc /mnt/2.6.32.9-dove-5.4.2.tar.gz |tar -xf -
# sync
# exit
exitでシェルを抜けると"Debian installer main menu"が出てくるので、"Finish the installation">"Continue"を選択して終了。


自動的に再起動されるのでしばらく待つと、カーネルが起動する…が、これまでの手順でext4変換を行なっていると、ここでカーネルパニックになってしまう。
これはfsckによるext4変換が完全に終了していないため。
fsckはデバイスをマウントしていない状態で行う必要があるが、Execute ShellではResourceBusyでMicroSDをアンマウントできない。そのため、母艦側でfsckを実行してやる必要があるのだ。

[ext4への変換(母艦側)]
CuBoxの電源を抜き、USBメモリとMicroSDカードを抜き取り、MicroSDカードは母艦側に挿し込む。
母艦側では「フォーマット情報がおかしいからマウントできないよ」(意訳)と言われるため、ターミナルを開いてfsckを実行する。
MicroSDカードのデバイス番号はdmesgで調べておくこと。
# sudo fsck -f /dev/[DeviceNo]
これでデバイスのext4変換が完了するので、MicroSDをCuBoxに戻し、電源を入れると、ようやくDebianが起動する。
あとはrootに入ってsudoの設定をするなり、パスを切るなりご自由に…。

今回はLinuxターミナルからのシリアルコンソール接続やら、u-bootのコマンドやら、色々勉強になって良かった。
RaspberryPiやBeagleBoard(PandaBoard)等のおかげでARMサーバも普及しつつあるみたいだし、今回の経験も今後に生きる…といいなぁ…。

2012年9月7日金曜日

Ubuntu12.04を入れたAZにUbuntu12.10用のTegra2ドライバを入れてみた


2chAZスレPart7で2012/7/18版のTegra2ドライバを入れてた人がいたので、CuBoxのためにarmhf界隈の現状を知っておこうと、早速試してみた。

■Ubuntu12.04(Precise)のインストール
12.04.1が出た今でも、ARM用のUbuntuは12.04のまま。
インストール自体は前回同様だけど、いまだに発生するクラッシュレポートにウンザリしたため以下の対処を追加した。

■クラッシュレポートを無効にする
$ sudo nano /etc/default/apport

最下行のenabledを"0"に変更。

■Tegra2ドライバの入手
ここまでの時点でubuntu_backup等でバックアップを取っておくことを推奨。
そしてここからが本番。

Launchpadの「nvidia-tegra 15.1.0-0ubuntu1 (armhf binary) in ubuntu quantal」から
「nvidia-tegra_15.1.0-0ubuntu1_armhf.deb」を、
同じくLunchpadの「“nvidia-graphics-drivers-tegra” 15.1.0-0ubuntu1 source package in Ubuntu」から
「nvidia-graphics-drivers-tegra_15.1.0.orig.tar.gz」をダウンロード。

■Tegra2ドライバのインストール
「nvidia-tegra_15.1.0-0ubuntu1_armhf.deb」インストール後、「nvidia-graphics-drivers-tegra_15.1.0.orig.tar.gz」を解凍し、ABI11用の「tegra_drv.so」を「/usr/lib/nvidia-tegra/xorg」以下にコピー。

$ sudo cp [Unzipped-tegra_drv.so] /usr/lib/nvidia-tegra/xorg/

Xを再起動すれば完了。


画面表示がキビキビするけど、たまにフリーズしたり、マウスカーソルが消失したりと、割と動作が不安定なので、デスクトップ端末として使うならQuantalに期待かなぁ…。
RaspberryPi到着までの間、このままX切って、USB-LANアダプタ使ってVPNサーバにしてみるのも手か。

そして結構頻繁にクラッシュレポートが出ることから、現状のarmhfの安定性にも不安を感じる結果となったので、CuBoxの方はarmhfなDebian-WheezyのSatble版がリリースされるまで、armelなDebian-Squeezeで運用することにするか…。
EeePC901-Xで動作してるUbuntu12.04はこんなに不安定じゃないから、新しいアーキテクチャ(例えばarmhf64とか)が出ても、対応したDebianのStable版が出るまでは本採用を見送るのが吉、ということなのかもなぁ。

2012年9月2日日曜日

CuBox到着!

Android端末等でブラウジング中に表示される広告が非常にウザい!
↓
Proxy立てて広告フィルタリングすれば良くね?

という短絡思考で(またかよ)7/25に購入したCuBoxが、ようやく手元に到着したので、到着までの流れを記録しておく。

■7/25 購入~支払完了
SolidRunのWebStoreより購入手続きを実施。支払はPayPalで。
購入手続き前にPayPalに英語表記の住所も登録しておくと、配達トラブルを防いだり、購入先のお店で確認がスムーズに進んだりと、色々と便利なのでオススメ。
今回は、その日のうちに購入手続きと支払手続きはスムーズに完了。

■7/29 おおまかな出荷日の連絡~出荷待ち
SolidRunより「色々混雑してて大変だけど、8/15までには出荷するよ!」(超訳)との英文メールが到着。
「おおまかな出荷日」と書いたのは…8/15を過ぎても何の連絡も無かったため。
まぁ、海外のCuBox関連のフォーラムでも…
Q:出荷日を過ぎても出荷されないんだけど…。
A:みんなそうだよ!あの会社の『出荷日連絡』なんてジョークだと思って、ゆっくり待ってるといいさ!
(超訳)
…みたいなやりとりを良く見かけたので、出荷日が2~3週ズレるなんてのは当然のことだと思っておいた方が良いみたい。

■8/24 出荷連絡~行方不明
SolidRunから出荷連絡のメールが到着。
…しかし、イスラエル郵便局のページからEMS番号で追跡しても「そんな荷物知らない」とのつれないお返事。そんな状態が2日程続く。

■8/26 日本に向けて配達
EMS番号追跡でようやくヒットしたかと思ったら「日本に向けて配達したよ!」との突然の追跡結果。まぁ、無事が確認できたので何より。
ここからは日本に到着するまで、イスラエル郵便局のページでも日本郵便のページでも追跡不可能。

■8/28 日本到着
日本郵便のページからEMS番号検索をかけると、ようやく「国際交換支店に到着」のステータスに。
ここから税関通るまで待ち状態が続く…。

■8/29 通関手続~発送
思ったより早く「通関手続中」「国際交換支店から発送」のステータスに。
ここで「国際交換支店から発送」のステータスが二度表示された場合は、税関通るのに時間がかかるらしいけど、今回は難なく発送されたようで一安心。
あとは届くのを待つだけだ!

■8/30 最寄りの郵便局に到着
■8/31 手元に到着!
…というわけで、購入から到着まで一ヶ月ちょい。5週間くらいかかったけど、昨年末の受付開始から、年初にかけての注文ラッシュの頃に比べたら、ずいぶん早く届くようになったんじゃないだろうか?

ちなみに、8/12に注文したRaspberry Piの方は「Despatch expected within 16 week(s)」ということなので…まぁ、こっちはそんなに急ぐ用事で使うわけではないので、今年中に着けばいい方なんじゃないだろうか(^^;
Raspberry Piについては、今ならModMyPiのページから注文すると、RSComponentsで注文するより早く届くそうな。


しかし…見事なまでの小ささ。文庫本2冊を平積みにするスペースがあれば、CuBoxが6台置けちゃうぞ。
ちなみに、初期ロットとセカンドロット以降では、シリアルポートの位置(本体側面S/PDIF下部→背面)と、付属するSDカードの容量(2GB→4GB)が違うようだ。ウチのはセカンドロット以降のヤツだね…。

さて、今はちょっと仕事が忙しいので、落ち着いたら…

・EeePC901:内蔵無線LAN→CrystalHDに換装したら、Ubuntu上のXBMCでメディアサーバに。
・CuBox:Squid+Polipoで、スマートデバイス用のコンテンツフィルタ兼宅内Proxyサーバに。他いろいろ。
・RaspberryPi:L2TP/IPSecなVPN専用サーバに。

という構成に組み上げてみるかね。
…RspberryPiが届くまで、DynabookAZをVPNサーバーに仕立てて使ってみてもいいかもなぁ…。

2012年3月11日日曜日

AZにARM版Ubuntu12.04DailyBuild(20120309)を入れてみた


AZ上のOneiricで(依存関係を解決してやれば)Netwalker用のFreeRDP1.0のバイナリが動く。
↓
超快適
↓
Preciseならarmhfだし、もっと快適になるんじゃね?

という短絡思考で我慢できずに、AZにPreciseのDailyBuildを投入。
(もちろんOneiric環境のバックアップは取った上で)
先日試したベータ版では事あるごとに内部エラーを連発していたので、使い物になるまではもっと大変かなぁ…と思っていたら、ベータ版の時より格段に安定しててビックリ。
現状をまとめてみると…

【Oneiricからの(現時点での)進化】
・何もしなくてもスピーカーから音が出る。
・何もしなくてもzramが有効になっている。
・Remminaが標準のリモートデスクトップクライアントになった。
・FreeRDPのライブラリが1.0系になった。

【現状の問題点】
・アーキテクチャがarmhfになったため、TegraのドライバーはOneiric(armel)のものが使えない。
・Unity(Gnome)+Metacityの組み合わせではオーバーレイスクロールバーが掴めない。
 (LXDEでは大丈夫)
・Remminaを最大表示時、画面上部のツールバーが表示されない。

【以前から引き続き存在する問題点】
・Remmina(FreeRDP)使用時は英語キーボード配列で扱われる。

…というところ。個人的にはそれほど重大な問題点もないから、このまま正式リリースまで使い続けてみるかなぁ。
今回やったことは、使わないソフトの削除と、使わないサービスの停止の他は以下の通り。
1.5GHzオーバークロックカーネルは…バックアップ取ってから試してみようかと。


■Ubuntuインストール
インストール自体は公式ページの通り。

■キーボードマッピング問題の解決
# sudo nano .Xmodmap
以下の記述を追加。

keycode 234 = Escape
keycode 81 = backslash bar
keycode 84 = backslash underscore

■少しだけ起動高速化(DualCore以上:AZはTegra2なので有効)
$ sudo apt-get install preload

■日本語名のディレクトリを英語に変更
$ LANG=C xdg-user-dirs-gtk-update

■その他文字化け封じのおまじないコマンド(個人的なexperimental)
まだgeditが日本語文字コードを誤認することがあるため、以下はPreciseでも有効。
まぁ、LXDEの標準エディタはLeafpadだから、必要ないかもしれないけど…。

$ gsettings set org.gnome.gedit.preferences.encodings auto-detected "['UTF-8','CURRENT','SHIFT_JIS','EUC-JP','ISO-2022-JP','UTF-16']"
$ gsettings set org.gnome.gedit.preferences.encodings shown-in-menu "['UTF-8','SHIFT_JIS','EUC-JP','ISO-2022-JP','UTF-16']"
$ sudo dpkg-reconfigure locales
$ sudo gedit .dmrc

[Desktop]セクションに以下を追記。

Language=ja_JP.UTF-8
Layout=jp

■LXDE導入(WindowManagerもMetacity→OpenBoxとなる)
$ sudo apt-get update
$ sudo apt-get install lxde

■Ubuntuソフトウェア・センター
clamtk : ウィルススキャナ
ClipIt : クリップボード履歴
Synaptic : パッケージマネージャ。転ばぬ先の杖?

■Synapticパッケージ・マネージャ
コマンドラインから「sudo apt-get install [Package-name]」で入れればSynapticで入れる必要も無いが…。

chkrootkit : rootkit侵入防止
sysv-rc-conf : サービス管理エディタ


LXDEが思いのほか快適だったから、Precise正式リリース後はEeePC901XにLubuntu入れてみるかなぁ…。

2012年3月4日日曜日

ARM版Ubuntuインストールメモ


Dynabook AZが安くなってたので、ARM版Ubuntuの勉強とか、色んな理由を考えて購入。
話題のロシアンカスタムROMのv4bを入れたりした後にUbuntu化したので、その時のメモを公開。
今後はazsetupの中身を勉強がてら展開して、Preciseリリース後に役立てるとしよう…。


【ARM版(DynabookAZ用)Ubuntuインストールメモ】
■Ubuntuインストール
インストール自体は公式ページの通りに、特に問題なくアッサリと。

■zramswapの設定
いわゆる、昔懐かし「RAMダブラー」。少メモリ機種のパフォーマンス改善に。
ARM版Preciseからは標準でインストール済み。
$ sudo wget -O /etc/init/zramswap.conf 'https://wiki.ubuntu.com/ARM/TEGRA/AC100?action=AttachFile&do=get&target=zramswap.conf'


■少しだけ起動高速化(DualCore以上:AZはTegra2なので有効)
$ sudo apt-get install preload

■日本語名のディレクトリを英語に変更
$ LANG=C xdg-user-dirs-gtk-update

■その他文字化け封じのおまじないコマンド(個人的なexperimental)
$ gsettings set org.gnome.gedit.preferences.encodings auto-detected "['UTF-8','CURRENT','SHIFT_JIS','EUC-JP','ISO-2022-JP','UTF-16']"
$ gsettings set org.gnome.gedit.preferences.encodings shown-in-menu "['UTF-8','SHIFT_JIS','EUC-JP','ISO-2022-JP','UTF-16']"
$ sudo dpkg-reconfigure locales
$ sudo gedit .dmrc

[Desktop]セクションに以下を追記。
Language=ja_JP.UTF-8
Layout=jp

■Webから入手
UbuntuTweak
Google Chrome→ソフトウェアセンターのChromiumでも可。
☓:Dropbox→ARM版は存在しない!WebI/Fで操作するか、UbuntuOneで我慢。
エプソン用プリンタドライバは必要であればここから。

■FirefoxExtention
Synapticから入れるとUpdateに対応できないためFirefoxから個別に導入した方が良い。
※Ubuntu Firefox Modificationsは誤動作の元になるため無効化しておくこと。

■Ubuntuソフトウェア・センター
clamtk : ウィルススキャナ
ClipIt : クリップボード履歴
Comix : 漫画ビューア
GParted : Gnome用ディスクパーティションエディタ
Remmina : リモートデスクトップクライアント(Preciseからは標準アプリになった)
→FreeRDP1.xのライブラリをクロスコンパイルすれば早くなるかも?(1.x系はRDP8に対応したため)
Synaptic : パッケージマネージャ。以前は標準で入っていたが、Oneiric辺りから非標準になっている。
pyRenamer : 複数ファイルのリネーマ

■Synapticパッケージ・マネージャ
chkrootkit : rootkit侵入防止
sysv-rc-conf : サービス管理エディタ

■xfce4導入
$ sudo apt-get update
$ sudo apt-get install xfce4*

■azsetup(以下、2chAZスレPart6の659氏の記述要約)
ubuntu 11.10を一通りインストールし終わったところでこのパッケージを導入すると効果的です。
AZ上のUbuntu11.10の動作環境を整備し改善します。
行うことは以下
・日本語環境を整備します
・動画コーデックを入れて動画ファイルを再生可能にします
・flashプラグインをインストールしyoutubeなどでフラッシュを見ることができるようにします
・nvidia-tegraグラフィックドライバーを入れて描画を高速化します
・スピーカーから音が出るようにします(注意)
(注意)
カーネルを置き換えるので立ち上がらなくなったときのために
重要なユーザーデータがあるときはバックアップを取ってから行なってください。
カーネルはこれを使ってます→https://lists.launchpad.net/ac100/msg00316.html
リンクが切れてるので実際はhttp://startx.ro/~janiのlinux-image-2.6.38-1001-ac100_2.6.38-1001.1_sound__armel.deb

$ sudo -s
# rm /var/lib/apt/lists/*
# echo "deb http://dl.dropbox.com/u/34541889/dynabookaz/ ./" > /etc/apt/sources.list.d/659.list
# apt-get update
# apt-get install azsetup

再起動後(コマンドラインより)alsamixerで
Lineのmute解除(おそらく解除されている)
SpeakerOut MuxをSpeaker Mix
SpeakerOut N Muxをmute
にセットするとスピーカーから音が出るようになります。

さらにこの後やっておくと便利な事
演奏・音量関係(f1,f2,f3,f4,f10,f11,f12)のファンクションキーをキーボードショートカットで定義
firefoxとthunderbirdのアドオンのグローバルメニューエクステンションを無効化

■キーボードマッピング問題
# gedit .Xmodmap
以下を追記。
keycode 234 = Escape

■不要サービスを停止
以下のURLを参考に。
http://misyakudouji.blog55.fc2.com/blog-entry-126.html
http://www.obenri.com/_minset_cent3/daemon_cent3.html

ファンクションキーのF9に対応するキーが無いのはアレだけど、日本語入力時はF7~F9の代わりにCTRL+I,O,Pを使ってる人なので無問題。
WindowsCE時代にJornadaで慣れておいて良かった…。

現状問題なく使えてるし、利用用途のメインがWifi経由のRDPクライアントとはいえ、実使用で5時間以上電池が持つので、現状のEeePC901Xよりも利用頻度は高くなりそう。
キーボード付きで、使い慣れてるOSが使えて、薄くて軽くて完全ワイヤレスなのはいいなぁ…。