2018年10月21日日曜日

Debian sidでnfsdが立ち上がらなくなったのでscriptを修正 (sysvinit)

*** 注意 ***

Debianはinit daemonとしてsystemdを採用している。

個人的な趣味から今回の問題が起きたPCではsystemdを入れていない (sysvinitで運用)。おそらく、maintenanceされていないsysvinit用のscriptが原因でこのような問題が発生したと考える。

よって、普通にsystemdを使っているuserにはaffectしない。

*** 注意ここまで ***


大容量HDDを搭載したPCでnfsdを立ち上げて、LAN内にあるPCからNFSv4でmountできるようにしてあるのだが、kernelのupgrade後にmountできなくなった。

Debianでは、NFSの機能がnfs-commonとnfs-kernel-serverに分割されている。このうちnfs-commonの方は問題なかった。

一方、nfsdが立ち上がっていないし、以下のようなmessageも出るので、nfs-kerrnel-server側のscript内でerrorが発生しているとわかった。

% sudo service nfs-kernel-server restart
[ ok ] Stopping NFS kernel daemon: mountd nfsd.
[ ok ] Unexporting directories for NFS kernel daemon....
[ ok ] Exporting directories for NFS kernel daemon....
[....] Starting NFS kernel daemon: nfsd
[warn] Not starting: portmapper is not running ... (warning).

script (/etc/init.d/nfs-kernel-server)を眺めてみると、92-99行にportmapperがどうのというwarningを出力する箇所で、rpcinfoというcommandへのpathが$PREFIX/sbin/rpcinfoとなっている:

        # See if rpcbind is running
        $PREFIX/bin/rpcinfo -p >/dev/null 2>&1
        RET=$?
        if [ $RET != 0 ]; then
            echo
            log_warning_msg "Not starting: portmapper is not running"
            exit 0
        fi

rpcinfoのreturn valueがnon zeroなのでifに引っ掛かってexit 0している訳だ。

rpcinfoがどういう出力なのか確かめてみようと打ってみる:

% sudo /usr/sbin/rpcinfo -p
sudo: /usr/sbin/rpcinfo: command not found

/usr/sbin/rpcinfoが存在しない。では、rpcinfoがどのpackageに含まれているのか (あるいは存在しないのか)調べてみる:

% dpkg -S rpcinfo
rpcbind: /usr/bin/rpcinfo
nmap-common: /usr/share/nmap/scripts/rpcinfo.nse
rpcbind: /usr/share/man/man8/rpcinfo.8.gz

sbinじゃなくてbinになっている。移動したようだ。では改めて:

% /usr/bin/rpcinfo -p                                         
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  57281  status
    100024    1   tcp  59599  status
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049
    100003    3   udp   2049  nfs
    100227    3   udp   2049
    100021    1   udp  49265  nlockmgr
    100021    3   udp  49265  nlockmgr
    100021    4   udp  49265  nlockmgr
    100021    1   tcp  33993  nlockmgr
    100021    3   tcp  33993  nlockmgr
    100021    4   tcp  33993  nlockmgr
    100005    1   udp  49349  mountd
    100005    1   tcp  53921  mountd
    100005    2   udp  60977  mountd
    100005    2   tcp  32831  mountd
    100005    3   udp  52847  mountd
    100005    3   tcp  49695  mountd

scriptではrpcinfoの実行結果 (というか出力は/dev/nullに棄てて、return valueだけを見て)からportmapperがsupportされているかどうかを確認していた。この出力を見る限り、portmapperはsupportされていると分かる。

scriptの当該箇所を修正 ($PREFIX/sbin/rpcinfo → $PREFIX/bin/rpcinfo) して、改めて試してみる:

% sudo service nfs-kernel-server restart
[ ok ] Stopping NFS kernel daemon: mountd nfsd.
[ ok ] Unexporting directories for NFS kernel daemon....
[ ok ] Exporting directories for NFS kernel daemon....
[....] Starting NFS kernel daemon: nfsd mountdrpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
. ok 

ここでtcp6やudp6に関するerror或いはwarningが出ているのは、IPv6を使ってないのでkernel levelでsupportを切っているため。明示的に使っていなくても切らない方がいいのかも知れない。或いは、/etc/netconfigのtcp6とudp6の行をcomment outする手もある。

何れにしてもnfsdが立ち上がるようになり、NFS clientからもmountできるようになった。

今回このような問題が発生したのは、Debianではinit daemonがsystemdに変更されたため、sysvinitに由来するscriptが既にmaintenanceされていないからと考えられる。


2018年10月19日金曜日

DDSKKで変換をcancelする時にC-gを二度押す必要があるのはannotationのせいだった

DDSKKでannotationの表示を有効にしていると、変換を取り消してかなに戻す時C-gを二度押す必要がある (時がある)。

具体的には、変換後間も無くC-gでcancelしようとすると二度押さないと戻らない。少し時間を置くと一回で戻る。

(setq skk-annotation nil)でannotationを無効にすると、一度でかなに戻る。

現在の所、これを回避するにはannotationを使わないしか方法がない。


Debian packageのdependencyをごまかして (強制的に) installする方法

*** 更新情報 ***

2018-10-22現在、Debian sidにおけるcalibreの最新版はqtbase-abi-5-11-2へ対応したversionへ更新されたので、以下の不整合は発生しない。

*** 更新情報ここまで ***


calibreというebook readerがある。

読むだけではなく、formatの変換なども行える (swiss army knife的に)多機能なsoftwareで、個人的に使えないと非常に困るのだが、先にupdateされるQt libraryへのdependencyで不整合を起こしuninstallされ (かけ)ることがままある。

最近も、Qt relatedなpackagesが更新されて、これらが提供するvirtual packageであるqtbase-abi-5-11-0がqtbase-abi-5-11-2へ上がった。calibreの実体programを提供するpackageであるcalibre-bin 3.32.0_dfsg-1+b1はqtbase-abi-5-11-0にdependしているため不整合を起こしてuninstallされかけた。

calibreを新しいQtとlinkしてbuildした上でcontrolを修正するのが最も真っ当な方法だが、たかが5.11.0 → 5.11.2の変化ならどうにかなるだろう、という根拠のない推測からdependencyをごまかしてuninstallされないようにした。実際、calibreは無事立ち上がり、特に問題なく動作しているので、ひとまずこの状態で使ってみる。

無論、ABIのversionが変わっている以上互換性は保証されず、強制的にinstallしても動作しなかったり、意図しない動作になったりする可能性があるので注意。

やり方の概要


以前にも同じようなことをした記憶があったので検索してみた所、

cf. https://typeinf-memo.blogspot.com/2015/08/debian-unstable-sidexperimental.html

に似たような記事を書いていた。

前回はcontrolから不要なdependencyを削除していたが、今回もやることは余り変わらない (今回はversionを書き換えるだけ)。

* binary packageをdownloadして展開
* control.tar.xzを展開してcontrolを書き換える
* 改編したcontrolを含むcontrol.tar.xzを生成
* 変更したcontrol.tar.xzを含むbinary packageを生成
* installして動作確認

具体的な手順


* calibre-binのbinary packageをdownload

% apt-get download calibre-bin

* arでbinary packageを展開

% ar x calibre-bin_3.32.0_dfsg-1+b1_amd64.deb

control.tar.xz、data.tar.xz、debian-binaryが生成される。

* control.tar.xzを展開

% tar xJf control.tar.xz

control、md5sumsが生成される

* 適当なtext editor (vimなど)でcontrolを書き換える。今回の場合"qtbase-abi-5-11-0"を"qtbase-abi-5-11-2"へ書き換えて保存する

* 書き換えたcontrolを含むcontrol.tar.xzを作る

% tar --create --file control.tar.xz --xz md5sums control

* 作り直したcontrol.tar.xzを含むbinary packageを生成する

% ar rcs calibre-bin_3.32.0_dfsg-1+b1_amd64.deb debian-binary control.tar.xz data.tar.xz

* dpkg -iでinstallし動作確認

% sudo dpkg -i calibre-bin_3.32.0_dfsg-1+b1_amd64.deb

* aptitudeなどを使っている場合はupdateによる書き換えを防ぐためにcalibre-binをholdしておくとよい

おつかれさまでした。

2018年10月15日月曜日

SwissMicros DM42のfirmwareがv3.11へ更新され、USB接続時のfreezeが解消された

SwissMicros DM42のfirmware updateに伴って、USB cableを接続するとfreezeするというtroubleが発生していた (cf. https://typeinf-memo.blogspot.com/2018/09/swissmicros-dm42usbtrouble.html)が、DMCP v3.11のreleaseに伴い遂に解決された。

DMCP v3.11: 2018-10-11
Fix for "Bug when connecting to USB cable"



Firmwareをupdateするには:

* DM42のinternal FAT diskにfirmwareを転送しmenuからupgradeする
* PCに接続してdfu-utilなどでupgradeする

以上2つの方法があるが、USB cableを接続してfreezeする場合はどちらも使えない。

但し、裏蓋を外してRESETとPGM buttonsを露出させれば、freeze bugに関係なくbootloader modeを強制でき、dfu-utilでfirmwareをupdateできる。

具体的な方法については過去記事を参照のこと:

Shuttle SZ170R8のBIOS update (v2.10→v2.11)

2018-10-08にreleaseされたBIOS v2.11にupdateした。

cf. BIOS v.210 cf. [Shuttle Global - SZ170R8](http://global.shuttle.com/main/productsDownload?productId=1995)

更新内容はCPUのmicrocodeのupdate。

Update手順については過去記事を参照のこと (cf. https://typeinf-memo.blogspot.com/2018/04/shuttle-sz170r8bios-uefi.html)。

2018年10月8日月曜日

Raspbianのawkがsegfaultを吐いた

atで登録しているcommandが失敗していたので何が起こったのかと調べてみた所、awkがsegmentation faultを起こしていると分かった。

試してに実行してみると:

% awk --version
awk: fatal error: internal error: segfault
zsh: abort      awk --version

以前、sudoがsegvったことを思い出し (cf. https://typeinf-memo.blogspot.com/2018/06/watchdograspiansudofork-bombreboot.html)、取り敢えずrebootをかけてみたら直った。

2018年10月5日金曜日

SwissMicros DM42のfirmware v3.10がreleaseされた (2018-10-15更新)

*** 更新情報 ***

v3.11でUSB cableを繋いだ際に発生するfreezeは解消された cf. https://typeinf-memo.blogspot.com/2018/10/swissmicros-dm42firmwarev311usbfreeze.html

*** 更新情報は以上 ***


DM42のDMCP v3.10がreleaseされていたのでupdateした。

なお、v3.9.1 → v3.10へupdate後も、所持している個体ではUSB cableを繋ぐとerror messageが出てfreezeする症状は発現する。