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

2019年5月18日土曜日

grepでnull character (\x00)を検索する

Raspberry Pi 3で気温・湿度・気圧センサからのデータを記録しているCSVに時折null byteが混じってCSV readerがerrorを吐くので、それを効率的に発見するために調べてみた。せめてPythonのCSV moduleが行番号とか知らせてくれれば良いのに……。

% grep -Pa '\x00' FILE

Optionsの解説:

* -P → patternをPCRE (Perl compatible regular expression)として解釈する
* -a → 指定されたfileをtext fileと見做して処理する

CSV fileが大きいためか-a optionなしだとbinary fileとして該当部分を表示してくれないことがある。

参考にしたURI

cf. [linux - Find files with non-printing characters (null bytes) - Stack Overflow](https://stackoverflow.com/questions/54131197/find-files-with-non-printing-characters-null-bytes)

2019年5月6日月曜日

パスコードでロックされたiPad mini 2をfirmware等の入れ直しで復旧する

これは何?


パスコードロックされた状態のiPad mini 2 (以下、iPad)を、idevicerestoreというtoolで初期化し、Windows 10のiTunesを使ってiOS 12.2にupdate後、新しいApple IDと紐付けた時の記録。

動機と目的


iPad mini 2を譲り受けた。先方で本体内データは削除済みとのことで早速自分のApple IDに紐付けしようとしたが、パスコードを要求されてしまった。先方と相談しながら思い当たるパスコードを入力したのだが結局分からず、最終的に「このiPadは使用不可能」な状態 (=パスコードロック)に陥る。

色々調べてみると、idevicerestoreというtoolでLinux boxからfirmwareなどを書き込んで強制的に初期化&パスコードロック解除できる (勿論内部のデータは消える)と分かったので試してみた。

用意するもの


* Apple iPad mini 2
* USB-A to Lightning cable
* Linux box (w/ Debian GNU/Linux) ※idevicerestoreを利用するためのmachine
* Windows box (w/ Microsoft Windows 10) ※iTunesを利用するためのmachine

手順


idevicerestoreのinstall


Linux boxにidevicerestoreをinstallする

* libusb-devやlibimobiledevice-*あたりをinstallしておく
* idevicerestoreがdependしているlibirecoveryをinstall
* idevicerestoreをinstall

iPadの強制再起動


* Linux boxにiPadを接続する
* iPadをホームボタン+スリープボタン同時長押しで強制再起動する

idevicerestoreでiPadにfirmwareを書き込む


* sudo idevicerestore -l -n ※iPadを認識するかを確認する
* sudo idevicerestore -l -x ※basebandをupdateしない (-x)

iTunesでiPadのiOSをupdateする


iPad単独でもiOSをupdateできるはず、もしくはiTunesでなくてもupdateできるらしいが今回は試していないので割愛。

* Windows 10 machineにApple iTunesをinstallする
* iTunesを立ち上げる
* iPadをWindows boxに接続する
* iTunesがiPadを認識したかを確認し、updateなどに関するwindowが出るのを待つ
* 必要に応じてupdateなどを行う

補遺


* iPadのデータを消したくない場合は別の方法を取る必要がある
* 有料のツールを使うのも手。3000〜4000円ぐらいからあるので、急ぎで確実に行いたいならばそちらを使うのも良いだろう

参照したwebsites


基礎知識について


* [Show UDID of iPhone Using awk, cut, grep, lsusb, sed](https://www.commandlinefu.com/commands/view/9632/show-udid-of-iphone)
* [ECID - The iPhone Wiki](https://www.theiphonewiki.com/wiki/ECID)

Softwareのrepositories


* [GitHub - libimobiledevice/idevicerestore: Restore/upgrade firmware of iOS devices](https://github.com/libimobiledevice/idevicerestore)
* [GitHub - libimobiledevice/libirecovery: Library and utility to talk to iBoot/iBSS via USB on Mac OS X, Windows, and Linux](https://github.com/libimobiledevice/libirecovery)

その他


* [Device never fully restores · Issue #124 · libimobiledevice/idevicerestore · GitHub](https://github.com/libimobiledevice/idevicerestore/issues/124) ※-x option


2019年4月5日金曜日

/tmpがdisk fullになったのに原因が不明だったのでlsofで調べた話

結論から言うと:

Linuxではopenされたfileがcloseされるまで、deleteされてもmemory上に残ってしまう。それによるdisk fullだと、lsofで調べて初めて分かった。

ちなみに、犯人 (process)がmultiprocess対応のFirefoxだったので、当該tabを閉じたら (=processを殺したら)fileがcloseされて開放された。

cf.

* [ubuntu - lsof shows tmp growing file marked as deleted - Server Fault](https://serverfault.com/questions/881501/lsof-shows-tmp-growing-file-marked-as-deleted)
* [linux - /tmp used 100% where is files? - Server Fault](https://serverfault.com/questions/488132/tmp-used-100-where-is-files)

2018年7月14日土曜日

VirtualBoxのkernel moduleをdkmsでrebuildする

*** VERR_LDRELF_RELOCATION_NOT_SUPPORTED への対応 ***

2018-07-14現在の情報: Debian unstableでVirtualBox (OSE)を利用している場合、最新版5.2.14-dfsg-4ではerrorが再発してVMを実行できない。5.2.14-dsfg-3か、testing或いはstable版を利用されたい。

以前のunstableのpackageはsnapshot.debian.orgなどから取得可能。

cf. [#902897 - virtualbox: fails to start vm (VERR_LDRELF_RELOCATION_NOT_SUPPORTED) - Debian Bug report logs](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=902897)

2018-07-16 update: 5.2.14-dfsg-5で修正された模様。

2018-07-17 update: 5.2.14-dfsg-7で(ようやく)修正された模様。


dkmsを手動で


自前でbuildしたkernelをinstallした後、VirtualBoxのkernel object (kernel module)がerrorを吐いてloadできなくなったので、手動でkernel moduleをrebuildした。通常はdkmsでkernel moduleをinstallしていれば、packageやkernelのupgradeに伴い自動でrebuildしてくれるので必要ないのだが。

手順


dkms commandを実行する際にmodule nameとかversion numberとかが必要なので、status subcommandで確認しておく。

% sudo dkms status
virtualbox, 5.2.14, 4.17.6, x86_64: installed

man dkmsを見てみるとautoinstallとかそれっぽいsubcommandがあるのだが、実行してみてもrebuildされなかったので、一旦moduleを削除してやり直してみる:

% sudo dkms remove virtualbox/5.2.14 -k 4.17.6

改めてaddし直す:

% sudo dkms add virtualbox/5.2.14 -k 4.17.6

この時点でmoduleは登録されているが、実際のbuildは行われていない。autoinstall subcommandを発行してrebuildさせてみる:

% sudo dkms autoinstall -k 4.17.6

moduleのbuildが終わるとVirtualBoxのkernel moduleがloadされるはずだが、一応serviceでrestartをかける:

% sudo service virtualbox restart


2018年6月12日火曜日

ZoLのsplがzfsのrepositoryにmergeされた

ZFSはlicenseの問題でmainline kernelに含まれずout-of-treeなので、Linuxで使いたい場合は大きく2つの選択肢がある:

* ZFS on Linux (ZoL)
* ZFS-FUSE

ZoLがkernel moduleとしてのimplementationで、ZFS-FUSEはuserland (FUSE)でのimplementation。

OSがLinuxでなくて良いならillumos (OpenSolaris)やFreeBSD (TrueOS)などを使う手もある (出所的あるいはlicense的にはこっちの方が素直か?)。

さて、この度、ZoLをsource (git)からbuildする手順が簡単になった。これまではzfsをbuildするにはspl (Solaris porting layer)というSolarisとLinuxの違いを吸収するlayerが必要で、それを別途build & installしなければならかった。

それが先日、splのgit repositoryからautogen.shが削除されていたのでどうしたのかと思いgit logを見てみたら、zfsのrepositoryにmergeされたとあった。今後はsplをgit cloneしてautogen.sh→configure→make→make installという手順が不要になった。

2018年3月11日日曜日

Seagateの12TB (≒10.91TiB) HDDを導入した

メインマシン兼NASとして使っているPCのデータストレージとして、これまではWestern DigitalのNAS向け製品であるWD RedシリーズのWD80EFZX (8TB ≒ 7.28TiB)を使っていた。これを新たにSeagateのNAS向け製品であるIronWolfシリーズのST12000VN0007 (12TB ≒ 10.91TiB)へ換装した。ここ数年はWestern DigitalのHDDばかり購入してきた (Redの6TB、8TB)ので、SeagateのHDDを購入するのは久し振りだ。

換装した一番の理由は、WD80EFZXの残り容量がほぼ無くなったこと。丁度決算期で普段より値引きが期待できる時期なのと、前回HDDを導入してから2年ほど経っているので頃合いなこともあった。

LUKS+Btrfsで運用している。RMAの兼ね合いもあるので、2年くらい持てばいいのだが。


S.M.A.R.T.の情報を見てみる


Linuxなので、smartctlを使ってみた:

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   079   068   044    Pre-fail  Always       -       74220560
  3 Spin_Up_Time            0x0003   097   097   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       2
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   068   060   045    Pre-fail  Always       -       5995223
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       15
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       2
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   064   062   040    Old_age   Always       -       36 (Min/Max 25/38)
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       2
193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       2
194 Temperature_Celsius     0x0022   036   040   000    Old_age   Always       -       36 (0 25 0 0 0)
195 Hardware_ECC_Recovered  0x001a   040   036   000    Old_age   Always       -       74220560
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0023   100   100   001    Pre-fail  Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       15 (143 172 0)
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       13528061790
242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       455020

WDのHDDと違い、SeagateのHDDでは1 Raw_Read_Error_Rateや7 Seek_Error_Rate、195 Hardware_ECC_Recoveredといった値が物凄い勢いで増加しているので、最初diskの故障を疑った。

しかし、これらのraw valueをそのまま解釈するのは無意味であり、本当に気にするべきなのは5 Reallocated_Sector_Ctや197 Current_Pending_Sector、198 Offline_Uncorrectableの値であるとの情報があった。

* [Just got a Seagate Ironwolf... are these SMART readings normal? : DataHoarder](https://www.reddit.com/r/DataHoarder/comments/61pmsb/just_got_a_seagate_ironwolf_are_these_smart/)
* [Seagate製HDDが故障する直前のsmart値 – UbuntuによるEco Linuxサーバ構築記](http://eco.senritu.net/seagate%E8%A3%BDhdd%E3%81%8C%E6%95%85%E9%9A%9C%E3%81%99%E3%82%8B%E7%9B%B4%E5%89%8D%E3%81%AEsmart%E5%80%A4/)


RAIDでもNAS専用機でもなくsingle disk換装を選んだ理由


Single disk換装を行ったのは、費用や運用の面で最も適していると考えたからだ。

他にはNASを組む (或いはNASキットを買う)、RAIDを組むなどの方法もあるが:

* 初期コストが高い (diskが複数本必要、それを格納できるケースやマザーボード或いはNAS本体、etc)
* 運用の複雑さが増す
* 電気代が増す
* 総容量が大きくなるとバックアップを取るのが難しくなる

といった問題がある。Single disk運用は、そのdiskが故障すると終わりという問題があるものの、これまで使っていたdisks (8TBと6TB)に定期的にbackupを取ることで影響をある程度緩和する方針を取る。

raidzを使い、信頼性のあるきちんとしたfile serverを構築する場合には、以下のpageが参考になるだろう:

2016年9月9日金曜日

GCC 5.x → GCC 6.xへ完全移行 @Debian Sid

Debian GNU/Linux Sidではしばらく前にdefaultのGCCが5→6になったのだが、Firefoxのbuildに不具合がありGCC 5.xを残してあった。

今日、Firefox 49 (release)をbuildしてみた所、mach packageがうまくいかない不具合が解消されていたので、晴れてGCC 5 seriesをuninstallした。

2016年9月8日木曜日

Linux kernel 4.8-rc4でZoL (2016-12-26更新)

ZFS on Linux (ZoL)を試してみたいと思い、Linux kernel 4.8-rc4 (注: 9/8現在の最新版は4.8-rc5)で実験してみた。

(2016-12-26追記)

Linux kernel 4.9.0でも利用可能。

(2016-12-03追記)

Linux kernel 4.8.12でも以下の手順でZoLを利用可能。

Installation

Debian package版ではbuildに失敗した (確か9/8現在で対応しているkernel versionは4.6が最新)ので、gitから直接build & installする。

まずはSPL (Solaris Porting Layer)から:

% git clone https://github.com/zfsonlinux/spl.git
% cd spl
% ./autogen.sh
% make
% sudo make install

ZFSも手順は同じ:

% git clone https://github.com/zfsonlinux/zfs.git
% cd zfs
% ./autogen.sh
% make
% sudo make install

これで、spl.koやzfs.koなどのkernel modulesや、zfs、zpool、zdb commandsなどがinstallされるはず。

もしかしたら、buildの際にlibzfsとかのdevelopment package (header file)が必要かも知れない。

Pool作り

まず、zfs関連のkernel moduleをmodprobeして突っ込む。

% sudo modprobe zfs

多分、自動的にdependencyが解決されてsplとかも突っ込まれるはず。

% lsmod | grep zfs

あたりでcheckする。

% sudo zpool create -o ashift=12 -f -m <mount_point> <pool> <disks>

Poolが作られると自動的にmountされる。

ちなみに、最近のHDDはAFTを使っていると思うのでその場合はashift=12を指定すると速くなるとのこと。

zdbが"no such file or directory"を吐く問題

必要な(?) cache fileがgenerateされていないのが原因っぽい。Package systemとかDKMSとかで入れれば何かしらのscriptで自動生成されたりするんだろうか?

% sudo mkdir /etc/zfs/
% sudo zpool set cachefile=/etc/zfs/zpool.cache <pool>

これでgenerateされたので、後は好き放題zdbを使えるはず。

% sudo zdb -C -U /etc/zfs/zpool.cache <pool>

でも、

% sudo zdb -S -U /etc/zfs/zpool.cache <pool>

でもissueし放題。

cf. [FAQ · zfsonlinux/zfs Wiki · GitHub](https://github.com/zfsonlinux/zfs/wiki/faq)

In-band deduplication

ZFSを使う利点 (というか動機)にもなるであろうdeduplication (重複排除)だが、

どんなdataを抱えているかにもよるが、一度zdb -Sでどのくらい節約できるかを見てみると良い。ratioが2を割るようであれば無駄かなと。何しろ仕組み上ものすごく時間が掛かるし、diskに負荷も掛かるので。

cf. [How To Size Main Memory for ZFS Deduplication](http://www.oracle.com/technetwork/articles/servers-storage-admin/o11-113-size-zfs-dedup-1354231.html)

2016年7月7日木曜日

SwissMicros DM15Lのfirmware upgrade (2018-09-05更新)

(更新履歴)

* 2020-01-17: V30が公開された
* 2019-06-05: V29が公開された
* 2018-09-05: V27が公開された
* 2018-03-26: V26が公開された
* 2017-12-26: V24が公開された
* 2017-06-14: V23が公開された

(更新履歴ここまで)


2016-03-03にSwissMicros DM15L (RPNなscientific calculatorであるHP-15Cのclone)のfirmware V21が公開されていたことに今更気付いたのでupgradeしてみた。

必要な道具やsoftware


DM15Lのfirmware upgradeをLinux boxで行うには、以下の準備が必要:

* Linux kernelに"CP201x USB to UART Bridge VCP driver" (3.3以降in-tree)を組み込む
* lpc21ispをinstall (In-circuit programming (ISP) of ARM and Cortex microcontrollers)
* Latest firmware (自分の場合はDM15_M1B_21.hex)をdownload

DM15L側は:

* 背面のRESET buttonを押す為の爪楊枝
* PCとDM15Lを接続する為のUSB cable (多分Type-A 〜 mini-B)

環境

(2016-03-03)

* Linux box (ASUS X200LA)
* Linux kernel 4.6.3
* Debian GNU/Linux Sid
* SwissMicros DM15L (DM15 M1B V19)

(2017-06-14)

* Linux box (Shuttle SZ170R8)
* Linux kernel 4.11.3
* Debian GNU/Linux Sid
* SwissMicros DM15L (DM15 M1B V21)

手順


https://www.swissmicros.com/firmware.phpの"Firmware upgrade under Linux"に解説されている。

Upgrade操作により、DM15L内のprogramやregisterの内容は消えてしまうので注意。ただ、firmware upgradeに失敗してもDM15Lが使えなくなったりはしない (所謂「文鎮化」しない)とのこと。

> Don't worry, it is not possible to break or brick the calculator with this or any other upgrade procedure.

実際の手順


* Linux kernelにCP210x USB to UART Bridge VCP driverを組み込む
  + Device drivers → USB support → USB Serial Converter support → USB CP210x family of UART Bridge Controllers
  + Kernelをrebuild → installしてreboot
* Latest firmwareをdownload
* USB cableでDM15LとLinux boxを接続
* dmesgで確認すると/dev/ttyUSB0とかそれっぽいdeviceが検出されているはず
* sudo lpc21isp DM15_M1B_V21.hex /dev/ttyUSB0 115200 12000
* "Synchronizing"とmessageが出ている間にDM15Lの背面にあるRESETを押す
* flashが終わったらcableを外してもう一度DM15LのRESETを押す

(2017-06-14追記)

DM15Lはこんな感じで認識された:

% dmesg
...
[695628.530638] usb 1-5: new full-speed USB device number 9 using xhci_hcd
[695628.700180] usb 1-5: New USB device found, idVendor=10c4, idProduct=ea60
[695628.700181] usb 1-5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[695628.700183] usb 1-5: Product: CP2102 USB to UART Bridge Controller
[695628.700183] usb 1-5: Manufacturer: Silicon Labs
[695628.700184] usb 1-5: SerialNumber: 0001
[695628.709685] usbcore: registered new interface driver cp210x
[695628.709692] usbserial: USB Serial support registered for cp210x
[695628.709707] cp210x 1-5:1.0: cp210x converter detected
[695628.711611] usb 1-5: cp210x converter now attached to ttyUSB0

実際の手順のlog (firmwareは~/Downloadsにある)

% sudo lpc21isp Downloads/DM15_M1B_23.hex /dev/ttyUSB0 115200 12000
lpc21isp version 1.97
File Downloads/DM15_M1B_23.hex:
        loaded...
        converted to binary format...
        image size : 39283
Image size : 39283
Warning:  data not aligned to 32 bits, padded (length was 9973, now 9974)
Synchronizing (ESC to abort).......... OK
Read bootcode version: 2
7
Read part ID: LPC1115.../303, 64 kiB FLASH / 8 kiB SRAM (0x00050080)
Will start programming at Sector 1 if possible, and conclude with Sector 0 to ensure that checksum is written last.
Erasing sector 0 first, to invalidate checksum. OK
Sector 1: ...............................................................................................
Sector 2: ...............................................................................................
Sector 3: ...............................................................................................
Sector 4: ...............................................................................................
Sector 5: ...............................................................................................
Sector 6: ...............................................................................................
Sector 7: ...............................................................................................
Sector 8: ...............................................................................................
Sector 9: ...........................................................
Sector 0: ..............................................................................................
Download Finished... taking 6 seconds
Now launching the brand new code

Documentされていなかった事柄


DM15LのRESETを押すと最後に"PR Error"が出るが、これは"HP-15C Owner's Handbook"にある通り正常な反応。一度offにしてもう一度電源を入れ直すと正常に使える。ちなみに"PR Error"はprogram errorではなくてpower error。

> Pr Error
> Continuous Memory interrupted and reset because of power failure.

cf. 208 Appendix A: Error Conditions - HP-15C Owner's Handbook

2016年6月1日水曜日

Linux kernel 4.7-rc1をmake-kpkgでbuildする

概要

Linux kernel 4.7-rc1がreleaseされたが、buildでコケた。

Build environment

* Intel Core i7-6700K + DDR4 64GByte
* Debian Sid / Experimental
* gcc.real (Debian 6.1.1-4) 6.1.1 20160519
* Linux 4.7-rc1 (from Git)
* time (MAKEFLAGS= DEBIAN_BUILDARCH=native CONCURRENCY_LEVEL=8 CC='ccache gcc' CXX='ccache g++' fakeroot make-kpkg --initrd kernel_image)

error message

いつも通り、早速make-kpkgでbuildを試みたのだが、見事にコケた:

>   CC      arch/x86/boot/edd.o
> /tmp/ccENSHy1.s: Assembler messages:
> /tmp/ccENSHy1.s:35: Error: instruction `shlx' isn't supported in 16-bit mode.
> /tmp/ccENSHy1.s:39: Error: instruction `andn' isn't supported in 16-bit mode.
>   CC      arch/x86/boot/main.o
> scripts/Makefile.build:289: recipe for target 'arch/x86/boot/cpucheck.o' failed
> make[2]: *** [arch/x86/boot/cpucheck.o] Error 1
> make[2]: *** Waiting for unfinished jobs....

見ての通り、16bit modeでsupportされていないinstructionが使われている。

workaround

arch/x86/以下にあるcodeは-m32でcompileされるんじゃないのかな?と思い、関係しているであろうarch/x86/boot/Makefile@68を編集 (-m32を追加):

KBUILD_CFLAGS   := $(USERINCLUDE) $(REALMODE_CFLAGS) -D_SETUP
KBUILD_CFLAGS   := $(USERINCLUDE) $(REALMODE_CFLAGS) -D_SETUP -m32

これでbuildは通ったが、本当にこんなworkaroundで大丈夫なのかは不明。

ちなみに、Linux 4.6では全く同じ環境でbuildが通っているので、Linux 4.7で色々変わった関係だろう。

2016年3月28日月曜日

PulseAudioのloopback moduleを使う

Loginした時にmodule-loopbackがloadされるように設定した。

  • /etc/pulse/default.paをcopyする
  • loopback moduleの設定を加える

具体例

motherboard内蔵のIntel HD Audioで、line-in → line-outへ音声を流す設定 (~/.config/pulse/default.paの最後の部分):

> ...
> ### loopback
> .ifexists module-loopback.so
> load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo sink=alsa_output.pci-0000_00_1b.0.analog-stereo
> .endif

module-loopbackへのparamterはsourceが入力元、sinkが出力先。これらはindex numberか (長い) unique nameで指定できる。Deviceの認識順とかでindexは変化するみたいなので、nameで指定しておいた。

unique nameやindexはpactl listやpacmd list-sources、pacmd list-sinksで表示できる。

参考リンク


Debian Sid + Linux 4.6-rc1でPlanex GW-450D KATANAを使う

Google等で検索すると既に様々な方が実施されているのだが、GCC 6だからなのか、それともLinux kernelが4.6rc1だからなのか、そのままではdriverがbuildできなかったのでメモしておく。

全体の流れ

  • x86_64対応のdriverをdownloadし展開して修正する
    • tarballを展開するかgit clone
    • Makefileに変更: CHIPSETへ追加、LINUX_SRCの変更
    • common/utusb_dev_id.cへUSB_DEVICE_ID追加
    • conf/RT2870STA.datを修正
    • os/linux/config.mkを修正 (-Wno-error=incompatible-pointer-types)
    • os/linux/rt_linux.cを修正 (__vfs_read, __vfs_writeへ変更)
  • Kernelの修正とrebuild (CONFIG_WIRELESS_EXT=y, CONFIG_WEXT_PRIV=y)
  • buildしてinstall
    • make
    • make install (もしくは手動でcopy)
    • depmod -a
  • Debian specificなnetworkの設定 (or NetworkManagerやwicdで設定する)
    • /etc/Wireless/RT2870STA/RT2870STA.datの調整
    • /etc/networking/interfacesの変更
    • modprobe mt7650u_sta
    • service networking restart

今回遭遇した問題

主にdriverのbuildに際して問題があった。

  • incompatible-pointer-typesのwarningがerror扱いされてbuildが止まる
  • net_device、iw_handler_defなどstructの初期化を行う部分でerrorが出る

incompatible-pointer-types対策

1つ目のincompatible-pointer-typesに関しては、gccに-Wno-error=incompatible-pointer-typesを渡して見逃してもらった。os/linux/rt_linux.cのWFLAGSに直接書き込むという力技を使ったが、たぶんもっと適切な場所 (もしくは方法)があると思う。

unknown field対策

2つ目のstructの初期化 (designated initializer)に関しては、kernel moduleとしてbuildする際に見ているLinux kernelの設定に問題があった。

具体的には"error: unknown field 'private' specified in initializer"といったerrorが出るのだが、kernel sourceの側で必要なsymbolを有効にしていないのが原因だった。必要なのはCONFIG_WIRELESS_EXTとCONFIG_WEXT_PRIV。

これらはmake menuconfigで'/'を使って調べると出て来るが、依存関係の問題なのか有効にできなかったのでnet/wireless/Kconfigを直接編集して対応。make oldconfigを実行して.configに2つが=yで出力されているのを確認して、kernelをrebuild & install。

以上でdriver (mt7650u_sta.ko)をbuildできる。

Pitfalls


  • 普段楽をしてmake-kpkgでkernel packageをbuildしているので、driverをinstallした後にdepmod -aを忘れていた
  • SSIDがstealthなので/etc/networking/interfacesあたりにap_scan=1とかssid_scan=1を設定する必要があった

追記

Rebootが必要とあるが、本当に必要なのはkernelでCONFIG_WIRELESS_EXTとCONFIG_WEXT_PRIVが有効になっていない場合に新しくbuildしたkernelに切り替える時だけで、後はservice networking restartとかmodprobe (-r) mt7650u_staでどうにかなる。


参考リンク

Driverのsource code


GW-460DをLinuxで使う方法について



Buildに必要なLinux kernelの設定について


/etc/Wireless/RT2870STA/RT2870STA.datの読み込みに失敗する問題への対策


Cのdesignated initializerについて




2016年3月27日日曜日

Linux kernel 4.6-rc1をdebianでbuildする

Linux kernel 4.6-rc1がreleaseされたので、早速make-kpkgでbuildしようとしたら……

> In file included from arch/x86/decode.c:26:0:
> arch/x86/../../elf.h:22:18: fatal error: gelf.h: No such file or directory
>  #include <gelf.h>
>                   ^
> compilation terminated.

gelf.h……?

今までこんなerrorは出ていなかったので検索してみた所:

> I guess your system didn't install libelf library.

cf. [compiling error gelf.h · Issue #34 · ktap/ktap · GitHub](https://github.com/ktap/ktap/issues/34)

なる記述を発見。取り敢えずaptitudeでlibelf-devというpackageをinstallしたら解決した。

なお、Debian experimentalに入っているgcc-6 seriesで無事buildできたことを申し添えたい。

2016年3月10日木曜日

Debian GNU/LinuxでUSB3.0なGigabit Ethernet

LogitechのLAN-GTJU3というUSB3.0のnetwork adapterを使ってみた。

何故か100Mbpsまでしか有効にならず色々と試してみたのだが、switching hubのportを別の場所に変更したら1000Mbpsが有効になった。

理由はよく分からないが、想像するに、元々100Mbpsのadapterが接続されていたportだったので、switching hub側が「100Mbpsまで」と記憶していたのが問題なんじゃないかと。