2016/02/21

Corsair STFARE RGB MX silentのhotplugでusbhid.quirks

最近発売されたCorsair STRAFE RGB MX silentを使っているが、Linuxのブート時やキーボードのhotplug時に次のようなエラーが出ていた。
hid-generic 0003:1B1C:1B20.0002: usb_submit_urb(ctrl) failed: -1
hotplugしてからある程度の時間が経過すれば使えることもあれば、ずっと使えないこともあった。
原因はよくわからなかったが、上記のエラーが理由となっている可能性あると考え、検索したところ
usbhid.quirks=0x1B1C:0x1B20:0x20000000
をboot時のコマンドラインオプションに追加すればよいとの事であった。(usbhidがカーネル内に組み込まれている場合は)
/etc/defualt/grubのGRUB_CMDLINE_LINUXの行を
GRUB_CMDLINE_LINUX="init=/usr/lib/systemd/systemd usbhid.quirks=0x1B1C:0x1B20:0x20000000"
のように編集し、grub2-mkconfig -o /boot/grub/grub.cfgで反映。
quirksが何なのかなど根本的な所は全く理解していないが、前述したエラーは消失し、boot後またはhotplug後にキーボードが使えないということはなくなったようだ。
RGBのbacklightはやっぱりカッコいい。
近日発売される予定のLogitechのg810がすごい気になっている。Romer-Gスイッチは店頭で触った感じだとかなり好きだった。

2015/05/24

Rでグラフを描く際のy軸のラベルなどの件

統計解析やグラフ作成が必要な際にはだいたいいつもRを使っている。
tiffで1000dpi、9cmのグラフを作成したい場合、単純に下記のようにすればよいと思ったわけだが、ラベルの記載がいまいちうまく行かなかった。ラベル中に上付き文字を使う場合はexpression(paste())を使用するのが一般的だと思われるが、どうも上付きにした2の上のほうが下の図のように欠けてしまう。また、y軸の目盛には小数点の".0"がついて欲しかったが、最初その方法が良くわからなかった。

xData <- 5:10
yData <- rnorm(length(xData),7.5,1)

l <- lm(yData ~ xData)

tiff("test.tiff",width=90,height=90,units="mm",res=1000,pointsize=7)
xlim <- c(5,10)
ylim <- c(5.0,10.0)

plot(x=xData, xlab="xData (mm)",
     y=yData, ylab=expression(paste("yData (mm"^"2",")")),
     xlim=xlim,ylim=ylim)

abline(l)
dev.off()


まず、上付きの2の上のほうが欠けてしまう問題について。左側の余白が小さすぎるのが問題っぽかった。par("mar")で出てきた余白を見て、左側の4.1(左から2番目の値)を5.1に変更したらうまくいった。
> par("mar")
[1] 5.1 4.1 4.1 2.1
また、目盛の有効数字についてだが、plot()内で書かずにaxis()を使って自分で書く方法でできることが判明。axis()のlabels引数にsprintf("%.1f",lab_vector)したものを渡すことで".0"がついた目盛を作成できた。
最終的には以下のようになった。

xData <- 5:10
yData <- rnorm(length(xData),7.5,1)

l <- lm(yData ~ xData)

tiff("test.tiff",width=90,height=90,units="mm",res=1000,pointsize=7)
par(mar=c(5.1,5.1,4.1,2.1),font=1,family="Helvetica")
xlim <- c(5,10)
ylim <- c(5.0,10.0)

plot(x=xData, xlab="xData (mm)",
     y=yData, ylab=expression(paste("yData (mm"^"2",")")),
     xlim=xlim,ylim=ylim,xaxt="n",yaxt="n")
axis(1,at=pretty(xlim))
axis(2,at=pretty(ylim),labels=sprintf("%.1f",pretty(ylim)))

abline(l)
dev.off()
これで求めていた形になった。かなり解決に時間がかかったが、今後もRでグラフを作成する際には使っていきたい。統計処理のトレンドはSciPyになってきている?みたいな事も聞いたことがあるが、そっちもそのうち試してみようかと思った。



2015/05/17

Linux Trackball:Emulate3Buttons改造


1年くらい前にevdevのEmulate3Buttonsまわりのコードを改造したが、今回それに追加をすることにした。
xorg.confの設定において、Emulate3ButtonsはButton1(左クリック)とButton3(右クリック)を同時押しするとButton2のeventが発行されるというものである。
また、左右同時押し+トラックボールで画面のスクロールをしたい場合、EmulateWheelを"True"にすればよいわけだが、それを行うEmulateWheelButtonはEmulateされたボタンであってはならないという制約がデフォルトでは存在した。これを変更する改造を以前行ったわけだが、問題が完全に解決したわけではなかった。

自分の愛用しているKensingtonのExpert Mouse 7やSlimbladeにおいて、ボタンのフィジカルレイアウトは


2 | 8
-----
1 | 3
となっているわけだが、自分は


8 | 9
-----
1 | 3
のように使いたい。8をブラウザの戻る、9をブラウザの進むに割り当てると非常にブラウジングが快適になるからだ。
この設定はOption "ButtonMapping" "1 8 3 4 5 6 7 9"のようにすれば可能だが、こうするとEmulate3Buttonsで発行されるボタンはフィジカルボタンの2番目、つまり"8"が発行されてしまう。自分としては中クリックの"2"を発行したい。さらに、EmulateWheelButtonは"2"にしたい。

どうしたものかとしばらく悩んだが、解決策を思いついた。
Emulate3Buttonsで発行されるボタンを存在しないフィジカルボタンの9番目にして、そこをButtonMappingで"2"にすればいいのである。
xf86-input-evdev-2.9.2/src/emuMB.cのステートマシンのstateTab[][][0]が発行されるキー番号なので、ここの2を9に変更すればよい。以前変更したEvdevMBEmuFilterEventの変更部分はそのままで大丈夫だ。


diff -ur xf86-input-evdev-2.9.2/src/emuMB.c xf86-input-evdev-2.9.2-myMB/src/emuMB.c
--- xf86-input-evdev-2.9.2/src/emuMB.c 2015-03-11 12:24:39.000000000 +0900
+++ xf86-input-evdev-2.9.2-myMB/src/emuMB.c 2015-05-17 02:23:52.430447770 +0900
@@ -94,7 +94,7 @@
     {  0,  0,  0 },   /* nothing -> ground (no change) */
     {  0,  0,  1 },   /* left -> delayed left */
     {  0,  0,  2 },   /* right -> delayed right */
-    {  2,  0,  3 },   /* left & right (middle press) -> pressed middle */
+    {  9,  0,  3 },   /* left & right (middle press) -> pressed middle */
     {  0,  0, -1 }    /* timeout N/A */
   },
 /* 1 delayed left */
@@ -102,7 +102,7 @@
     {  1, -1,  0 },   /* nothing (left event) -> ground */
     {  0,  0,  1 },   /* left -> delayed left (no change) */
     {  1, -1,  2 },   /* right (left event) -> delayed right */
-    {  2,  0,  3 },   /* left & right (middle press) -> pressed middle */
+    {  9,  0,  3 },   /* left & right (middle press) -> pressed middle */
     {  1,  0,  4 },   /* timeout (left press) -> pressed left */
   },
 /* 2 delayed right */
@@ -110,12 +110,12 @@
     {  3, -3,  0 },   /* nothing (right event) -> ground */
     {  3, -3,  1 },   /* left (right event) -> delayed left (no change) */
     {  0,  0,  2 },   /* right -> delayed right (no change) */
-    {  2,  0,  3 },   /* left & right (middle press) -> pressed middle */
+    {  9,  0,  3 },   /* left & right (middle press) -> pressed middle */
     {  3,  0,  5 },   /* timeout (right press) -> pressed right */
   },
 /* 3 pressed middle */
   {
-    { -2,  0,  0 },   /* nothing (middle release) -> ground */
+    { -9,  0,  0 },   /* nothing (middle release) -> ground */
     {  0,  0,  7 },   /* left -> released right */
     {  0,  0,  6 },   /* right -> released left */
     {  0,  0,  3 },   /* left & right -> pressed middle (no change) */
@@ -139,33 +139,33 @@
   },
 /* 6 released left */
   {
-    { -2,  0,  0 },   /* nothing (middle release) -> ground */
-    { -2,  0,  1 },   /* left (middle release) -> delayed left */
+    { -9,  0,  0 },   /* nothing (middle release) -> ground */
+    { -9,  0,  1 },   /* left (middle release) -> delayed left */
     {  0,  0,  6 },   /* right -> released left (no change) */
     {  1,  0,  8 },   /* left & right (left press) -> repressed left */
     {  0,  0, -1 },   /* timeout N/A */
   },
 /* 7 released right */
   {
-    { -2,  0,  0 },   /* nothing (middle release) -> ground */
+    { -9,  0,  0 },   /* nothing (middle release) -> ground */
     {  0,  0,  7 },   /* left -> released right (no change) */
-    { -2,  0,  2 },   /* right (middle release) -> delayed right */
+    { -9,  0,  2 },   /* right (middle release) -> delayed right */
     {  3,  0,  9 },   /* left & right (right press) -> repressed right */
     {  0,  0, -1 },   /* timeout N/A */
   },
 /* 8 repressed left */
   {
-    { -2, -1,  0 },   /* nothing (middle release, left release) -> ground */
-    { -2,  0,  4 },   /* left (middle release) -> pressed left */
+    { -9, -1,  0 },   /* nothing (middle release, left release) -> ground */
+    { -9,  0,  4 },   /* left (middle release) -> pressed left */
     { -1,  0,  6 },   /* right (left release) -> released left */
     {  0,  0,  8 },   /* left & right -> repressed left (no change) */
     {  0,  0, -1 },   /* timeout N/A */
   },
 /* 9 repressed right */
   {
-    { -2, -3,  0 },   /* nothing (middle release, right release) -> ground */
+    { -9, -3,  0 },   /* nothing (middle release, right release) -> ground */
     { -3,  0,  7 },   /* left (right release) -> released right */
-    { -2,  0,  5 },   /* right (middle release) -> pressed right */
+    { -9,  0,  5 },   /* right (middle release) -> pressed right */
     {  0,  0,  9 },   /* left & right -> repressed right (no change) */
     {  0,  0, -1 },   /* timeout N/A */
   },
@@ -237,12 +237,14 @@

     if ((id = stateTab[pEvdev->emulateMB.state][*btstate][0]) != 0)
     {
-        EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
+ if (!EvdevWheelEmuFilterButton(pInfo, abs(id), (id >= 0)))
+    EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
         ret = TRUE;
     }
     if ((id = stateTab[pEvdev->emulateMB.state][*btstate][1]) != 0)
     {
-        EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
+ if (!EvdevWheelEmuFilterButton(pInfo, abs(id), (id >= 0)))
+    EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
         ret = TRUE;
     }

こうした後で、Option "ButtonMapping" "1 8 3 4 5 6 7 9 2"にする。
/etc/X11/xorg.confの該当部分はこんな感じ。


Section "InputDevice"
  Identifier "Kensington Slimblade"
  Driver "evdev"
  Option "Protocol" "auto"
Option "Device"   "/dev/input/by-id/usb-Kensington_Kensington_Slimblade_Trackball-event-mouse"
  Option "Buttons"  "9"
Option "Emulate3Buttons" "true"
Option "Emulate3Timeout" "100"
Option "EmulateWheel"        "true"
Option "EmulateWheelButton" "9" # requires evdev customize
Option "EmulateWheelTimeout" "250"
Option "YAxisMapping" "4 5"
Option "XAxisMapping" "6 7"
  Option "ButtonMapping" "1 8 3 4 5 6 7 9 2"
EndSection

これで、左右ボタン同時押しで中クリックとして使用し、左右ボタン同時押し+トラックボールでスクロールすることができる。ちなみに中ボタンドラッグができないのは仕様である。
非常に快適である。

2015/02/01

Logicool Trackman Marble (TM-150r)のカップ安定化

LogicoolのMarbleはとても気に入って使っているが、自分のはボールを支えるカップがややガタついていた(個体差か?)。
特に日常作業に支障はないわけだが少し気になりだしたので、分解して固定性を高めることにした。ネジは底板の裏のラベルのところにある隠しネジを含めて5個。これらを外すとスムーズに開いた。開くと、カップは底板とは別にある程度自由に動く構造になっており、これがガタつきの原因と思われた。
瞬間接着剤で固定というのも考えたが、家に瞬間接着剤がなかったのと、やや非可逆的手段になるのが少しためらわれた。他の手段がないかと考えて、詰め物で固定する方法とした。紙で固定するのは、腐ったりカビが生えたりすると嫌だったので、ある程度の厚みがあるプラスチックということで、いらないクリアファイルを切って詰め物として使うことにした。
まず、上下方向のガタつきを抑制するため、底板とカップの間に、底にある穴を邪魔しないような形でクリアファイルを形にあうように切り、3枚重ねにした。
次に、カップと支柱のような構造との間にわずかなすきまがあり、これが前後左右方向のガタつきの原因と考えられたため、幅2mm、長さ8mmくらいに切った長方形のクリアファイルの破片を、これらの間に満遍なく差しこむように留置した。
十分にクリアファイルの破片を差し込み、カップのガタつきがないのを確認し、蓋をしめてネジを戻し、終了。しばらく使ってみたが、ガタつかず、だいぶ使いやすくなったと思った。もっと早くやってればよかった。

2014/05/13

LinuxでTrackballで左右同時押しスクロール

Kensington Slimbladeの左クリックのスイッチが壊れたので、今回は違うのを試してみようと思ってKensington Orbit Wireless Mobile Trackballを購入した(Slimbladeは機会があればハンダゴテで修理したいと思う)。
本機にはセンサースクロールがあるが、使い勝手があまりよろしくない。例えばWindowsとかの環境だと、トラックボールを使う場合は左右ボタン同時押し+ボール回転でスクロールするようにするのが一般的らしい。少し調べた限りでは、Linuxにおいては例えばLogicoolのTrackman Marble TM-150rとかの場合、ボタンの一つ(例えば左小ボタンなど)をスクロール用に割り当てる方法が一般的なようであった。

2ボタントラックボールでボールでスクロールをする場合どのようにすればいいかについて色々試してみたため、忘れないようメモしておく。

xorg.confでできるボタン設定について(evdev使用):
Option "Emulate3Buttons" "true/false"
Button 1,Button 3の同時押しでButton 2にできる。

Option "EmulateThirdButton" "true/false"
Button 1の長押し(EmulateThirdButtonTimeout)で任意のボタン(EmulateThirdButtonButton)にできる。

Option "EmulateWheel" "true/false"
任意のボタン(EmulateWheelButton)を押しながらのボール操作でスクロールできる。ただしそのボタンはEmulateされたボタンであってはならない。
例えば、
Option "Emulate3Buttons" "true" ← Button 2を1,3同時押しでエミュレートする
Option "EmulateWheel"  "true"
Option "EmulateWheelButton" "2"
の場合、「"EmulateWheelButton' "2"」 は無効である。これが一番やりたいんだが。


解決策1. 右ボタンをスクロール用に割り当てる。

xorg.conf -----
  Option     "ButtonMapping" "1 3 2 4 5 6 7 8"
 Option     "EmulateThirdButton" "true"
 Option     "EmulateThirdButtonTimeout" "400"
 Option     "EmulateThirdButtonButton" "2"
 Option     "EmulateThirdButtonMoveThreshold" "1"
 Option     "EmulateWheel"       "true"
 Option     "EmulateWheelButton" "3"
 Option     "EmulateWheelTimeout" "250"
 Option     "YAxisMapping"  "4 5"
 Option     "XAxisMapping"  "6 7"
-----

右ボタンをスクロール用にしてしまうと、副作用として右クリックドラッグができなくなる。自分の場合、右クリックドラッグが必要であった。
EmulateThirdButtonとEmulate3Buttonsは同時に使用できないか(ソースちょっと見たが、あんまり詳しく読んでないw)?そのためButtonMappingで右ボタンを中クリック(Button 2)にする。"EmulateWheelButton" "3"の3は物理的な右ボタンを意味するので、右ボタンをスクロール用にする。こうすると右クリックに相当するものが必要になるので、左ボタン長押しで右クリックを出すようにする。"EmulateThirdButtonButton" "2"でButtonMappingの2番目、すなわちButton 3とする。
この設定なら、400ms以上左ボタンを長押しすれば右クリックが出せる。EmulateThirdButtonMoveThreshold (1px)以上ポインタを動かせば、左クリックドラッグ扱いとなる。

左ボタン→左クリック
左ボタン長押し→右クリック
右ボタン→中クリック
右ボタン+ボール操作→スクロール

となる。長押しに慣れれば結構便利かもしれないとは思った。


解決策2. やっぱり左右同時押しでスクロールしたい。

EmulateWheelButtonがEmulateされたボタンであってはならない、というのが制約である。ソースコード修正が必要となった。これを書いている時点で、gentooではxf86-input-evdev-2.8.2が最新っぽかったのでこれをget。/src/emuMB.c がMiddle Button Emulationをしている。むずかしいステートマシンになっているようで、ここの理解はあきらめたw。。。ただ、EvdevMBEmuFilterEvent()関数で、EvdevQueueButtonEventでエミュレートボタンをQueueしていることでボタンをエミュレートしていた。ここにEmulateWheelを行うEvdevWheelEmuFilterButton()をhookすればいいかもしれない。EvdevQueueButtonEvent()に投げる引数をそのまま投げることにした。

myemu.patch -----
diff -ur xf86-input-evdev-2.8.2/src/emuMB.c xf86-input-evdev-2.8.2-my/src/emuMB.c
--- xf86-input-evdev-2.8.2/src/emuMB.c 2013-08-29 14:10:43.000000000 +0900
+++ xf86-input-evdev-2.8.2-my/src/emuMB.c 2014-05-12 23:07:32.939481119 +0900
@@ -237,12 +237,14 @@
 
     if ((id = stateTab[pEvdev->emulateMB.state][*btstate][0]) != 0)
     {
-        EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
+ if (!EvdevWheelEmuFilterButton(pInfo, abs(id), (id >= 0)))
+     EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
         ret = TRUE;
     }
     if ((id = stateTab[pEvdev->emulateMB.state][*btstate][1]) != 0)
     {
-        EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
+ if (!EvdevWheelEmuFilterButton(pInfo, abs(id), (id >= 0)))
+     EvdevQueueButtonEvent(pInfo, abs(id), (id >= 0));
         ret = TRUE;
     }
-----

xorg.conf -----
 Option     "Emulate3Buttons"       "true"
 Option     "Emulate3Timeout"       "100"
 Option     "EmulateWheel"       "true"
 Option     "EmulateWheelButton" "2"
 Option     "EmulateWheelTimeout" "250"
 Option     "YAxisMapping"  "4 5"
 Option     "XAxisMapping"  "6 7"
-----

ソースをくまなく読んだわけではないし、あまり深く考えてもいないが、これでなんとかいけてる(かもしれない)。引数は理論的にこれで正しいか、他の修正は本当に必要ないのか、等の質問には全く答えられないが、とりあえず下記のように動くようになった。

左ボタン→左クリック
右ボタン→右クリック
左右ボタン同時押し→中クリック
左右ボタン同時押し+ボール操作→スクロール

中クリックドラッグができないのは仕様ということになるか。
この方法だとやっぱ便利だわ。

2013/03/20

Buffalo LinkStation LS-X1.0TLJで遊ぶ。


ついに約1万円という大枚をはたいて念願のNAS(Buffalo Linkstation LS-X1.0TLJ)を購入。
これで家の中でファイル共有とかができる!!
早速分解。
実は、今まで購入を躊躇しつづけた理由はこうしてジャンクにしてしまうことで1万円をドブに捨てることが怖かったからだ!
キーボードとかモニタが繋げないシステムは怖い。シリアルコンソールとか持ってないし。。boot成功→ssh起動→接続までできなければすなわちjunkである。
PCから復元しようにも壊した後だとHW環境がわからなかったりしてお手上げ。。
今回、勇気を出して購入してみた。
分解したら、小さな基板とSATAの3.5inchHDDがくっついていた。HDDはTOSHIBA。
ちっちゃさに感動。
LS-X1.0TLJはLS-XLシリーズという種類であり、Linuxが動いている。ということがわかった。
まず、普通に本体を起動。きちんと動くことを確認。
Windows機(VMwareだが)にBuffaloのツールを入れる。
すなわち、Buffalo NAS Navigator2と、ファームウェアアップデータ(LSUpdater)だ。
http://buffalo.jp/download/driver/hd/ls_fw.html
特にLSUpdater.exeはBuffalo純正、改造の際必須のツールである(とのちに悟った)。

次に、nas_central.orgでacp_commander.jarというツールを入手。ググれば詳細が出てくるが、
root権限でコマンドを外から実行させることができる。sshを有効化する前のつなぎや復旧困難になったときの助けになる。

使い方はtargetが192.168.0.10として
$ java -jar acp_commander.jar -t 192.168.0.10 -ip 192.168.0.10 -pw password -c "whoami"
root
みたいな感じ。最後がroot権限で動作するコマンドである。


今回はまず、試行錯誤の末、LS-XLのHDD交換手順を把握したのでまとめたい。

1) HDDセットアップ
まず新品(でなくてもよいが)のHDDをPCにセット。/dev/sdbとする。
# parted /dev/sdb
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                              
Model: ATA TOSHIBA DT01ACA1 (scsi)
Disk /dev/sdb: 1000GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
 1      17.4kB  1000MB  1000MB  ext3         primary  boot

とりあえずpartedでこのような状態まで持ち込む。boot flagはparted上でset 1 boot onでsetできる。


2) HDDをlinkstationからブートできるようにする。
ファームウェアは今回はls_series-164を使用。v.1.64だ。
上記LSUpdater.exeに同梱されてきたuImage.img、initrd.imgをそれぞれcopy、zipにリネームしunzip。
パスワードは http://buffalo.nas-central.org/wiki/How_to_modify_an_initrd などネット上に書いてある。
initrd.zipからinitrd.buffaloを、uImage.zipからはuImage-lsp.5.x.buffaloを取り出す(uImage-88f5182はLS-XLの場合スルーでよい)。
uImage-lsp.5.x.buffaloをuImage.buffaloにrename。
こうして得たinitrd.buffal、uImiage.buffaloを上記partitionにぶち込む。
# mount /dev/sdb1 /mnt/hdd && mv initrd.buffalo uImage.buffalo /mnt/hdd
でOK。
ここでHDDをlinkstationにセット。linkstationの電源を投入する。

3) firmware書き込み
LSUpdate.exeの出番である。まず、LSUpdate.iniを編集し
[Flags]
VersionCheck = 0
NoFormatting = 0

[SpecialFlags]
Debug = 1
最後のほうをこのように書き換える。
LSUpdate.exeを起動したら左上のアイコンを右クリックし、デバッグモードを選択。
この段階でネットワーク上のlinkstationは検出されているべきだ。linkstationはu-bootというbootloaderを使用しており(ROM上にある)、先ほどのuImage.buffaloがu-boot対応kernelである。
initrdが立ち上がり、initrd環境内でdhcp clientが立ち上がるはずとなっている。linkstationが見つからない場合はネットワーク設定およびHDDの状態を見直す。
とりあえずチェックボックスに全部チェックをつけて(IPアドレス云々のところは無視してよい)、ファームウェア更新。
ここでfirmwareの書き換え、再起動などが始まるわけだが、かなり待っていると"Linkstationの起動完了を待っています" "しばらくお待ち下さい"の後に"LinkStationからの応答を1200秒間待機しましたが応答がありませんでした もう一度待機してよろしいですか?"と出るのでいいえとする。すると"LinkStationからの応答がありませんでした アップデートを中止します"となる。
その後、"LS-XL-EMD89からの応答を確認できませんでした"となりlinkstationが検出できなくなる。

ここでLinkStationの電源を切り、ふたたびHDDを取り外しPCに接続。
(parted) p                                                              
Model: ATA TOSHIBA DT01ACA1 (scsi)
Disk /dev/sdb: 1000GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name     Flags
 1      1049kB  1026MB  1024MB  ext3            primary
 2      1026MB  6146MB  5120MB  ext3            primary
 3      6146MB  6147MB  1049kB                  primary
 4      6147MB  6148MB  1049kB                  primary
 5      6148MB  7172MB  1024MB  linux-swap(v1)  primary
 6      7172MB  992GB   985GB   xfs             primary
このようにformatしてくれたことがわかる。
ここで
(parted) set 1 boot on
し # mount /dev/sdb1 /mnt/hddでマウント。
# ls /mnt/hdd
builddate.txt              u-boot_lsxlv2_64mb.bin  uImage.map
hddrootfs.buffalo.updated  uImage-88f5182.buffalo
initrd.buffalo             uImage-lsp.5.x.buffalo
このような状態。最初にいれたuImageは消されてる。。。?ここで
# cp uImage-lsp.5.x.buffalo uImage.buffalo
で再びuImage.buffaloを作成(シンボリックリンクでいいかは試してない)
これが必要だと悟るまでしばらくかかった。
ふたたびumount、PCからHDDを取り外しlinkstationに戻し、電源投入。

4) 起動。
ここが最大のポイントなのだが、ここでしばらく待つ。5-6分は覚悟したほうがよい。
この時間は、おそらくhddrootfs.buffalo.updatedを/などに展開している時間である(/dev/sdb2に相当)。
電源ランプは青く点滅しておりboot失敗の状態やエラーと外から区別がつかないが、待ち続ける。ここが最大のハマりどころである。
すると電源ランプの点滅が終わり、青く点灯した状態となる。
BUFFALO NAS Navigatorで確認すると認識できており、正常起動したとわかる。めだたしめでたし。

NAS Navigatorからshutdown。パスワードはdefaultのpasswordである。

5) root passwordクリア、ssh導入
以上で終わってもよいが、とりあえず続ける。

rootパスワードクリア /etc/shadow編集
# sed -i 's/root:[^:]*:/root::/g' /etc/shadow

/etc/sshd_config編集、初回ログインのためPermitEmptyPasswordにしておく
# sed -i 'sed -i 's/UsePAM yes/UsePAM no/g' /etc/sshd_config'
# sed -i 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/sshd_config
# echo "PermitEmptyPassword yes" >> /etc/sshd_config

hosts.allow作成
# echo "sshd:ALL" >> /etc/hosts.allow

inetdに登録 -iはinetdから起動するオプション。sshdは/usr/local/sbin/にある。
# echo "ssh stream tcp nowait root /usr/local/sbin/sshd /usr/local/sbin/sshd -i" >> /etc/initd.conf

別に全部emacsでやってもいいです。

これでふたたびlinkstationにHDDを接続、起動。
ssh root@192.168.0.10でログインできる。めでたしめでたし。

6) sshログイン、rootパスワード設定ww
まず# passwd rootでパスワードを設定し、PermitEmptyPasswordをnoにする。

このLinkStationは11,000円くらいで購入した。1TB HDDの値段を7,000円前後としても、4,000程度でlinuxマシンを入手できたことになり、感動。

2013/02/10

vmware-player-5.0.1.894247が落ちる件について(curl)


ある日(今日だが)、突然vmware-playerが立ち上がらなくなっていた。vmware-player自体のversionを変更した覚えはない。
vmplayerのウィンドウが出ずに、zsh: abortとなって落ちる。segfaultっぽい。
おそらく日々のemergeでなんらかのパッケージが入れ替わったことによるのだろう。
しかしばらくvmwareを起動してなかったので原因パッケージは不明だった。
/tmp/vmware-metro/以下のログファイルを見ても、セグフォっている原因はいまいち不明だった。
gdbでトレースすることにした。

$ gdb vmplayer

(gdb) r
Starting program: /opt/vmware/bin/vmplayer
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7fffe1112700 (LWP 7096)]

Program received signal SIGSEGV, Segmentation fault.
0x00007fffe8c1d997 in curl_multi_cleanup () from /usr/lib64/libcurl.so.4

どうやらcurlで落ちてる?ということでcurlのversionを1個前にもどした。
emerge -1 "=net-misc/curl-7.28.1"
vmplayerは無事立ち上がる。
curlをふたたび7.29.0に戻したところやはり落ちる。
どうやら、自分の環境ではnet-misc/curl-7.29.0との相性(笑)がよくないよう。
特にこれ以上の原因追求をする気にはなれず終了とした。
やっぱ困った時はgdbか。
やっぱ琴浦さん面白いわ。