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

2018-11-12

WSLでMozcで日本語入力

できるの・・・?

WSL(Windows Subsystem for Linux/旧Bash on Ubuntu on Windows)でGUIアプリ使う場合に気になること。GUIでLinuxのアプリを動かすのはXサーバを起動して環境変数DISPLAYを0:0とかに設定、というのはssh -XでGUIを引っ張ってくる時もやるので同じスキームでできそうだなという見当は付くものの、この方法でいっつも引っかかるのは

  • クリップボード経由のコピペ
  • 日本語入力(IMを経由した入力)

という定番があり、アルファベットだけで生きていけない言語話者としては常用するにあたりクリティカルな問題として常に横たわっていました。
が、どうもググるとWSLでMozc使って日本語入力が可能っぽいということで、作業ログ及びご紹介です。
尚、WSL用のターミナルはWSL Terminalを使っています。

WSL側で準備

関連パッケージのインストール

WSL側でフォント、X関連含めてインストール。インストールするフォントはお好みで。
# apt-get install fcitx-mozc
# apt-get install fonts-vlgothic fonts-mmcedar fonts-motoya-l-cedar fonts-motoya-l-maruberi
# apt-get install dbus-x11 x11-xserver-utils

実行準備

実行ユーザのUUIDを書き込み。
$ sudo sh -c "dbus-uuidgen > /var/lib/dbus/machine-id"
(これしないとエラーが出ます
dbus[4934]: D-Bus library appears to be incorrectly set up: see the manual page for dbus-uuidgen to correct this issue. (Failed to open "/var/lib/dbus/machine-id": No such file or directory; UUID file '/etc/machine-id' should contain a hex string of length 32, not length 0, with no other text)

環境変数設定

必要な環境変数をまとめたファイル~/.xenvをWSL側のホームディレクトリに作成(本当は~/.profileに書きたいのだけどWSL Terminalからbash起動した場合に~/.profileを読み込まないため。--loginを付けてbashを起動すればいいらしいのだけどそうじゃないだろと…)
export DISPLAY=localhost:0.0
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
今回だけ手動読み込み(次回以降WSLログインで読み込み)
$ . .xenv

尚、次回以降の起動用に~/.bashrcの末尾に.コマンドを追記。これで次回以降は気にする必要なし。
. ~/.xenv

Windows側でXサーバ/VcXsrvのインストール

vcxsrv-64.1.20.1.3.installer.exeでインストールしました。デフォルトのままFullで。
インストール後、デスクトップにできたXLaunchを実行、Select display settingsはデフォルトのMultiple windowsを選択し次へ、Select how to start clientsもデフォルトのStart no client。Extra settingsもデフォルトのままClipboardとNative openglで。タスクトレイにアイコン表示で起動。

WSL側でFcitx起動・設定

$ fcitx-autostart
毎回GUI起動時に実行しなければならないが.profileに書いてしまうとXサーバがいない場合.profileを抜けないらしいのでとりあえず手動で実行することにします。
諸々表示されますがecho $?して0なら問題なし。ならない場合はXサーバが起動されてるか確認。
問題なければ
$ fcitx-config-gtk3
fcitx-autostartを実行しない場合は空で表示されるので閉じてfcitx-autostart。ここにMozcを追加するので左下の+をクリック。
Mozc選んでOK。
Global Configを選んでとりあえずTrigger Input Methodを変えます。何か色々安定しないので全角半角以外、Ctrl+SpaceはEclipseの補完入力と被るので普段使わないキーバインディングに変えます。変え終わったら閉じ。

文字入力の出来るアプリを適当に実行して確認します。私の場合普段がMATE使いなのでPlumaとかCajaとかで。
とりあえずうまくいったことにします。

Mozcの設定(任意)

Xサーバが起動している状態で、徐に以下を実行。
$ /usr/lib/mozc/mozc_tool --mode=config_dialog
私の場合はATOKキーマップが一番いいのでMS-IMEから変更します。

fcitx-autostart実行設定を.xenvに追記

Windows側でVcXsrvが起動してたらログイン時(WSL Terminal実行時)にfcitx-autostartコマンドを実行するようにします。
Xサーバの死活監視ってどうやればいいかな?6000番からTCPでnetstat開いてるか見るかな?とも思ったんですが、Build14951以降のWSLではWSLからWindowsプログラムを実行できるようになってるので、これを利用して「VcXsrvが起動してるかどうかをtasklistコマンドで確認して動いてればfcitx-autostartを実行」を書いてしまおうと思います。

~/.xenvに以下を追記
if [ $(/mnt/c/Windows/System32/tasklist.exe | grep vcxsrv | wc -l) -gt 0 ] ; then
        echo "vcxsrv exists. fcitx-autostart execute."
        fcitx-autostart
else
        echo "vcxsrv does not exist. do nothing."
fi
色々と力づくなのは承知しており、以下の懸念があるのは言わずもがなです。
  • tasklistコマンドの位置がWindows/System32の下にあることが将来的に保証されない
  • tasklistコマンドで表示した場合のVcXsrvプロセスが小文字のvcxsrv.exeであることが将来的に保証されない
  • VcXsrv以外のプログラムで「vcxsrv」を含むプロセスがwindowsで動作していると誤検知する
ただ、手軽にさっとできるのはこの程度とは思っています。変更があれば修正したいですね。
また、fcitx-autostartの出力が邪魔という場合は > /dev/null 2>&1を後ろにつけてもいいと思います。

まとめ

  • WSL側で必要パッケージをインストール
  • VcXsrvをインストール
  • WSL側で環境変数、実行プログラム等準備
  • Have a Happy Mozc on WSL Life!

補足

何か調子がおかしい場合
  • 入力中のGUIアプリを保存して閉じて、fcitx-autostartを実行する
  • fcitx-config-gtk3を実行して、Mozcがある(一番上にある)事を確認
  • どうしてもおかしかったらXサーバを再起動してfcitx-autostartからやり直す
  • fcitx-config-gtk3の中でKeyboard-EnglishがあってIM切り替えでMozcを外した時にEnglishに切り替わる場合、キーボードレイアウトが英語キーボードになるっぽいのでいっそ消した方が幸せかもしれない

2018-08-08

Linuxで外部モニターの解像度を指定して表示させる

PC:ThinkPad X230
OS:Ubuntu MATE 18.04LTS
モニター:BUFFALOのWUXGAのモニター(D-Sub接続)

とりあえず繋いでみたらWUXGAのモニターなのにXGAで表示しやがったのでなんとかする。
手順は何から何までこちら参照。

外部モニターを設定しようとするとこんな感じ。
  • ミラーリングで表示される
  • 解像度はXGAが最高
この状態でもミラーリングを解除すれば別表示にはできるけども…
  • やっぱり解像度はXGAが最高
現在のモニター設定を確認
$ xrandr
Screen 0: minimum 320 x 200, current 1366 x 1536, maximum 8192 x 8192
LVDS-1 connected primary 1366x768+0+0 (normal left inverted right x axis y axis) 277mm x 156mm
   1366x768      60.00*+
   1360x768      59.80    59.96  
   1280x720      60.00    59.99    59.86    59.74  
   1024x768      60.04    60.00  
   960x720       60.00  
   928x696       60.05  
   896x672       60.01  
   1024x576      59.95    59.96    59.90    59.82  
   960x600       59.93    60.00  
   960x540       59.96    59.99    59.63    59.82  
   800x600       60.00    60.32    56.25  
   840x525       60.01    59.88  
   864x486       59.92    59.57  
   800x512       60.17  
   700x525       59.98  
   800x450       59.95    59.82  
   640x512       60.02  
   720x450       59.89  
   700x450       59.96    59.88  
   640x480       60.00    59.94  
   720x405       59.51    58.99  
   684x384       59.88    59.85  
   680x384       59.80    59.96  
   640x400       59.88    59.98  
   576x432       60.06  
   640x360       59.86    59.83    59.84    59.32  
   512x384       60.00  
   512x288       60.00    59.92  
   480x270       59.63    59.82  
   400x300       60.32    56.34  
   432x243       59.92    59.57  
   320x240       60.05  
   360x202       59.51    59.13  
   320x180       59.84    59.32  
VGA-1 connected 1024x768+0+768 (normal left inverted right x axis y axis) 0mm x 0mm
   1024x768      60.00* 
   800x600       60.32    56.25  
   848x480       60.00  
   640x480       59.94  
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-2 disconnected (normal left inverted right x axis y axis)
HDMI-3 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
どうやらLVDS-1とVGA-1が認識されていて、VGA-1は1024x768が適用されているらしい。cvtというコマンドで解像度に対応する文字列を出す。

$ cvt 1920 1200
# 1920x1200 59.88 Hz (CVT 2.30MA) hsync: 74.56 kHz; pclk: 193.25 MHz
Modeline "1920x1200_60.00"  193.25  1920 2056 2256 2592  1200 1203 1209 1245 -hsync +vsync
cvtコマンドの結果をVGA-1に追加

$ xrandr --newmode "1920x1200_60.00" 193.25  1920 2056 2256 2592  1200 1203 1209 1245 -hsync +vsync
$ xrandr --addmode VGA-1 1920x1200_60.00
解像度の1024x768の上に1920x1200が追加されるのでそれっぽくして反映できることを確認。
で、このままではXのセッションを抜ける度に設定が消えるので、xrandrコマンドをログイン時に反映するために~/.profileとかに追記する。

xrandr --newmode "1920x1200_60.00" 193.25  1920 2056 2256 2592  1200 1203 1209 1245 -hsync +vsync
xrandr --addmode VGA-1 1920x1200_60.00
xrandr --output VGA-1 --mode 1920x1200_60.00
最後のxrandr --outputはVGA-1を1920x1200_60.00で表示するようにする。これでXのログイン後に外部モニターはWUXGAで表示されることを確認。

2016-05-21

Ubuntu使ったらブラウザでF12キーで開発者ツールにしようと思ったら画面上部にターミナルが表示されてうざすぎるのでなんとかする方法を考える。

概要
最近DellのInspiron 13 7000シリーズ(Skylake/第6世代Core i5)を買いまして、本当ならLMDE2をいつもどおり入れたかったんですがGRUBのあとに暗転、GRUBからのオプションに確か「i915.modeset=0」を指定してその先には進んだものの「syspath not found」とか表示されて無理そうだったので、てっとり早くUbuntu MATE16.04を突っ込んでお茶を濁してみてるんです。
諸処の設定はLMDEとそんなに変わらないんですが、ちゃんと使い始めてみたら標記の罠にひっかかりどうしたもんかなと。

F12を押すだけでとにかく表示されるターミナルはそもそも何なのか。
Guakeというアプリらしいです[1]

ブラウザ使っててF12で表示されるあれは何なのか。
FirefoxでもChrome/ChromiumでもF12で表示されるあれは開発者ツール/Developer toolsというみたいです(もともとIEが最初に搭載したという話を見た記憶がありますが記憶が怪しいです)

こうなる

対処法
必要ないのに立ち上がってきたguakeの何もないところで右クリック→Preferences
KeybindingsタブのPull Down TerminalでF12以外のキーバインドに変更(とりあえず間違いなく使わなそうなAlt+F12にしました)
変更後に今生のお別れをするのは変更済みのAlt+F12を押す必要があります。さようなら。

雑感
Ubuntuの開発者はブラウザでどの要素がこれを表示してるかなんか見ることないんだろうなーと。
似たような感想は.screenrcでCtrl+ZをCtrl+Aの代わりに割り当てる設定をひたすら拡散する人を見た時にも思いました(フォアグラウンドプロセスにSIGSTOPを送ってバックグラウンドに回して再開したいときはjobsでジョブ番号見てfg ジョブ番号で手前に引っ張ってくることがない人生が羨ましすぎて)


[1] http://guake-project.org/

2016-01-10

Raspberry Pi 2(RPi2)をイジる2(無線LAN)

無線LANするー
数年前にアキバで多めに買っておいたGW-USMicroN。いつか使うだろうと思って買っておいてずーっと死蔵されていましたがようやく出番がやってまいりました。
dmesgで該当箇所を確認。
[14788.742363] usb 1-1.4: new high-speed USB device number 4 using dwc_otg
[14788.855653] usb 1-1.4: New USB device found, idVendor=2019, idProduct=ed14
[14788.862687] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[14788.870160] usb 1-1.4: Product: 802.11 n WLAN
[14788.874630] usb 1-1.4: Manufacturer: Ralink
[14788.878942] usb 1-1.4: SerialNumber: 1.0
この「idVendor=2019, idProduct=ed14」を元にググるとrt2870staというパッケージで使えていたもののsqueezeまでの情報しかなく、jessieではrt2800usbなるモジュールで対応するもののインストールだけでは使えない。パッケージはfirmware-ralinkというパッケージで対応できる模様。*1
(non-freeのパッケージなのでapt-lineにない場合は追加してapt-get updateしてから)
# apt-get install firmware-ralink
rt2800usbモジュールを読み込む
# modprobe rt2800usb
VendorIDとProductIDの組を書き込む
# echo "2019 ed14" > /sys/bus/usb/drivers/rt2800usb/new_id
ここまでやるとifconfig -aでwlan0が見えるはず。但しこれは再起動で消えてしまうので、起動時に同じことをさせるためにまず/etc/modulesの末尾に追記。
rt2800usb
/etc/modprobe.d/にgw_usmicron.confという名前でファイルを作ります。(1行)
install rt2800usb /sbin/modprobe --ignore-install rt2800usb; /bin/echo "2019 ed14" > /sys/bus/usb/drivers/rt2800usb/new_id
さてあとは無線接続設定。切断した後に再接続してくれる、wicd(wicdのncurses版であるwicd-curses)を使います。
# apt-get install wicd-curses
wicd-cursesで起動したら、接続したいAPを選んで→キーで設定へ。Automatically connect to this networkにチェックを入れると切断時に再接続する設定になります。KEYに接続時のパスワード(PSK)を入力してF10、大文字Q(Shift-q)で終了。


*1 https://wiki.debian.org/rt2800usb

Raspberry Pi 2(RPi2)をイジる1(動作確認)

大方のイジってみた記事と違うところ
Raspbianを使わずにDebian Jessieを使います。理由は何個かあるんですが主に以下。
  • RaspbianはARMv6実行用にDebianのパッケージをコンパイルし直しているので、ARMv7(Debianのarmhf)が動くRaspberry Pi 2はそのままDebianを使いたい
  • Raspbianはそのままだとマウス、キーボード、モニタを繋ぐ使い方を想定してるので、Headless運用をしたい目的と合わない
  • RaspbianはJessie(の移植版)もあるけどちょいちょいカスタマイズしてある
ということで、Raspberry Pi 2用にDebian GNU/Linux Jessieのイメージを公開されている方がいるので、こちらのイメージを使います。
http://sjoerd.luon.net/posts/2015/02/debian-jessie-on-rpi2/
https://images.collabora.co.uk/rpi2/

イメージを焼く

※最初bmaptoolコマンドで焼こうとしてましたが私の環境(LMDE)ではbmapファイルが焼けなかったので結局DDで焼きました。

イメージのダウンロード
# wget https://images.collabora.co.uk/rpi2/jessie-rpi2-20150705.img.gz
# wget https://images.collabora.co.uk/rpi2/jessie-rpi2-20150705.img.bmap
<<失敗編>>
bmap-toolsコマンドをインストール
# apt-get install bmap-tools
マウント場所を確認
# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 931.5G  0 disk
└─sda1   8:1    0 931.5G  0 part /
sdb      8:16   1    15G  0 disk
└─sdb1   8:17   1    15G  0 part /media/hogehoge/72AD-2013
sdb1に16GBのSDカードがマウントされています。

イメージを展開
# gunzip jessie-rpi2-20150705.img.gz
# umount /media/hogehoge/72AD-2013
# bmaptool copy --bmap jessie-rpi2-20150705.img.bmap jessie-rpi2-20150705.img /dev/sdb
bmaptool: ERROR: only bmap format version up to 1 is supported, version 2 is not supported
ふえぇぇ
<<失敗編ここまで>>
# dd if=jessie-rpi2-20150705.img of=/dev/sdb bs=1M
3072+0 レコード入力
3072+0 レコード出力
3221225472 バイト (3.2 GB) コピーされました、 337.484 秒、 9.5 MB/秒
イメージを焼いたMicroSDをRPi2に挿して、電源投入(LANに接続しています)SSHサーバとDHCPクライアントが動いてるので、振られてるアドレスを確認できればSSHでログインできます。
$ ssh root@192.168.1.42
root@192.168.1.42's password: 
ログインして最低限の諸作業
rootのpasswordはdebianになっているので、速攻変えます。
# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
とりあえずこんなところから。
root@jessie-rpi:~# uname -a  
Linux jessie-rpi 3.18.0-trunk-rpi2 #1 SMP PREEMPT Debian 3.18.5-1~exp1.co1 (2015-02-02) armv7l GNU/Linux
一般ユーザー追加
# adduser hogehoge
Adding user `hogehoge' ...
Adding new group `hogehoge' (1000) ...
Adding new user `hogehoge' (1000) with group `hogehoge' ...
Creating home directory `/home/hogehoge' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for hogehoge
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
一般ユーザー追加したのでSSHのrootログインを禁止。/etc/ssh/sshd_config 書き換え。
#PermitRootLogin yes
PermitRootLogin no
sshd再起動。
# systemctl restart sshd.service
慎重な運用なら公開鍵認証のみへの変更、ポート22からの変更もこの時点でするべき。今回はしませんけども。

apt-line書き換え
/etc/apt/sources.listを整理する。(日本からなので)日本ミラー参照、contrib/non-free追加、jessie-backports追加、security.debian.org追加。一番下は最初から追加されてたやつ。
deb http://ftp.jp.debian.org/debian jessie main contrib non-free
deb http://httpredir.debian.org/debian jessie-backports main contrib non-free
deb http://security.debian.org/ jessie/updates main contrib non-free
deb [trusted=yes] https://repositories.collabora.co.uk/debian/ jessie rpi2
このあとapt-get update、apt-get upgradeでパッケージ群を更新。とりあえずここまで。

2016-01-09

Raspberry Pi 2(Model B)を買ったので外観

Raspberry Pi 2(ModelB)(以降RPi2)を買いました。年末にAmazonで買ってちょうど正月に使い始め。
このエントリでは購入から(ケースの)組み立てまで、主に外観をご紹介します。ちなみにいわゆるシングルボードコンピュータの購入は初めてです。

買ったもの
Amazonのこちらのセットを購入しました。それにしても量販店を回るより通販の方が選択肢の多い時代になったものです。
http://www.amazon.co.jp/Raspberry-Pi2-Model-%E3%83%92%E3%83%BC%E3%83%88%E3%82%B7%E3%83%B3%E3%82%AF-USB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB/dp/B0111P3N6A
こちらのセット、RPi2本体はもちろんですがケース、USBケーブル、ヒートシンクが同梱されているものになります。
注意事項は色々あるんですが概ねAmazonのレビューに書かれている通りです。

ファイルケースみたいな箱に入って届きます。緩衝材は一切無しなので、輸送中の破損リスクは結構ギャンブル。
無事にケース組み上げて上下から見た図。地味に裏側はMicroSDの実装パターンがケースの中央じゃなくて板に向きがあります。

右側面と左側面。右側はMicroUSB-B(給電)、HDMI、音声画像出力。

前面。下側のMicroSD実装パターンに合ってなかった向きを直すために全部バラして組み直した結果、こっちの上側の爪の外側にヒビが入りました。イーサとUSBの間が健在のままなのでなんとか分離せずに済みましたが見た目は悪いです。残念。

こんな感じで上に開くので、いじり回すような使い方でもメンテナンス性は十分。
見た目はこの辺で。

2016-01-04

台北小米之家で買ったXiaomi(小米) Mi 4iを触る

台湾に行った時に買ったXiaomi Mi 4i(読みは「シャオミ ミー フォーアイ」が正式)をイジっていきます。

気付かずに進めてた…
Unbox時には気付かなかったんですが、箱に書いてあった製造時期が2015/06で買ったのが先月。この間にバージョンアップがありました。
基本的に初期設定はOTAが来る前にやってしまったので、その画面になりますことをご了承くださいorz。

まず最初は言語選択。とはいえキーボードは英語or中国語の2択。

次は無線LAN選択。使用許諾。

Googleアカウント持ってるか?質問。グローバルモデルだけかな?

Miアカウント設定。私はSkipしました(今も設定していません)

Miアカウントを持ってる人同士ならMi Messageでやりとりできるみたいです。

ロケーションとユーザ体験設定で準備終了。

画面のピンチでホーム画面の設定(ホーム画面のページ数とかウィジェットの配置など)ができます。

デフォルトのホーム画面。グローバルモデルに入っているGoogleアプリはデフォルトでこれだけ入っています。

OTAが降ってきている事に気付いて焦るの巻(通知画面)。MIUIは通知をユーザに知らせないようにしてる感じです(処理中のものが画面上部に表示されない)
ダウンロードが終わったことがわからないので個人的にはこの点はマイナス。
そしてなぜかこのタイミングでモバイルネットワークがChunghwa 3Gから4Gへ(最初LTE掴んでなくて焦ってた)

SettingsのAbout phone。この画面でやたらいっぱいタップできます。

  • Android Version→Flappy Birdのイースターエッグ
  • MIUI Version→開発者オプションの有効化
  • CPU→バグ報告
  • Internal Memory→テストモード(Testing)
  • Kernel Version→CIT(Hardware tests)


テザリングも至って普通にできます。

個人的な総評
Androidのフォークを全面に押し出した中国のスマホを触ったのは実は今回が初めて(HUAWEI MediaPadは素のAndroidだったので)で、こういう風にカスタマイズするのかと思うと同時にここまでイジるかと感じるところがありました。
Miアカウントを使うとシャオミのサービスを存分に楽しめるのかなとも思いましたがかねてより情報をシャオミに送りまくるというニュースもあったので、個人的には今後もシャオミのサービスは使わずにMIUIを使うことになると思います。
今現在のMIUI 7.0はAndroid5.0.2で、MarshmallowベースのMIUIもそのうち来るだろうと期待しているところです。
ただ、今のままでもMIUIは結構快適に動きます(8コアのCortex-A53なのでそんなに遅くもないのは間違いないですが)が、やっぱりAndroidなのに通知が更新される進捗が見れないのが大きなマイナスポイントでもあるので、気に入るかどうかは人によると思います。

あと、日本語は明らかにモトヤフォントが入っているのですが、漢字だけは基本的に中華フォントで表示(平仮名と片仮名はモトヤフォント)されます。MoreLocale2はadbで弄れば日本語ロケールもある程度使えるようになりそうですが私はまだ英語で使っています。

2015-05-09

X.Orgの設定を探る

今まで有耶無耶にググって使えるようにしてきたX.Orgの設定ですが、LMDE2 Betsyのインストール時にノウハウが違ってたのでどう解決したもんかなと思いちょっと調べたので、今回備忘がてら書き残しておこうかと。

xorg.confはmanがあった
「あれが動かないんだけどどうすればいいの?」という疑問は基本的にRTFM問題だったというオチであります。
なんで、疑問を持ったらman 5 xorg.confしてからという話なんですが、やっぱりというかなんと言うかそもそもmanが長いのも確かで、掻い摘んで設定ファイルをどこから読むのかなーというところを見ても、一般ユーザーの場合
  • /etc/X11/<cmdline>
  • /usr/etc/X11/<cmdline>
  • /etc/X11/$XORGCONFIG
  • /usr/etc/X11/$XORGCONFIG
  • /etc/X11/xorg.conf
  • /etc/xorg.conf
  • /usr/etc/X11/xorg.conf.<hostname>
  • /usr/etc/X11/xorg.conf
  • /usr/lib/X11/xorg.conf.<hostname>
  • /usr/lib/X11/xorg.conf
追加configファイルは
  • /etc/X11/<cmdline>
  • /etc/X11/xorg.conf.d

rootユーザーの場合
  • <cmdline>
  • /etc/X11/<cmdline>
  • /usr/etc/X11/<cmdline>
  • $XORGCONFIG
  • /etc/X11/$XORGCONFIG
  • /usr/etc/X11/$XORGCONFIG
  • /etc/X11/xorg.conf
  • /etc/xorg.conf
  • /usr/etc/X11/xorg.conf.<hostname>
  • /usr/etc/X11/xorg.conf
  • /usr/lib/X11/xorg.conf.<hostname>
  • /usr/lib/X11/xorg.conf
追加configファイルは
  • <cmdline>
  • /etc/X11/<cmdline>
  • /etc/X11/xorg.conf.d
それでもって、ベンダ提供とかサードパーティーとかローカル管理者がファイルを置くべきディレクトリは
  • /usr/share/X11/xorg.conf.d
と書かれているので、実は割とどこにあっても読み込んでくれそうだなぁという感覚でFHSに則るとより良いかなというのがmanを読んだ後の感想です。

で、LMDEではどこに置けばいいの?
先週LMDEをクリーンインストールした時に置いた場所は/usr/share/X11/xorg.conf.dなんですが[1]、「ローカル管理者が置くファイル」に該当するのでここにしたというのと、DebianのWiki[2]でもここになってたからというのが理由です。

かつてのDebianではどうなっていたのか?
ところが、「ThinkPad トラックポイント Linux」とかで探すと/usr/share/X11/xorg.conf.dに置いてる記事が(日本語では)1件もなかったので、昔は違ったんだろうなぁという事情が見えてきます。
件のDebianのWikiの「TrackPoint scrolling on Squeeze and later」を見ると、gpointing-device-settingsパッケージを入れる記述がありますが、lenny以降はorphanで2011年の更新が最後になっている状態です。
xinputパッケージを使う場合は~/.xsessionrcにコマンドを書いておく方法が書かれています。
lennyでは/etc/X11/xorg.confの中のConfigured Mouseセクションに書き足す方法が書かれています。

設定値はどうやれば探れるのか?
20-thinkpad.confに記述する値はIdentifierとかMatchProductとかMatchDevicePathとかがいきなりしれっと書かれていますが、これらの値は本当はどうやって見つけるべきなのか。
DebianのWikiにコマンドが書かれています。
# dmidecode -t 21
# dmidecode 2.12
SMBIOS version fixup (2.33 -> 2.3).
SMBIOS 2.3 present.

Handle 0x002E, DMI type 21, 7 bytes
Built-in Pointing Device
    Type: Track Point
    Interface: PS/2
    Buttons: 3
# cat /proc/bus/input/devices
(snip)
I: Bus=0011 Vendor=0002 Product=000a Version=0000
N: Name="TPPS/2 IBM TrackPoint"
P: Phys=isa0060/serio1/input0
S: Sysfs=/devices/platform/i8042/serio1/input/input7
U: Uniq=
H: Handlers=mouse0 event7
B: PROP=0
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=3
(snip)
これらの値を持ってくるのが正解というところでしょうか。
dmidecodeコマンドを初めて知ったんですが、type(-t/--type)で0(BIOS)から42(Management Controller Host Interface)まで情報が見えるのでこれから使ってみようかなと思います。

[1] http://utimukat55.blogspot.jp/2015/05/lmde-2-betsythinkpad.html
[2] https://wiki.debian.org/InstallingDebianOn/Thinkpad/Trackpoint のTrackpoint Scrolling on Wheezy or Jessie

2015-05-06

LMDE 2 Betsyを新しくないThinkPadに入れてみた

概要
今までLMDE UP8を入れていたThinkPad X40に先頃リリースされたLMDE 2 Betsy(MATE)をクリーンインストールしました。
apt-get dist-upgradeで更新できるかなと思ってトライはしてみたんですが、更新後PCを再起動したらGRUBの後kernel起動ができなくなってしまったので、あえなくクリーンインストールとなりました。
インストール自体はISOイメージをUSBメモリ(4GB)にddで焼いて、USBメモリから起動、起動後にHDDへインストールの手順で行いました。手順はこちらを参考に。[1]
インストールしたのは今回もMATEで、結構古いPCに入れるというのと軽快さを重視しての選択です。アーキテクチャはPentiumMなので選択肢は必然的に32bitのみ。

インストール後にすること
いろいろとインストール後にすることはあるんですが、今まで弊blogに書いてきたことがそのまま今回も使えたりしたので、参照するだけのところは基本的にはリンクを貼るだけにします。
  • aptの参照ミラーを日本に切り替える
  • 日本語入力できるようにする(fcitx) [2]
  • ネットワーク(無線LAN)を使えるようにする
  • sudoではなくsuでrootユーザになれるようにする [3] ※ただし、usermodでsudoグループから削除できなくなってた
  • デスクトップ/ダウンロード/テンプレート/公開/ドキュメント/音楽/画像/ビデオディレクトリをDesktop/Download/Template/Public/Document/Music/Pictures/Videosディレクトリに変更する
  • ThinkPadのトラックポイントのスクロールを有効にする
  • MintUpdateの自動起動を無効にする
  • スワップファイルをファイルシステム上に作る [4]
  • 日本語フォントとしてVLゴシック、モトヤ2種、Ricty Diminishedをインストール
  • ChromiumブラウザとPPAPI版のFlashのインストール(Flashのインストールについて[5])

aptの参照ミラーを日本に切り替える
Betsyのデフォルトのapt-lineは/etc/apt/sources.list.d/official-package-repositories.listに記載されていて、そのままでもこれといって問題はないんですがパッケージの取得の効率化のためにミラーを日本に切り替えます。diffは以下。
--- official-package-repositories.list.org    2015-04-07 02:02:43.000000000 +0900
+++ official-package-repositories.list    2015-05-05 10:22:31.050908564 +0900
@@ -1,7 +1,7 @@
 deb http://packages.linuxmint.com betsy main upstream import

-deb http://ftp.us.debian.org/debian jessie main contrib non-free
-deb http://ftp.us.debian.org/debian jessie-updates main contrib non-free
+deb http://ftp.jp.debian.org/debian jessie main contrib non-free
+deb http://ftp.jp.debian.org/debian jessie-updates main contrib non-free
 deb http://security.debian.org jessie/updates main contrib non-free

 deb http://www.deb-multimedia.org jessie main non-free
各パッケージの取得前に一度apt-get update、apt-get upgradeしておきましょう。

ネットワーク(無線LAN)を使えるようにする
デフォルトの状態で無線LANアダプタを認識していたので、ドライバのインストールとかは必要ありませんでした。
デスクトップ右下がこんな感じになっているので、クリックするとアクセス可能なSSID一覧が表示されます。
こんな感じのダイアログがでるので、PSKとかを入力して接続完了。

デスクトップ/ダウンロード/テンプレート/公開/ドキュメント/音楽/画像/ビデオディレクトリをDesktop/Download/Template/Public/Document/Music/Pictures/Videosディレクトリに変更する
ロケールに合わせて日本語でディレクトリ作ってくれるんですが、ターミナルからcdで移動するときにIME切り替えないといけないのが超絶めんどくさいので、以下のコマンドで変更します。
$ LANG=C xdg-user-dirs-gtk-update
コマンド実行後、ダイアログが表示されるので適切に操作して完了。

ThinkPadのトラックポイントのスクロールを有効にする
デフォルトでは左右ボタンと中ボタン(貼り付け)は機能しますが中ボタンドラッグのスクロールができないので、/usr/share/X11/xorg.conf.d/20-thinkpad.conf というファイルを作って以下の内容を記述します。
 Section "InputClass"
     Identifier "Trackpoint Wheel Emulation"
     MatchProduct       "TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint|ThinkPad USB Keyboard with TrackPoint|ThinkPad Compact USB Keyboard with TrackPoint|USB Trackpoint pointing device"
     MatchDevicePath    "/dev/input/event*"
     Option             "EmulateWheel"          "true"
     Option             "EmulateWheelButton"    "2"
     Option             "Emulate3Buttons"       "false"
     Option             "XAxisMapping"          "6 7"
     Option             "YAxisMapping"          "4 5"
 EndSection
詳細は別途エントリにて。


MintUpdateの自動起動を無効にする
LinuxMintの特徴の一つでもあるMintUpdateですが、更新タイミングとかが気に食わなかったので自動起動を停止しました。
デスクトップ左下Menu→設定→自動起動するアプリ を選ぶと以下の画面になるので、
 「自動起動するプログラム」タブの中のMintUpdateのチェックを外して閉じます。

日本語フォントとしてVLゴシック、モトヤ2種、Ricty Diminishedをインストール
これまでのスクリーンショットの日本語フォントで大丈夫な方は作業不要です。
個人的には見やすさ重視のVLゴシック、改まったところで使うモトヤ、エディタとかで使うRicty Diminishedを使う予定なので、これらをインストールします。
ただし、Ricty DiminishedはDebian GNU/Linuxのjessieには入らなかったので、パッケージを直接ダウンロード[6]してdpkgコマンドでインストールしました。
# apt-get install fonts-vlgothic fonts-motoya-l-cedar fonts-motoya-l-maruberi
# dpkg -i /home/user/Downloads/fonts-ricty-diminished_3.2.4-1_all.deb
また、Rictyフォントのインストールはこちら[7]で紹介しています(今回検証していません)

Chromiumブラウザのインストール
BetsyはデフォルトでFirefoxがインストールされています。Chromiumはメモリ使用量がきついのですが一応インストールしています。
# apt-get install chromium
てなわけで、インストール後に最低限必要な手順を備忘を兼ねて書き出しました。
今までLMDE UP8使ってて今回Betsyにした感じだと、正直何が変わったのか体感できてないんですが(汗)、動作は軽快だし今のところ悪いところは見つかってないです。
きっとCinnamonの方だと色々と変わってるんじゃないかなーという気はします。
何よりアップデートが掛からないと使うことができないというのが更新の理由ですね。

[1] http://www.tecmint.com/linux-mint-debian-edition-betsy-cinnamon-installation-customization/
[2] http://utimukat55.blogspot.jp/2014/06/lmde-up8matefcitx.html
[3] http://utimukat55.blogspot.jp/2013/10/sudo.html
[4] http://utimukat55.blogspot.jp/2014/05/linuxswapswap.html
[5] http://utimukat55.blogspot.jp/2014/06/debianchromiumflash.html
[6] https://packages.debian.org/stretch/all/fonts-ricty-diminished/download
[7] http://utimukat55.blogspot.jp/2014/01/ricty.html 

2014-06-28

DebianのChromiumでFlashを見る

Flashという障壁
いつもセキュリティホールが見つかる対象として諸悪の根源的な扱いも受けることの多いFlashですが、それでもあったほうが便利な状況は未だに多く、特にデスクトップ用途ではその傾向が顕著です。
また、GNU/Linux上での扱い方もコロコロ変わったりするんですが、Debianで扱う[1]上で今の時点で一番筋の良さそうな方法を記載します。前提は以下。

  • ChromiumブラウザでFlashを使う
  • アーキテクチャはi386/amd64

Chromium上でのFlashの扱い
(Chromeではない)Chromiumを使う場合、ブラウザにFlashが同梱されていないため、手動で導入する必要があります。(ChromeにはPPAPI版のFlashが同梱されているので、このエントリの手順は必要ありません)
Flashの導入はパッケージとしてaptからできますが、NPAPI版[2]とPPAPI版[3]のパッケージがあります。詳細な違いは把握してませんが、NPAPIは古いアーキテクチャでメンテナンスが大変らしい、基本的にChromeはNPAPIのサポートをやめる方向、バイナリをadobeからダウンロードしてくる。PPAPIは新しいアーキテクチャで、GoogleがメンテしていてバイナリもGoogleからダウンロードしてくる。という違いはあるようなので、ここではPPAPI版[4]の導入をすることにします。

パッケージのインストール
# apt-get install pepperflashplugin-nonfree
インストールは以上で、パッケージのインストールの場合はバイナリを落としてきてインストールまでやってくれるみたいです。

普段のメンテナンス
pepperflashplugin-nonfreeパッケージ自体はflashのバイナリを含んでいるわけではなく、update-pepperflashplugin-nonfreeコマンドの実行によってバイナリが更新されているかを判断するようです(NPAPI版のflash-plugin-nonfreeと同じ)
# update-pepperflashplugin-nonfree
Usage:
  update-pepperflashplugin-nonfree --install
  update-pepperflashplugin-nonfree --uninstall
  update-pepperflashplugin-nonfree --status
Additional options:
  --verbose
  --quiet
ということなので、--statusを付けてアップデートがあるかチェック、あれば--installで更新ということになります。(更新があるかどうかを自動的に確認する方法は無さそうです。)
ちなみに、現在の状況は
# update-pepperflashplugin-nonfree --status
Flash Player version installed on this system  : 14.0.0.125
Flash Player version available on upstream site: 14.0.0.125

導入されているバージョンは、Chromiumから「chrome://plugins/」を開くことでも確認が可能です。

[1] https://wiki.debian.org/FlashPlayer
[2] https://packages.debian.org/jessie/flashplugin-nonfree
[3] https://packages.debian.org/jessie/pepperflashplugin-nonfree
[4] https://wiki.debian.org/PepperFlashPlayer

2014-06-21

LMDE UP8(MATE)での日本語入力にfcitxを使う

以前のエントリ[1]の内容を新しいPCでやってみるとできないことに気づいたので、LMDE UP8(MATE)を新規インストールした際の設定方法を確認しました。
LMDEでの設定方法ですが、他のdistro(特にDebian系)でも応用できるのではないかと思います。

関連パッケージのインストール
パッケージをインストールします。
# apt-get install im-config fcitx fcitx-mozc fcitx-frontend-gtk2 fcitx-frontend-gtk3 fcitx-frontend-qt4 fcitx-frontend-qt5 fcitx-ui-classic fcitx-config-gtk mozc-utils-gui
im-configコマンドでfcitxを指定します。(以前の手順ではコンソールから選びましたが、-nオプションでinput method nameを指定するとコマンドだけで変えれるみたいです。
$ im-config -n fcitx
Xをログアウトしてもう一度ログインし、「設定」→「Fcitx設定」を開きます(メニュー開いて右上の「すべてのアプリケーション」を選択しておいてください。)

「入力メソッド」タブにmozcが追加されてるのを確認して、「全体の設定」で入力メソッドのオンオフを変えたりします。



今度はメニューから「設定」→「Mozcの設定」。


「一般」タブでキー設定の選択をATOKに。


「辞書」タブに「Unicode6絵文字変換」というのがあったので選んでみました。


以上。

余談
パッケージを大量にインストールしてますが、こんなにちまちま指定しなくてもLinux Mint Japanが提供する「mint-gnome-ja」パッケージをインストールすると色々ひっくるめてインストールできます。
ですが、とにかく以下の点があり(個人的に)お勧めできません。

  • ibus入れてくる[2]
  • takaoフォント入れてくる[3]
  • 他にも使うかどうかわからないパッケージ色々入れてくる

これでもいいという方はmint-gnome-jaを入れるほうが楽なので、入れ方をググってもいいと思います。

[1] http://utimukat55.blogspot.jp/2013/10/ibusfcitx.html
[2] ibus使い続けて問題なければfcitxユーザーこんなに増えてないよね
[3] 画面表示はVLゴシックの方が見やすいし、改まったゴシックならモトヤLシーダ(fonts-motoya-l-cedar)/モトヤLマルベリ(fonts-motoya-l-maruberi)使えばいいかなというのと、takaoフォントの優先度がむちゃくちゃ高いのが嫌なので

2014-06-04

aptでパッケージを更新しないようにさせる

こんな時
パッケージを固定したい!(Debian系またはaptをパッケージ管理に使っているディストロで)
pinでもいいのだけど
もっと別のレイヤーで、aptのpinningではなく、dpkgの機能(dpkg --set-selections)を使って更新対象から外す方法です。
例えばisc-dhcp-commonとisc-dhcp-serverを更新したくない場合。
# apt-mark hold isc-dhcp-common isc-dhcp-server
isc-dhcp-common は保留に設定されました。
isc-dhcp-server は保留に設定されました。
現在更新が保留されているパッケージの一覧。
# apt-mark showhold
isc-dhcp-common
isc-dhcp-server
更新の保留を解除する場合。
# apt-mark unhold isc-dhcp-server isc-dhcp-common
isc-dhcp-server の保留を解除しました。
isc-dhcp-common の保留を解除しました。

2014-05-30

Linuxでswap用のファイルを作って使う(swapパーティションではなく)

かつてのLinuxの常識
実メモリ(RAM)の2倍のswapパーティションを作って、仮想メモリとして使う。

今陥っている状況
RAMが2GB積んでるからswapパーティション要らないと思って作らなかったけどChrome/Chromiumがやたらメモリ食うしヽ(`Д´)ノもう来ねえよ!ウワァァン

残された手段
Windowsのpagefile.sysみたいに、既存のパーティション上にスワップファイルを作って、メモリ逼迫してきたら仮想メモリとして使えるようにする。

というわけで、/mnt/swap.pagefileという4GBのファイルを作って、そこをスワップファイルにします。

まず、今のスワップの確認。
$ cat /proc/swaps
Filename Type Size Used Priority
何もない!

スワップファイル作成からデフラグ[1]、スワップ有効化。
# dd if=/dev/zero of=/mnt/swap.pagefile bs=1M count=4096
4096+0 レコード入力
4096+0 レコード出力
4294967296 バイト (4.3 GB) コピーされました、 84.8117 秒、 50.6 MB/秒
# e4defrag /mnt/swap.pagefile
ext4 defragmentation for /mnt/swap.pagefile
[1/1]/mnt/swap.pagefile: 100% [ OK ]
 Success: [1/1]
# mkswap /mnt/swap.pagefile
# swapon /mnt/swap.pagefile
これが問題なく終わってれば、スワップ確認した時に変わる。
$ cat /proc/swaps
Filename Type Size Used Priority
/mnt/swap.pagefile                      file 4194300 519140 -1
問題なさそうなら、/etc/fstabに行を追加。これでswapon -aでマウントしてくれるし、起動時にもマウントしてくれる。
/mnt/swap.pagefile swap swap defaults 0 0

[1] Windowsのデフォルトみたいにスワップファイルが断片化してると、目も当てられない状況になってしまうので(XPまでの話。Vista以降はよく知りません)

2014-02-27

docker exportとdocker importでdockerイメージのサイズを小さくする

Dockerって何かやってくとどんどんディスク圧迫するよね・・・
Dockerは素晴らしいソリューションだし、失敗しても削除すればいいという側面から手軽に使えるのが特に今までの仮想化ソリューションになかったという点が素晴らしいと思う。
でも。でもね。ファイルシステムのレイヤーをどんどん積み上げていくから、ディスクをどんどん圧迫する。

AUFSの仕組みをざっと解説する
幸か不幸か、ずーっと前に仕事でUnionFSを使ったことがあって、一方でDockerで使ってるAUFSは「Another UnionFS」。UnionFSを改良することを目的としたプロダクト。ということで、仕組みは同じだろう。ということで、色々すっ飛ばして実際間違ってる可能性もありますが、UnionFSで使われるオーバーレイと言われる仕組みを説明してみたいと思います。

図内ではベースになるファイルのレイヤーに対して、3つオーバーレイ[1]しているイメージ。一番下のレイヤーは普通にマウントできるファイルシステムで、そこに対して重ねていくような感じでマウントしていくと、ユーザが参照する時には積み重なったところからファイルシステムが見える。これが大雑把なUnionFS(AUFSも同じはず。。)の仕組みです。

実際Dockerのイメージはどうなっているか
AUFSを使っているという触れ込みのDockerですが、作業をしてくとどうなるか。
拙作のDockerイメージを使って確認しようと思います。
Dockerが使える環境で
# docker pull  utimukat55/jessie_20140213
2/13時点のDebian GNU/Linux jessieのDockerイメージです。これは単純に作ったイメージなので、
# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
utimukat55/jessie_20140213   latest              f17806c7b448        12 days ago         464.5 MB
utimukat55/docker_jessie     latest              e07ab3ea414f        4 weeks ago         267.8 MB
464MB!でかい!
んでもって、積み上げられているはずの差分はどこにあるか。
# docker info
Containers: 0
Images: 5
Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Dirs: 5
WARNING: No memory limit support
WARNING: No swap limit support
Root Dirの下のdiff、/var/lib/docker/aufs/diff/に格納されています。
/var/lib/docker/aufs/diff/
├── 583d969ed337b16b3db6f2e5f7a6583df32ed25d5b03dc0de25e636897b51f15
│   ├── bin
│   ├── boot
│   ├── dev
│   ├── etc
│   ├── home
│   ├── lib
│   ├── lib64
│   ├── media
│   ├── mnt
│   ├── opt
│   ├── proc
│   ├── root
│   ├── run
│   ├── sbin
│   ├── srv
│   ├── sys
│   ├── tmp
│   ├── usr
│   └── var
├── e07ab3ea414f60ee7a8405289e27fa9caa6a5322f2bd4866c28d319b67c9f7de
├── f17806c7b4480783b9c0ddfe08d6c3521f373a93c352657b3903db418adac42d
│   ├── bin
│   ├── dev
│   ├── etc
│   ├── lib
│   ├── sbin
│   ├── usr
│   └── var
├── f4396103dc987caeef469f759dd147cb1bd4761786aa9672108b189a2b19e02e
│   ├── dev
│   ├── tmp
│   └── var
└── f86c3830f454c1ed1e217b86f09c47df41e2ed1bed22038813b478d1514283cc
    ├── bin
    ├── etc
    ├── lib
    ├── run
    ├── sbin
    ├── tmp
    ├── usr
    └── var
でも、元のイメージとか途中のイメージとかは要らないことありますよね。という訳で

docker exportを使ってみる
dockerのリポジトリを他の場所に移動するためのコマンドとして、
  • docker export/import
  • docker save/load
が用意されているみたいです。exportを使ってみる[2]。引数はCONTAINERなので適当に1回コマンドを実行[3]してから
# docker export df293a377639 > shrink.tar
importで戻す。
# cat shrink.tar | docker import - jessie:shrinked
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
jessie              shrinked            b309e7a044ee        46 seconds ago      189.4 MB
189MBまで縮んだよ!
ちなみに、save/loadは差分を差分として持ったまま持ち運ぶ時に使うみたいです。

今回のエントリは、一番上のレイヤーだけほしいなぁと思ってググっていた時に見つけた以下の書き込みがきっかけでした。


[1] 組み込みプロダクトで使う場合、不揮発性のファイルシステムの上にtmpfsみたいな揮発性のファイルシステムを重ねあわせて、電源切ると元に戻る感じにするのが多いですね。
[2] http://docs.docker.io/en/v0.5.3/commandline/command/export/
[3] docker run -t -i f17806c7b448 /bin/echo "hello" とか

2014-02-10

特定のMACアドレスに対してIPv6アドレスを設定するDHCPv6サーバを構築した(4)-DHCPv6サーバの設定再び

前回までのあらすじ

  • DHCPv6サーバはISCのものにパッチを当てたものをパッケージとして作ってインストール
  • DHCPv6クライアントはISCのものを使って、クライアントを手動実行
  • クライアントから送るDHCPv6 soliciteが期待通りにならない(DUIDが)
サーバ側の設定を変更
/etc/dhcp/dhclient.confに記載したDUIDは例のwide_mkduid.plで生成したもので、Hardware typeが6(IEEE802)となっていたのだけど、ISCのdhclientは1(Ethernet)としてDUIDを作るので、こっちに寄せることにしてファイルの内容を変更[1]。最終的には以下。

default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
allow leasequery;
option dhcp6.info-refresh-time 21600;
dhcpv6-lease-file-name "/var/lib/dhcp/dhcpd6.leases";
# RAとか範囲とか(うちの場合はRTX1100で配っているRA)
subnet6 fd00:dead:beef::/64 {
 # 1000からffffまでをDHCPで配る対象にする
 range6 fd00:dead:beef::1000 fd00:dead:beef::ffff;
 # 固定IPアドレス
 host kurobox-t4 {
  host-identifier option dhcp6.client-id 00:03:00:01:00:16:01:xx:yy:zz;
  # 固定で振るIPv6アドレス
  fixed-address6 fd00:dead:beef::100;
 }
}
DHCPサーバを再起動。
# /etc/init.d/isc-dhcp-server restart
DHCPv6クライアント側はDUIDタイプはdhclientのmanを注意深く読んだ結果、引数「-D LL」を指定することでLLを強制的に指定できそうだったので、/var/lib/dhcp/dhclient6.leasesの中身を空にして[2]、起動方法を以下の引数へ変更して実行。
# dhclient -6 -D LL -cf /etc/dhcp/dhclient.conf eth0 -v
一応これで当初望んでいた「fd00:dead:beef::100」は設定されるようになったので「特定のMACアドレスに対して固定IPv6アドレスをDHCPv6で設定する」は達成できたと思いますが、いくつか条件付きなのはここまで記載したとおり。
  • DHCPv6サーバがデフォルトだと扱いづらい
  • dhclientの起動方法が手動
  • DUIDがLLのみ(LL+Tだと対応できない)
サーバ側もクライアント側も結局一筋縄でいかないのは間違いないと思うので、できるだけ早いとここの辺が解決するといいなぁと思っています。

[1] 00:03:00:06から00:03:00:01へ
[2] 空にしないと、取得済みのアドレスを載せたDHCPv6 confirmを送り続けます

特定のMACアドレスに対してIPv6アドレスを設定するDHCPv6サーバを構築した(3)-DHCPv6クライアントの設定

DHCPv6クライアントの設定
クライアント側パッケージはisc-dhcp-clientを使います。サーバ側をisc-dhcp-serverにしたからというだけですが、一応バージョンはdebianの4.2.4-7[1]を使いました。これより前のバージョンでも動くかもしれません。
で、いろんなサイトを見ながら設定を探しつつ…とりあえず[2]の設定がよさげかなぁと思ってこれをベースに。
以下の2行を/etc/dhcp/dhclient.confに書き足して。
send dhcp6.oro 3,23,24,31;
send dhcp6.rapid-commit;
NIC再起動すりゃこの設定したdhclientがDHCPv6 solicite投げるだろjk…
# /etc/init.d/networking restart
……パケット取ってるwiresharkに一向にDHCPv6パケットが流れてこない……

DHCPv6クライアントを手動で実行する
まさかの手動実行ですよ。何か設定が間違ってるのかもしれませんが小職のスキルでは悪いところが見つけられませんでした。

で、とりあえずman dhclientしてみて、dhclient --helpしてみて、それっぽい引数を探します。
# dhclient --help
Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Usage: dhclient [-4|-6] [-SNTP1dvrx] [-nw] [-p <port>] [-D LL|LLT]
                [-s server-addr] [-cf config-file] [-lf lease-file]
                [-pf pid-file] [--no-pid] [-e VAR=val]
                [-sf script-file] [interface]
ふむ。とりあえずDHCPv6クライアントとして実行する場合は-6と、最後のinterfaceは指定したほうがよさそう。ついでに一応設定ファイルを-cfで明示的に指定してみよう。あとは動きを確認するために-v(よくあるverbose)。

# dhclient -6 -cf /etc/dhcp/dhclient.conf eth0 -v
実行結果。
Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Bound to *:546
Listening on Socket/eth0
Sending on   Socket/eth0
PRC: Soliciting for leases (INIT).
XMT: Forming Solicit, 0 ms elapsed.
'send dhcp6.oro' syntax is deprecated, please use the 'request' syntax ("man dhclient.conf").
XMT:  X-- IA_NA 01:96:49:2b
XMT:  | X-- Request renew in  +3600
XMT:  | X-- Request rebind in +5400
XMT: Solicit on eth0, interval 1060ms.
RCV: Advertise message on eth0 from fe80::213:e8ff:fexx:yyzz.
RCV:  X-- IA_NA 01:96:49:2b
RCV:  | X-- starts 1391264700
RCV:  | X-- t1 - renew  +3600
RCV:  | X-- t2 - rebind +7200
RCV:  | X-- [Options]
RCV:  | | X-- IAADDR fd00:dead:beef::c7e5
RCV:  | | | X-- Preferred lifetime 604800.
RCV:  | | | X-- Max lifetime 2592000.
RCV:  X-- Server ID: 00:01:00:01:1a:7f:8d:59:00:13:e8:xx:yy:zz
RCV:  Advertisement recorded.
PRC: Selecting best advertised lease.
PRC: Considering best lease.
PRC:  X-- Initial candidate 00:01:00:01:1a:7f:8d:59:00:13:e8:xx:yy:zz (s: 153, p: 0).
XMT: Forming Request, 0 ms elapsed.
'send dhcp6.oro' syntax is deprecated, please use the 'request' syntax ("man dhclient.conf").
XMT:  X-- IA_NA 01:xx:yy:zz
XMT:  | X-- Requested renew  +3600
XMT:  | X-- Requested rebind +5400
XMT:  | | X-- IAADDR fd00:dead:beef::c7e5
XMT:  | | | X-- Preferred lifetime +7200
XMT:  | | | X-- Max lifetime +7500
XMT:  V IA_NA appended.
XMT: Request on eth0, interval 960ms.
RCV: Reply message on eth0 from fe80::213:e8ff:fexx:yyzz.
RCV:  X-- IA_NA 01:xx:yy:zz
RCV:  | X-- starts 1391264702
RCV:  | X-- t1 - renew  +3600
RCV:  | X-- t2 - rebind +7200
RCV:  | X-- [Options]
RCV:  | | X-- IAADDR fd00:dead:beef::c7e5
RCV:  | | | X-- Preferred lifetime 604800.
RCV:  | | | X-- Max lifetime 2592000.
RCV:  X-- Server ID: 00:01:00:01:1a:7f:8d:59:00:13:e8:xx:yy:zz
PRC: Bound to lease 00:01:00:01:1a:7f:8d:59:00:13:e8:xx:yy:zz.
お。動いてる[3]。動いているが。DHCPv6サーバから振られているアドレスが「fd00:dead:beef::c7e5」である。前に書いたとおり動いていれば振られるアドレスは「fd00:dead:beef::100」になるはずなのであるが。一応ifconfigでも確認。
# ifconfig
eth0      Link encap:イーサネット  ハードウェアアドレス 00:16:01:xx:yy:zz
          inetアドレス:192.168.1.33 ブロードキャスト:192.168.1.255  マスク:255.255.255.0
          inet6アドレス: fd00:dead:beef:0:216:1ff:fexx:yyzz/64 範囲:グローバル
          inet6アドレス: fe80::216:1ff:fexx:yyzz/64 範囲:リンク
          inet6アドレス: fd00:dead:beef::c7e5/64 範囲:グローバル
うむやはり。c7e5はDHCPv6サーバからリースする範囲(1000からffff)の範囲には入っているので、DHCPv6サーバ自体は機能してそう。
サーバ側のログを見てみると。
Feb  1 23:25:36 lmdecfy7 dhcpd: Solicit message from fe80::216:1ff:fexx:yyzz port 546, transaction ID 0x792D6600
Feb  1 23:25:36 lmdecfy7 dhcpd: Picking pool address fd00:dead:beef::c7e5
Feb  1 23:25:36 lmdecfy7 dhcpd: Sending Advertise to fe80::216:1ff:fexx:yyzz port 546
Feb  1 23:25:37 lmdecfy7 dhcpd: Request message from fe80::216:1ff:fexx:yyzz port 546, transaction ID 0xA4A60600
Feb  1 23:25:37 lmdecfy7 dhcpd: Wrote 0 deleted host decls to leases file.
Feb  1 23:25:37 lmdecfy7 dhcpd: Wrote 0 new dynamic host decls to leases file.
Feb  1 23:25:37 lmdecfy7 dhcpd: Wrote 0 leases to leases file.
Feb  1 23:25:37 lmdecfy7 dhcpd: Sending Reply to fe80::216:1ff:fexx:yyzz port 546
ということで、どうも適当に在庫からアドレスを拾ってきていてそれがc7e5ということらしい。うーむ。色々がんばったつもりなんだが。
パケットを見てみると、どうやらDHCPv6 soliciteの中にクライアントから送られるDUIDが含まれているらしいということを知る。
DUID type: link-layer address plus time (1)
Hardware type: Ethernet (1)
Time: Feb  1, 2014 23:25:00 JST
Link-layer address: 00:16:01:xx:yy:zz
マジかよ。とりあえず2つおかしい。
  1. DUIDタイプがLL+T(MACアドレスと時刻)になっている
  2. Hardware typeがEthernetになっている
DUIDタイプは時刻がいつになるかわからない時点で知ったこっちゃないので、LLになるといいなぁと思っていたので、正直参る。

このエントリはここまで。

[1] http://packages.debian.org/ja/jessie/isc-dhcp-client
[2] https://wikispaces.psu.edu/display/ipv6/DHCPv6#DHCPv6-ISCdhclient4.1.0
[3] MACアドレス該当部はぼかしています

2014-02-05

特定のMACアドレスに対してIPv6アドレスを設定するDHCPv6サーバを構築した(2)-DHCPv6サーバの設定(1)

(今のところ)isc-dhcp-serverはdaemonとしてハンドリングしづらい
いきなりブチ切れに近い感じで。

  • 今回DHCPv6サーバにするのはLinux(Debian GNU/Linux)
  • ざっと持ち合わせてる知識だとwide-dhcpv6-server[1]かisc-dhcp-server[2]が良さそうなのだけど、wideの方はupstreamを見ても最後の更新が2009年なので使うのに気が引けてしまう(今はdibblerなのかな?)
  • かと言ってisc-dhcp-serverがDHCPv6サーバとしてハンドリングしやすいかと言えばそんな事は全くなく、パッチをあてる[3]のが一番てっとり早そうという泥沼
という事で、普通のDHCP(v4)サーバみたくハンドリングできるようにソースパッケージにパッチをあててビルドしますorz。

isc-dhcp-serverをビルド、インストール
まず、当てたいパッチが4.2.4向けなので、現状4.2.4なtesting/jessieまたはsidをapt-get sourceできるように以下の行をapt-lineに追加します。

deb-src http://ftp.jp.debian.org/debian/ jessie main non-free contrib
# apt-get update
# apt-get build-dep isc-dhcp=4.2.4-7
# apt-get install devscripts

# exit
$ mkdir build_isc
$ cd build_isc/
$ apt-get source isc-dhcp=4.2.4-7
で、[3]のMessage142のisc-dhcp-server-ipv6.patchをダウンロードしてきます。ここでは~/Downloadsに保存したものとして、
$ patch -u -p0 < ~/Downloads/isc-dhcp-server-ipv6.patch
(patching file・・・がずらずらーっと出ればOK)

$ cd isc-dhcp-4.2.4/
$ debuild -uc -us
$ su
$ cd ..
# dpkg -i isc-dhcp-server_4.2.4-7_amd64.deb isc-dhcp-common_4.2.4-7_amd64.deb
でビルドしたパッケージのインストールは完了。

isc-dhcp-serverの設定項目
今回はDHCP(v4)サーバは設定せず、DHCPv6サーバだけ動かすので、そのように書き換えます。/etc/default/isc-dhcp-serverの以下の場所を書き換え。
  • V4_ENABLED="true"を"false"へ
  • V6_ENABLED="false"を"true"へ
  • INTERFACES_V6=の行を"wlan0"へ(今回はwlan0でDHCPv6dを動かすので)
# touch /var/lib/dhcp/dhcpd6.leases

/etc/dhcp/dhcpd6.confを必要に応じて書き換える。
default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
allow leasequery;
option dhcp6.info-refresh-time 21600;
dhcpv6-lease-file-name "/var/lib/dhcp/dhcpd6.leases";
# RAとか範囲とか(うちの場合はRTX1100で配っているRA)
subnet6 fd00:dead:beef::/64 {
 # 1000からffffまでをDHCPで配る対象にする
 range6 fd00:dead:beef::1000 fd00:dead:beef::ffff;
 # 固定IPアドレス
 host kurobox-t4 {
  host-identifier option dhcp6.client-id 00:03:00:06:00:16:01:xx:yy:zz;
  # 固定で振るIPv6アドレス
  fixed-address6 fd00:dead:beef::100;
 }
}
ここで固定アドレスを振る対象の行の最後のパラメータですが(最後3オクテットをぼかしてますが)、これが弊ブログの別エントリで触れているDUIDになります。
この時点では生成をミスるとまずいと思ったので、wide_mkduid.plというスクリプトを使って生成しました。端的に書くと、MACアドレスの前に「00:03:00:06:」を付与したDUID-LL(hardware typeは6(IEEE 802 Networks))です。まぁ後々これでも不味かったことを思い知るわけですが。
なお、dhcpd6.confの書き方は[4]を参考にさせていただきました。

このエントリはここまで。


[1] http://packages.qa.debian.org/w/wide-dhcpv6.html
[2] http://packages.qa.debian.org/i/isc-dhcp.html
[3] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=592539

特定のMACアドレスに対してIPv6アドレスを設定するDHCPv6サーバを構築した(1)-序章

やる前は1エントリで済むと思ってたんですが実際やってみるとすげー大変だったのでいくつかに分けます。
現状&やりたいこと
我が家では部分的にIPv6を導入していて、VPN(L2TP)ルータとしてヤマハのRTX1100を使っています。また、RAもRTX1100からLAN側に流していて、ステートレスなIPv6アドレス設定はできている状態です。


ですが、ご存知の通りIPv6アドレスは長い事、ステートレスに生成するIPv6アドレスは128bitぶんのアドレスを使い切る(0ではない)ので、LAN内のサーバにも頻繁にアクセスするには辛いアドレス(手入力したくない)が設定されます。[1]
そこで、IPv4では家庭用のブロードバンドルータでもできるような「特定のMACアドレスに特定のMACアドレスを配布する」をIPv6で実現しようと思いました。よく言うDHCPv6によるステートフルなIPv6アドレス割り振り(しかも固定アドレス)です[2]。

せっかくヤマハルータあるんだからコマンドいくつか流しこめば出来るんじゃないかと思ったんですが、現状のヤマハルータではRTX1100に限らずこの機能が提供されていません。


なので、LAN内のPCをDHCPv6サーバにしてみようというのが今回のスタート地点です。

今回の記事の全容は以下になります。

  1. 序章←今ここ
  2. DHCPv6サーバの設定(1)
  3. DHCPv6クライアントの設定
  4. DHCPv6サーバの設定(2)
RTX1100の設定はこんな感じです。

  • LAN1がLAN
  • 配布するRAのprefixはfd00:dead:beef::/64
  • DHCPv6使うのでRAのMフラグは立てる

具体的には

  • # ipv6 prefix 1 fd00:dead:beef::/64
  • # ipv6 lan1 prefix fd00:dead:beef::/64
  • # ipv6 lan1 rtadv send 1 m_flag=on
このエントリはここまで。


[1] AAAAレコードを返すDNSサーバを置いても解決できる問題ではありますが
[2] ステートフルの定義を理解できてないかもしれないので間違っていたら教えてください