speedtest.netがcliで利用できるspeedtest-cliを試す

九里 真夏 @orumin そういえば speedtest.net って Linux の CLI client もありますね。

ってことでLinuxのcliで動くPython製のspeedtest-cliをちょっと試してみた.

speedtest.netでの回線速度計測をcliで行えます.python製でpipとかで各種環境に導入可能.

Debianだとjessie以降all, Ubuntuだと16.04LTS以降allにpkgもあるのでapt一発で入るし,Raspberry PiなどのARMアーキテクチャなんかでも問題なく動きました.

規定値の動作はipからロケーション拾ってそこから近いサーバーで計測した結果を返すようです.
自宅のipアドレスでの自動判定では静岡になってたので手動で計測サーバを変更して鹿児島と東京を試しました.

help

$ speedtest-cli -h
usage: speedtest-cli [-h] [--bytes] [--share] [--simple] [--list]
[--server SERVER] [--mini MINI] [--source SOURCE]
[--timeout TIMEOUT] [--secure] [--version]

Command line interface for testing internet bandwidth using speedtest.net.
--------------------------------------------------------------------------
https://github.com/sivel/speedtest-cli

optional arguments:
-h, --help show this help message and exit
--bytes Display values in bytes instead of bits. Does not affect
the image generated by --share
--share Generate and provide a URL to the speedtest.net share
results image
--simple Suppress verbose output, only show basic information
--list Display a list of speedtest.net servers sorted by
distance
--server SERVER Specify a server ID to test against
--mini MINI URL of the Speedtest Mini server
--source SOURCE Source IP address to bind to
--timeout TIMEOUT HTTP timeout in seconds. Default 10
--secure Use HTTPS instead of HTTP when communicating with
speedtest.net operated servers
--version Show the version number and exit

規定値では自宅は静岡になっていて静岡サーバで計測する(実際は鹿児島)

$ speedtest-cli
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from FreeBit (180.131.110.140)...
Selecting best server based on latency...
Hosted by ClickL Network (Shizuoka) [0.02 km]: 110.464 ms
Testing download speed........................................
Download: 2.07 Mbit/s
Testing upload speed..................................................
Upload: 0.92 Mbit/s

日本のサーバを確認する

$ speedtest-cli --list|grep -i japan
14180) ClickL Network (Shizuoka, Japan) [0.02 km]
8407) Allied Telesis Capital Corporation (Sagamihara, Japan) [111.58 km]
6087) Allied Telesis Capital Corporation (Fussa-shi, Japan) [120.41 km]
6508) at2wn (Yokohama, Japan) [125.30 km]
7510) ASEINet (Tokyo, Japan) [141.71 km]
12546) TB (Tokyo, Japan) [141.71 km]
12511) h3zjp (Nerima, Japan) [142.66 km]
8348) Foxcore-LS (Sodegaura, Japan) [167.71 km]
7139) SoftEther Corporation (Tsukuba, Japan) [192.41 km]
6368) gatolabo (Maibara, Japan) [194.62 km]
6766) JAIST(ino-lab) (Nomi, Japan) [232.28 km]
13641) NextechNetworkSolutions (Nara, Japan) [237.53 km]
6476) rxy (individual) (Osaka, Japan) [264.80 km]
8832) prize3046 (Ikeda, Japan) [269.86 km]
8193) kamiari (Sendai, Japan) [427.67 km]
7976) denpa893 (Hikari, Japan) [601.03 km]
6405) Allied Telesis Capital Corporation (Misawa, Japan) [686.38 km]
13568) KSL (Kagoshima, Japan) [820.38 km]
811) GLBB Japan KK (Chatan, Japan) [1397.84 km]
6581) haza (Haebaru, Japan) [1410.56 km]

鹿児島サーバで計測してみる

$ speedtest-cli --server 13568
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from FreeBit (180.131.110.140)...
Hosted by KSL (Kagoshima) [820.38 km]: 103.499 ms
Testing download speed........................................
Download: 2.20 Mbit/s
Testing upload speed..................................................
Upload: 0.92 Mbit/s

東京を–simple optionで計測してみる

$ speedtest-cli --simple --server 7510
Ping: 150.627 ms
Download: 1.88 Mbit/s
Upload: 0.84 Mbit/s

サーバの数を確認してみる

$ speedtest-cli --list | wc -l
6509

speedtestはJavaScriptやAdobe Flashが必要なことが多くてヘッドレス環境などでは面倒でした.
iperfやnetcatなんかはお手軽ですが,速度テスト先のサーバの用意が必要です.

今回のspeedtest-cliはお手軽に導入できて世界各地のサーバ相手にcliでspeed testも出来ていい感じです.

ディスクイメージのデバイスマップが簡単に作れるkpartxを試す

以下のページでkpartxというディスクのデバイスマップを作るコマンドがあるのを知りました

そこでまず、kpartxを使って各パーティションのデバイスマップを作ります。
$ sudo /sbin/kpartx -av /opt/atde3-20100309.img
add map loop2p1 : 0 497952 linear /dev/loop2 63
add map loop2p2 : 0 33045705 linear /dev/loop2 498015
$ ls /dev/mapper/
control loop2p1 loop2p2
これでディスクイメージの各物理パーティションに対応したデバイスマップができました。fdiskで見えていたパーティションはそれぞれ、/dev/mapper/loop2p1 /dev/mapper/loop2p2 として参照できるようになっています。

これまでは以下のページのようにfdiskコマンドでパーティション情報を確認してmount時にoffsetを指定していました.

kpartxを使うとこの作業が簡単になりそうなので試してみました.

Debian sid amd64ではそのままkpartxパッケージだったのでこれを導入します.(Ubuntu 17.04 amd64でも同様でした.)

$ sudo apt install kpartx

丁度Raspbian jessie 2017-04-10が出たのでこれで試してみます.

$ unzip -l 2017-04-10-raspbian-jessie-lite.zip 
Archive:  2017-04-10-raspbian-jessie-lite.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
1297862656  2017-04-10 18:58   2017-04-10-raspbian-jessie-lite.img
---------                     -------
1297862656                     1 file
$ time unzip 2017-04-10-raspbian-jessie-lite.zip
Archive:  2017-04-10-raspbian-jessie-lite.zip
  inflating: 2017-04-10-raspbian-jessie-lite.img  

real    2m58.438s
user    0m27.512s
sys     0m2.132s
 sudo /sbin/kpartx -av 2017-04-10-raspbian-jessie-lite.img
add map loop0p1 (254:3): 0 83968 linear 7:0 8192
add map loop0p2 (254:4): 0 2442728 linear 7:0 92160
$ ls -lA /dev/mapper/
合計 0
crw------- 1 root root 10, 236  4月 11 23:37 control
lrwxrwxrwx 1 root root       7  4月 12 06:07 loop0p1 -> ../dm-3
lrwxrwxrwx 1 root root       7  4月 12 06:07 loop0p2 -> ../dm-4
lrwxrwxrwx 1 root root       7  4月 11 23:37 sda3_crypt -> ../dm-0
lrwxrwxrwx 1 root root       7  4月 11 23:37 x220--vg-root -> ../dm-1
lrwxrwxrwx 1 root root       7  4月 11 23:37 x220--vg-swap_1 -> ../dm-2

デバイスマッピングされています.これで簡単にmount出来ました.

$ sudo mount -o ro /dev/mapper/loop0p1 /media/mk/pi-boot
$ sudo mount -o ro /dev/mapper/loop0p2 /media/mk/pi-root/
$ mount | grep /dev/mapper/loop0p
/dev/mapper/loop0p1 on /media/mk/pi-boot type vfat (ro,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
/dev/mapper/loop0p2 on /media/mk/pi-root type ext4 (ro,relatime,data=ordered)
$ ls /media/mk/pi-boot
COPYING.linux     bcm2708-rpi-0-w.dtb     bcm2708-rpi-cm.dtb   bcm2710-rpi-cm3.dtb  config.txt    fixup_db.dat  kernel.img   start.elf     start_x.elf
LICENCE.broadcom  bcm2708-rpi-b-plus.dtb  bcm2709-rpi-2-b.dtb  bootcode.bin         fixup.dat     fixup_x.dat   kernel7.img  start_cd.elf
LICENSE.oracle    bcm2708-rpi-b.dtb       bcm2710-rpi-3-b.dtb  cmdline.txt          fixup_cd.dat  issue.txt     overlays     start_db.elf
$ ls /media/mk/pi-root
bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

そしてchrootしてみたり

$ sudo mount -o remount,rw /media/mk/pi-root
$ sudo cp -p /usr/bin/qemu-arm-static /media/mk/pi-root/usr/bin
$ sudo chroot /media/mk/pi-root/ /bin/bash
# dpkg --get-selections "*" | wc -l
427

アンマウントして元に戻します.

# exit
$ sudo umount /media/mk/pi-*
$ sudo kpartx -d /dev/mapper/loop0p1
$ sudo kpartx -d /dev/mapper/loop0p2
$ rm ./2017-04-10-raspbian-jessie-lite.img

便利ですね :)
後は圧縮ファイルをそのまま使えると便利なんですがムリカナ?

OsMoのTripページからGPXを入手するメモ

土日に撮った写真にジオタグをつけようとそのときロギングしていたGPSのログを吸い出そうとしたら見当たりません.GPSロガーの設定がいつの間にかログを保存しない設定になっていました.ボタン部分のゴム部分に穴が開いてしまって防水ではなくなったので土曜の雨の時カバンに入れていたのでそのときにキーロックし忘れて設定が変わったのかもしれません.

AndroidスマホでOsMoDroidも動作させていたのでこれがログを残していないかと見てみると古いものしかありません.

$ jmtpfs android/
$ ls -ltrA android/内部ストレージ/OsMoDroid | tail -1
-rw-r--r--  1 mk mk  803382  2月 25 21:35 20170225070457.gpx
$ find android -iname "*osmo*"
android/内部ストレージ/osmand/tracks/osmo
android/内部ストレージ/OsMoDroid
android/SDカード/Android/obb/net.osmand.plus/tracks/osmo
$ ls -ltrA android/内部ストレージ/OsMoDroid/ | tail -1
-rw-r--r-- 1 mk mk  803382  2月 25 21:35 20170225070457.gpx

自動的に生成されるTripページにルートが表示されるのでこれが取得できないかソースを見てみました.

それっぽいURLをこんな感じで抜き出して,

$ w3m -dump_source 'https://osmo.mobi/h/d8VhsthhuF9rpEDUCNXjOhHxJHdmiNQNRsoR4AEmpF' | sed -n "s/^.*getJSON('\([^']*\)'.*$/\1/p"
https://api.osmo.mobi/session_get?url=d8VhsthhuF9rpEDUCNXjOhHxJHdmiNQNRsoR4AEmpF&mode=

そのurlの中を見るとJSONでGPXの項目があるのでjqで抜き出す

$ w3m -dump_source 'https://osmo.mobi/h/d8VhsthhuF9rpEDUCNXjOhHxJHdmiNQNRsoR4AEmpF' | sed -n "s/^.*getJSON('\([^']*\)'.*$/\1/p" | jq -r .gpx
https://st.osmo.mobi/htg/d/8/V/hsthhuF9rpEDUCNXjOhHxJHdmiNQNRsoR4AEmpF.gpx

これをDLするとGPXだった.

$ wget https://st.osmo.mobi/htg/d/8/V/hsthhuF9rpEDUCNXjOhHxJHdmiNQNRsoR4AEmpF.gpx

繋げるとこんな感じ

$ w3m -dump_source 'https://osmo.mobi/h/d8VhsthhuF9rpEDUCNXjOhHxJHdmiNQNRsoR4AEmpF' | sed -n "s/^.*getJSON('\([^']*\)'.*$/\1/p" | xargs w3m -dump_source | jq -r .gpx | wget -i -

GPX Viewerで開こうとするとファイルオープン画面から帰ってこなかったですが,GpsPruneだと開けました.ちょっと荒いけど無いよりは全然いいですね.

20170411_01:04:30-17480

etckeeperのmanに載っているREADMEを読もうと思ったら無い

Debian sid amd64のetckeeperのmanに載っているREADMEを読もうと思ったらそんなファイルは無い.

$ man etckeeper | grep -B1 README
SEE ALSO
       /usr/share/doc/etckeeper/README.md.gz
$ lv /usr/share/doc/etckeeper/README.md.gz
/usr/share/doc/etckeeper/README.md.gz: No such file or directory
$ ls -lA /usr/share/doc/etckeeper/
合計 40
-rw-r--r-- 1 root root  4679  7月 18  2016 README.mdwn.gz
-rw-r--r-- 1 root root 11645  8月  2  2016 changelog.Debian.gz
-rw-r--r-- 1 root root  1785  7月 18  2016 copyright
-rw-r--r-- 1 root root   948  7月 18  2016 index.mdwn
-rw-r--r-- 1 root root   483  7月 18  2016 install.mdwn
-rw-r--r-- 1 root root    55  7月 18  2016 news.mdwn
-rw-r--r-- 1 root root   309  7月 18  2016 todo.mdwn
$ dpkg -L etckeeper | grep README
/etc/etckeeper/commit.d/README
/etc/etckeeper/init.d/README
/etc/etckeeper/post-install.d/README
/etc/etckeeper/pre-commit.d/README
/etc/etckeeper/pre-install.d/README
/etc/etckeeper/unclean.d/README
/etc/etckeeper/uninit.d/README
/etc/etckeeper/update-ignore.d/README
/usr/share/doc/etckeeper/README.mdwn.gz
$ dpkg-query -W etckeeper
etckeeper       1.18.5-1

/usr/share/doc/etckeeper/README.mdwn.gzが内容からしてそれぽい.
バグぽいので報告しようかと思って既存のバグを眺めると既に報告されて上流で修正済みのようでした.

バックライト制御コマンドのybacklight

awesome wmでバックライトの制御にxbacklightコマンドを使っていたのですが,手元のDebian sid amd64環境ではNo outputs have backlight propertyというエラーで現在利用できなくなっています.

$ xbacklight -get
No outputs have backlight property
$ xbacklight = 100
No outputs have backlight property
$ xbacklight + 10
No outputs have backlight property
$ xbacklight - 10
No outputs have backlight property

workaroundとしてこんな感じで手で叩いていてちょっとあれです.持ち出さないPCなのであまり操作しないのでどうにかなってるけど不便です.

$ sudo sh -c "echo 1000 > /sys/class/backlight/intel_backlight/brightness"

しかし,gdm3のログイン画面ではFn+Home/Fm+Endでバックライトの変更が出来ることに気づきました.
なんか進展あったのかな?とバグレポを眺めているとそれらしいものは見つからないけれど,

ybacklightというものが紹介されているのに気づきました.

利用方法はxbacklightと同じです.

$ ybacklight -h
Usage: /home/mk/bin/ybacklight [options]
  Options:
  -d <driver> or -driver <driver>: Use driver <driver> (NB: -display is
                                   also supported for compatibility)
  -help: Print this help
  -set <percentage> or = <percentage>: Set backlight to <percentage>
  -inc <percentage> or + <percentage>: Increase backlight by <percentage>
  -dec <percentage> or - <percentage>: Decrease backlight by <percentage>
  -get: Get backlight percentage
  -time <ignored> or -steps <ignored>: Unsupported, ignored
  -v: Verbose output

読むのはいけますが,変更は出来ません.

$ ybacklight -get
30
$ ybacklight +10
Permissions conflict.  Can't write to: ( /sys/class/backlight/intel_backlight/brightness )

/sys/class/backlight/intel_backlight/brightnessに書き込み権をつけると行けます.

$ ls -l /sys/class/backlight/intel_backlight/brightness
-rw-r--r-- 1 root root 4096  4月  5 06:48 /sys/class/backlight/intel_backlight/brightness
$ sudo chmod o+w /sys/class/backlight/intel_backlight/brightness
$ ls -l /sys/class/backlight/intel_backlight/brightness
-rw-r--rw- 1 root root 4096  4月  5 06:48 /sys/class/backlight/intel_backlight/brightness
$ ybacklight +10
40
$ ybacklight -10
30

ちょっと微妙.

gdm3でユーザーリストの非表示が無効になっていたのを調べる

Debian sid amd64のgdm3の画面でユーザーリストを表示しないようにしていたのですが,表示されるようになっていました.

これまでは,
/etc/gdm3/greeter.dconfファイルの以下の設定を有効にしていました.

disable-user-list=true

$ apt-get changelog gdm3( /usr/share/doc/gdm3/changelog.Debian.gz)を見るとこんな記述が,

  * greeter.dconf-defaults: this is a new file to remove the old 
    greeter.gsettings
  * Convert greeter.gsettings to greeter.dconf-defaults at postinst time 
    and use ucf to update the file.
  * Make a direct symlink to the new greeter.dconf-defaults file in the 
    dconf defaults directory.

gdm3 (3.12.1-1)からgreeter.dconf-defaultsに変わったようです.

$ ls /etc/gdm3/
Init  PostLogin  PostSession  PreSession  Xsession  daemon.conf  daemon.conf.dpkg-dist  greeter.dconf  greeter.dconf-defaults  greeter.dconf-defaults.ucf-old

内容はほとんど同じなようです.

$ diff  /etc/gdm3/greeter.dconf /etc/gdm3/greeter.dconf-defaults
26,27d25
< #logo='/usr/share/icons/gnome/48x48/places/debian-swirl.png'
< #fallback-logo='/usr/share/icons/gnome/48x48/places/debian-swirl.png'
31d28
< 
33c30
< disable-user-list=true
---
> # disable-user-list=true
37,38c34,35
< #banner-message-enable=true
< #banner-message-text='Welcome!!!!!!!!!!!!!!!!!!!!!!'
---
> # banner-message-enable=true
> # banner-message-text='Welcome'

ということで/etc/gdm3/greeter.dconf-defaultsdisable-user-list=trueを有効にしたらOKでした.

diff --git a/gdm3/greeter.dconf-defaults b/gdm3/greeter.dconf-defaults
index c5b0786..b0ee10c 100644
--- a/gdm3/greeter.dconf-defaults
+++ b/gdm3/greeter.dconf-defaults
@@ -27,7 +27,7 @@ logo='/usr/share/icons/hicolor/48x48/emblems/emblem-debian-white.png'
 fallback-logo='/usr/share/icons/hicolor/48x48/emblems/emblem-debian-white.png'

 # - Disable user list
-# disable-user-list=true
+disable-user-list=true
 # - Disable restart buttons
 # disable-restart-buttons=true
 # - Show a login welcome message

#ちなみにこのとき$ sudo service gdm3 restartとしたらなんかおかしくなってしまいました…….OSごと再起動したら治りました.

次から気づきやすいように

$ sudo dpkg-reconfigure apt-listchanges

で「APTで表示すべき変更内容の種類を選択してください。」を「両方 – ニュースと changelog の両方」にしておきました.testing/unstable辺りはちゃんと読まないとですね…….

※apt-listchangesが入っていない場合は$ sudo apt install apt-listchanges

ext4の暗号化fsを試してみる

Linux 4.1でext4の暗号化ファイルシステムが取り込まれているのに気づいたので少し試してみました.
cCryptFSやEncFSなどと同じようにファイル単位での暗号化です.前もって暗号化フラグを設定してあれば一般ユーザが勝手に暗号領域を作ることも可能でした.eCryptFSやEncFSのような使い方も可能そうです.恐らく速度はこちらのほうが速いでしょう(未確認).ただ,パスフレーズがわかってしまうと別のユーザからもマウント可能だしパーミッションがあれば読み書きも出来るので通常のファイルシステムと同様パーミッションの設定は必須ですね.
パーティション内全てを暗号化することは出来ないようなのでLUKS(dm-crypt)とは単純に空きかえることはできなさそうです.

そんなこんなでもともとAndroid向けということもあってPC/Serverではあまり使いみちが思いつかない感じです.(何かいい使い方ありそうだけど…….)

必要条件確認

  • Linux 4.1以上
$ uname -r
4.9.0-2-amd64
  • CONFIG_EXT4_ENCRYPTIONが有効
$ grep CONFIG_EXT4_ENCRYPTION /boot/config-`uname -r`
CONFIG_EXT4_ENCRYPTION=y
  • e2fsprogs 1.43以上
$ dpkg-query -W e2fsprogs
e2fsprogs       1.43.4-2
  • ブロックサイズが4k
$ sudo dumpe2fs /dev/loop0 | grep -i 'block size'
dumpe2fs 1.43.4 (31-Jan-2017)
Block size:               4096

必要なパッケージの導入

$ sudo apt install e2fsprogs keyutils util-linux coreutils mount

ファイルシステムの用意

今回は既存のファイルシステム内にディスクイメージを作成してそれを利用

  • 1GBのディスクイメージの作成
$ dd if=/dev/zero of=ext4-crypt.img seek=1073741824 bs=1 count=1
1+0 レコード入力
1+0 レコード出力
1 byte copied, 0.000118528 s, 8.4 kB/s
  • パーティションの作成
    primaryを1つ作成
$ /sbin/fdisk ext4-crypt.img

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xa25a3988.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-2097151, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097151, default 2097151): 

Created a new partition 1 of type 'Linux' and of size 1023 MiB.

Command (m for help): w
The partition table has been altered.
Syncing disks.
  • ext4でフォーマット
$ /sbin/mkfs.ext4 ./ext4-crypt.img 
mke2fs 1.43.4 (31-Jan-2017)
Found a dos partition table in ./ext4-crypt.img
Proceed anyway? (y,N) y
Discarding device blocks: done                            
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: dc44fd43-7d7a-4dfc-87f1-dc52410e2dd1
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
  • マウント
$ sudo mount -o loop ./ext4-crypt.img /mnt
$ grep /mnt /etc/mtab 
/dev/loop0 /mnt ext4 rw,relatime,data=ordered 0 0
  • オーナー,グループの変更
$ sudo chown `id -u`.`id -g` /mnt
$ ls -la /mnt
合計 36
drwxr-xr-x 3 mk   mk    4096  4月  2 04:58 .
drwxr-xr-x 1 root root   248  3月 28 02:19 ..
drwx------ 2 root root 16384  4月  2 04:58 lost+found

ext4暗号化ファイルシステムの利用

  • ext4の暗号化フラグを設定
$ sudo tune2fs -O encrypt /dev/loop0
$ sudo dumpe2fs /dev/loop0 | grep -io encrypt
dumpe2fs 1.43.4 (31-Jan-2017)
encrypt
  • 鍵の生成とキーリングへの追加
$ /usr/sbin/e4crypt add_key
Enter passphrase (echo disabled): 
Added key with descriptor [07a3ce5a6ebf0396]
$ keyctl show
Session Keyring
1048296028 --alswrv   1000  1000  keyring: _ses
 615559430 --alsw-v   1000  1000   \_ logon: ext4:07a3ce5a6ebf0396

※パスフレーズの入力は1回だけで確認されないので初回は特に注意.利用しはじめる前にキーリングをクリアして登録し直してパスフレーズが正しいか確認しておく.

  • 暗号化ポリシーの設定

このとき対象ディレクトリが空ではない場合エラーとなる( Error [Directory not empty] setting policy. )ので注意.

マウントポイントにはlost+foundが存在するので必ずサブディレクトリ以下である必要がある.

$ mkdir /mnt/encryption
$ /usr/sbin/e4crypt set_policy 07a3ce5a6ebf0396 /mnt/encryption
Key with descriptor [07a3ce5a6ebf0396] applied to /mnt/encryption.

※鍵の生成とキーリングへの追加と暗号化ポリシーの設定は次のようにすることで一度に設定可能

$ /usr/sbin/e4crypt add_key /mnt/encryption
  • 暗号化ファイルシステム領域にファイルを作成
$ echo 'hello' > /mnt/encryption/test.txt
$ ls -la /mnt/encryption
合計 12
drwxr-xr-x 2 mk mk 4096  4月  2 05:07 .
drwxr-xr-x 4 mk mk 4096  4月  2 05:06 ..
-rw-r--r-- 1 mk mk    6  4月  2 05:07 test.txt
  • キーリングのクリア
$ sudo keyctl clear @s
$ sudo keyctl show
Session Keyring
1048296028 --alswrv   1000  1000  keyring: _ses

キーリングをクリアしただけではアクセスできる

$ ls -lA /mnt/encryption
合計 12
-rw-r--r-- 1 mk mk    6  4月  2 05:07 test.txt
  • アンマウントとマウントし直し

キーリングをクリアした状態でアンマウントすると暗号化された状態に戻る

$ sudo umount /mnt
$ sudo mount -o loop ./ext4-crypt.img /mnt
$ ls -la /mnt/encryption
合計 12
drwxr-xr-x 2 mk mk 4096  4月  2 05:42 .
drwxr-xr-x 4 mk mk 4096  4月  2 05:06 ..
-rw-r--r-- 1 mk mk    6  4月  2 05:42 uzUlJZQfaxMx,7cC63,53A
$ cat /mnt/encryption/uzUlJZQfaxMx,7cC63,53A 
cat: /mnt/encryption/uzUlJZQfaxMx,7cC63,53A: 要求されたキーが利用できません

ユーザ,グループ,パーミッションなどは見える.内容にはアクセスできない.

  • 再度暗号化領域を利用出来るようにする

鍵の生成とキーリングへの追加と暗号化ポリシーの設定をし直すとアクセスできるようになる

$ /usr/sbin/e4crypt add_key /mnt/encryption
Enter passphrase (echo disabled): 
Added key with descriptor [07a3ce5a6ebf0396]
$ ls -la /mnt/encryption
合計 12
drwxr-xr-x 2 mk mk 4096  4月  2 05:42 .
drwxr-xr-x 4 mk mk 4096  4月  2 05:06 ..
-rw-r--r-- 1 mk mk    6  4月  2 05:42 test.txt

ファイル名長の確認

EncFSなどはファイル名のメタデータがファイル名内にあるので利用できるファイル名長が短くなってしまう.ext4ではどうか試す.

  • 通常のext4領域では256文字
$ touch /mnt/1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456
touch: '/mnt/1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456' に touch できません: ファイル名が長すぎます
$ touch /mnt/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
  • 暗号化領域も同様だった
$ touch /mnt/encryption/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
$ ls -lA /mnt/encryption/
合計 4
-rw-r--r-- 1 mk mk 0  4月  2 07:14 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
-rw-r--r-- 1 mk mk 6  4月  2 05:42 test.txt
  • 非暗号化状態ではこんな状態
-rw-r--r-- 1 mk mk    0  4月  2 07:14 _OsoePJvc3qPQCPHbUMtjSynszcHig3BL
-rw-r--r-- 1 mk mk    6  4月  2 05:42 uzUlJZQfaxMx,7cC63,53A

復号状態のファイル名は別の場所に記録されているよう.

複数の暗号化領域を作ってみる

  • 新しい暗号化領域のためのディレクトリを作成
$ mkdir /mnt/encryption2
$ ls -la /mnt/encryption2
合計 8
drwxr-xr-x 2 mk mk 4096  4月  2 06:49 .
drwxr-xr-x 5 mk mk 4096  4月  2 06:49 ..
  • 暗号化設定
$ sudo e4crypt add_key /mnt/encryption2
Enter passphrase (echo disabled):
Key with descriptor [9640dd016062b432] already exists
Key with descriptor [9640dd016062b432] applied to /mnt/encryption2.
$ keyctl show
Session Keyring   
1048296028 --alswrv   1000  1000  keyring: _ses
  94779002 --alsw-v      0     0   \_ logon: ext4:69ca01e214957173
 219437542 --alsw-v      0     0   \_ logon: ext4:07a3ce5a6ebf0396
1025344233 --alsw-v      0     0   \_ logon: ext4:9640dd016062b432
$ touch /mnt/encryption2/hoge
  • 一回暗号化を解除してマウントし直す
$ keyctl clear @s
$ keyctl show
Session Keyring   
1048296028 --alswrv   1000  1000  keyring: _ses
$ sudo umount /mnt
$ sudo mount -o loop ./ext4-crypt.img /mnt
  • 片方だけ鍵を登録して暗号化領域を利用
$ sudo e4crypt add_key /mnt/encryption2
Enter passphrase (echo disabled):
Added key with descriptor [9640dd016062b432]
Key with descriptor [9640dd016062b432] applied to /mnt/encryption2.
$ ls -la /mnt/encryption*
/mnt/encryption:  
合計 12
drwxr-xr-x 2 mk mk 4096  4月  2 06:11 .
drwxr-xr-x 5 mk mk 4096  4月  2 06:49 ..
-rw-r--r-- 1 mk mk    0  4月  2 06:11 _OsoePJvc3qPQCPHbUMtjSynszcHig3BL
-rw-r--r-- 1 mk mk    6  4月  2 05:42 uzUlJZQfaxMx,7cC63,53A

/mnt/encryption2: 
合計 8
drwxr-xr-x 2 mk mk 4096  4月  2 06:51 .
drwxr-xr-x 5 mk mk 4096  4月  2 06:49 ..
-rw-r--r-- 1 mk mk    0  4月  2 06:51 hoge

暗号化領域に鍵が登録されてない状態でファイルを作ってみる

暗号化領域に鍵が登録されてない状態でファイルを作るとどうなるかを確認.

$ ls -lA /mnt/encryption
合計 4
-rw-r--r-- 1 mk mk 0  4月  2 07:14 _OsoePJvc3qPQCPHbUMtjSynszcHig3BL
-rw-r--r-- 1 mk mk 6  4月  2 05:42 uzUlJZQfaxMx,7cC63,53A
mk@x220:~ (1180)$ touch /mnt/encryption/test
touch: '/mnt/encryption/test' のタイムスタンプを設定中です: そのようなファイルやディレクトリはありません
mk@x220:~ (1181)$ ls -lA /mnt/encryption
合計 4
-rw-r--r-- 1 mk mk 0  4月  2 07:14 _OsoePJvc3qPQCPHbUMtjSynszcHig3BL
-rw-r--r-- 1 mk mk 6  4月  2 05:42 uzUlJZQfaxMx,7cC63,53A

エラーとなって作れない.

別のユーザで利用

  • 別のユーザで中が見えるか確認
$ id
uid=1001(gm) gid=1001(gm) groups=1001(gm),20(dialout),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),107(netdev)
$ ls -la /mnt/encryption
合計 12
drwxr-xr-x 2 mk mk 4096  4月  2 06:11 .
drwxr-xr-x 7 mk mk 4096  4月  2 07:48 ..
-rw-r--r-- 1 mk mk    0  4月  2 07:14 _OsoePJvc3qPQCPHbUMtjSynszcHig3BL
-rw-r--r-- 1 mk mk    6  4月  2 05:42 uzUlJZQfaxMx,7cC63,53A
$ ls -la /mnt/encryption
合計 12
drwxrwxrwx 2 mk mk 4096  4月  2 06:11 .
drwxr-xr-x 7 mk mk 4096  4月  2 07:48 ..
-rw-r--r-- 1 mk mk    0  4月  2 07:14 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
-rw-r--r-- 1 mk mk    6  4月  2 05:42 test.txt
  • 権限があればファイル作成もできる
$ touch /mnt/encryption/other_user
$ ls -lA /mnt/encryption
合計 4
-rw-r--r-- 1 mk mk 0  4月  2 07:14 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
-rw-r--r-- 1 gm gm 0  4月  2 07:55 other_user
-rw-r--r-- 1 mk mk 6  4月  2 05:42 test.txt
  • 暗号化解除は出来ないと思ったが,
$ /usr/sbin/e4crypt add_key /mnt/encryption
/mnt/encryption: Permission denied
  • パーミッションをゆるくしてやると出来てしまう.
$ ls -la /mnt/encryption
合計 12
drwxrwxrwx 2 mk mk 4096  4月  2 07:55 .
drwxr-xr-x 7 mk mk 4096  4月  2 07:48 ..
-rw-r--r-- 1 gm gm    0  4月  2 07:55 97NmIBETx,1q9US96etRsA
-rw-r--r-- 1 mk mk    0  4月  2 07:14 _OsoePJvc3qPQCPHbUMtjSynszcHig3BL
-rw-r--r-- 1 mk mk    6  4月  2 05:42 uzUlJZQfaxMx,7cC63,53A
$ /usr/sbin/e4crypt add_key /mnt/encryption
Enter passphrase (echo disabled): 
Added key with descriptor [07a3ce5a6ebf0396]
Error [Permission denied] setting policy.
The key descriptor [07a3ce5a6ebf0396] may not match the existing encryption context for directory [/mnt/encryption].
$ ls -lA /mnt/encryption
合計 4
-rw-r--r-- 1 mk mk 0  4月  2 07:14 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
-rw-r--r-- 1 gm gm 0  4月  2 07:55 other_user
-rw-r--r-- 1 mk mk 6  4月  2 05:42 test.txt

mosh 1.3.0をDropbear sshdで利用してみる

moshの1.3.0がリリースされました.

moshはsshを置き換えようとしているソフトウェアで,ネットワークが遅いときにローカルエコーを表示したり,ネットワークが切り替わってもローミングしたりと便利なソフトウェアです.(NotePCで接続してサスペンドして別のネットワークでレジュームしてもすぐに使っていた端末にアクセスできる)

1.3.0でなにかおもしろい機能が増えたりしていないかなと眺めていると

  * Add --no-ssh-pty option for Dropbear compatibility and other issues.

Dropbearで使えるようになるオプションが増えているようです.
DropbearはOpenSSHに比べて大分小さなsshdです.組み込みとかで使われているのを見ます.でも機能が物足りないなと思うことも.

mosh + Dropbearの組み合わせを試してみました.

試したのはこんな感じの環境です.

Host : Raspbian jessie(Raspberry Pi 2B)
Client : Debian sid amd64

dropbearの準備

HostにDropbearをパッケージで導入します

$ sudo apt install dropbear

dropbearのhost鍵を用意

$ mkdir /tmp/dropbear
$ dropbearkey -t ecdsa -s 521 -f /tmp/dropbear/dropbear_ecdsa_host_key
  • -t 鍵種類
  • -s 鍵長
  • -f 鍵ファイル

接続時に解りやすいようにバナーファイル作成

$ banner dropbear > /tmp/dropbear/banner

Dropbearを2222番ポートで起動

$ dropbear -r /tmp/dropbear/dropbear_ecdsa_host_key -p 2222 -b /tmp/dropbear/banner -E
  • -r host鍵を指定
  • -p sshポート番号
  • -b バナーファイル
  • -E 標準エラー出力にメッセージ出力

Dropbearにssh接続できるか確認

$ ssh pi@192.168.2.200 -i ~/.ssh/id_ecdsa -p 2222
Host key fingerprint is SHA256:G3u9pP4ZrkZ2kWs9e+ly9MkEtnO0f4ebvkBS0ObGJQQ
+---[ECDSA 521]---+
|          E+.    |
|           .+ .  |
|           +.+   |
|           .*o . |
|        S ..o++ .|
|         +o++oo= |
|        oo.o= *+=|
|         ..+ *o**|
|         o+o=.O=o|
+----[SHA256]-----+

 #####   #####    ####   #####   #####   ######    ##    #####
 #    #  #    #  #    #  #    #  #    #  #        #  #   #    #
 #    #  #    #  #    #  #    #  #####   #####   #    #  #    #
 #    #  #####   #    #  #####   #    #  #       ######  #####
 #    #  #   #   #    #  #       #    #  #       #    #  #   #
 #####   #    #   ####   #       #####   ######  #    #  #    #

Authenticated to 192.168.2.200 ([192.168.2.200]:2222).

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
pi@raspberrypi:~ $ 

mosh 1.3.0の準備

server側はsourceからbuild

$ sudo apt-get build-dep mosh
$ wget https://mosh.org/mosh-1.3.0.tar.gz
$ sha256sum mosh-1.3.0.tar.gz
320e12f461e55d71566597976bd9440ba6c5265fa68fbf614c6f1c8401f93376  mosh-1.3.0.tar.gz

※hashとgpg署名は以下のメールに,鍵は https://mosh.org/ の一番下にある.

sourceを展開してbuild

$ tar tvf mosh-1.3.0.tar.gz
$ tar xf mosh-1.3.0.tar.gz
$ ./configure --prefix=${HOME}/usr/local
$ make
$ install

host側はDebian sid amd64のパッケージを利用した

$ sudo apt install mosh
$ dpkg-query -W mosh
mosh    1.3.0-1

ということでホスト側はこんな状態に

  • OpenSSH : 22番ポート
  • Dropbear : 2222番ポート
  • mosh 1.2.4a-1+b2(pkg) : /usr/bin/mosh-server
  • mosh 1.3.0 : ${HOME}/usr/local/bin/mosh-server

この状態でDropbearとmosh 1.3.0を利用するにはこんな感じ

$ mosh pi@192.168.2.200 --ssh="ssh -p 2222" --server='${HOME}'/usr/local/bin/mosh-server

でも実際に繋ごうとするとエラーになってしまう.

接続元のmoshではこんなエラー

/usr/bin/mosh: Did not find mosh server startup message. (Have you installed mosh on your server?)

接続先のDropbearではこんなエラー

[20390] Mar 28 06:37:20 Child connection from 192.168.2.205:32888
[20390] Mar 28 06:37:21 Pubkey auth attempt with unknown algo for 'pi' from 192.168.2.205:32888
[20390] Mar 28 06:37:21 Pubkey auth succeeded for 'pi' with key md5 0b:fb:21:45:d6:a0:7d:57:02:24:9b:d3:ed:c7:c6:23 from 192.168.2.205:32888
[20391] Mar 28 06:37:21 ioctl(TIOCSCTTY): Input/output error
[20391] Mar 28 06:37:21 /dev/pts/1: No such file or directory
[20391] Mar 28 06:37:21 open /dev/tty failed - could not set controlling tty: No such device or address
[20390] Mar 28 06:37:21 Exit (pi): Disconnect received

ということで,mosh 1.3.0で入った--no-ssh-ptyを付けてみます.

$ mosh pi@192.168.2.200 --ssh="ssh -p 2222" --server='${HOME}'/usr/local/bin/mosh-server --no-ssh-pty

asciicast

うまく繋がりました.
試しに回線を切断して再接続すると自動的に繋がるのも確認 ☺

--no-ssh-ptyを~/.ssh/configとかに書いとけるといいんですけどね.今のところ毎回指定するしかなさそう?

Joypadで簡易操作を試みる

LinuxBoxで文章を読むのにJoypadで操作できないかなと思ってちょっと試してみました.

はじめはxevコマンドでJoypadのKeyCodeを調べてxmodmadコマンドで書き換えればいいだろうと思っていたのですが,xevコマンドでJoypadは反応しないようでした.他に方法はないかと検索するとjoy2keyというものを見つけたのでこれを試してみました.

$ apt show joy2key
Package: joy2key
Version: 1.6.3-2
Priority: optional
Section: x11
Maintainer: Debian QA Group <packages@qa.debian.org>
Installed-Size: 52.2 kB
Depends: libc6 (>= 2.15), libx11-6
Homepage: http://joy2key.sourceforge.net
Tag: hardware::input:joystick, hardware::input:keyboard, implemented-in::c,
 role::program, use::configuring
Download-Size: 21.8 kB
APT-Sources: http://dennou-q.gfd-dennou.org/debian sid/main amd64 Packages
Description: ジョイスティックの動きを同等のキーストロークに変換
 joy2key により、ジョイスティックの軸とボタンの動きに対してキーボードイベント
 を選択できますので、ネーティブでジョイスティックをサポートしていないアプリケーション
 でジョイスティックやゲームパッドを利用できます。

DebianだとWheezy以降,Ubuntuだとprecise(12.04LTS)以降にパッケージがあるようです.

今回はDebian sidやjessieなので導入はパッケージを入れるだけでした.

$ sudo apt install joy2key

設定はよく解らなかったけどこの辺を参考に

こんな感じで動きました.キーマップは未だ詰めるつもりだけどとりあえず.

$ DISPLAY=:0 joy2key -X -buttons A B X Y L Tab Escape Return KP_9 -axis Left Right Up Down -thresh -16383 16383 -16383 16383

キーコードについてはxevや/usr/include/X11/keysymdef.hで確認できます.とりあえずここにも貼っておきます.

しかしShift + Tabも使いたいのだけどShift/Tabそれぞれ単体は入力できるけど同時入力が効かないようです.通常のKBDでは動作するのでjoy2keyの問題だと思います.

試した環境はDebian sidのjoy2key 1.6.3-2とDebian lennyのjoy2key 1.6.3-2でJoypadはハードオフで\200くらいだったBUFFALOのスーパーファミコンみたいな見た目のBSGP801シリーズと書かれているもの.

[ 5239.625574] usb 2-1.2: authorized to connect
[ 5263.982357] usb 1-1.2: new low-speed USB device number 6 using ehci-pci
[ 5264.095408] usb 1-1.2: New USB device found, idVendor=0583, idProduct=2060
[ 5264.095410] usb 1-1.2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[ 5264.095411] usb 1-1.2: Product: USB,2-axis 8-button gamepad  
[ 5264.095545] usb 1-1.2: Device is not authorized for usage
[ 5266.168066] usb 1-1.2: authorized to connect
[ 5266.176105] hidraw: raw HID events driver (C) Jiri Kosina
[ 5266.184205] usbcore: registered new interface driver usbhid
[ 5266.184207] usbhid: USB HID core driver
[ 5266.188173] input: USB,2-axis 8-button gamepad   as /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:0583:2060.0001/input/input19
[ 5266.188377] hid-generic 0003:0583:2060.0001: input,hidraw0: USB HID v1.10 Joystick [USB,2-axis 8-button gamepad  ] on usb-0000:00:1a.0-1.2/input0

minicomでステータスラインを非表示に

というのを見て気になって確認してみた.manを見てみると-Fというのがそれぽい

$ minicim -D /dev/ttyACM1 -F ''

としてみるとステータスラインの内容は消えるけどステータスライン自体は残っているのでちょっと違う感じ.

minicim起動中に設定画面(Ctrl+A o)の「画面とキーボード」内にそれらしい「C – ステータスライン表示 : 許可」というものがある.これをCを押して「禁止」にして「”dfl” に設定を保存」で設定ファイルに書き出してみる.

$ cat ~/.minirc.dfl 
# Machine-generated file - use setup menu in minicom to change parameters.
pu statusline       disabled

この状態でminicomを起動するとステータスラインは消えていて,この行をコメントアウトしてminicomを起動するとステータスラインがでてくるのを確認.

試した環境はDebian sid amd64のminicom 2.7-1+b2