TerminalImageViewer (tiv)を使ってみる

サーバーに置かれた画像をターミナル経由で見る方法はないものかと考えて検索したらTerminalImageViewerというプロジェクトがありました。このアプリケーションは画像をユニコード・キャラクターに変換して表示できるのでターミナルから見ることができます。GitHubではsnapを使ったインストール方法が紹介されてもますが、サーバはDebianなのでコンパイルしてインストールしました。

sudo apt install imagemagick
git clone https://github.com/stefanhaustein/TerminalImageViewer.git
cd TerminalImageViewer/src/main/cpp
make
sudo make install

表示してみるとユニコードキャラクタの割に綺麗に表示できてました。解像度はもちろん期待できませんが、うまくユニコード・キャラクタを応用してマッピングできています。

ソース

  • https://github.com/stefanhaustein/TerminalImageViewer

box86 + wine

arm機でx86のWindowsアプリケーションが動くという情報を得て試して見ました。以前にqemuを使ってWindowsを動かそうと試みたのですが、あまりの遅さで断念したことがあるので、レビュー見る限り期待できそうです。

box86のインストールはarmhfのみなのでarm64には直接インストールできませんがchrootを使えば間接的にインストールができます。

次のサイトの通りにインストールします。

  • https://forum.armbian.com/topic/16584-install-box86-on-arm64/

色々試してみたのですがまだ開発途上なので動くアプリケーションも限られますが今後期待できそうです。

どうもAllwinnerはまだ使えません。スタートで取り残されてしまいました。

libGL error: unable to load driver: sun4i-drm_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: sun4i-drm
libGL error: unable to load driver: sun4i-drm_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: sun4i-drm
0024:fixme:d3d:wined3d_guess_card No card selector available for card vendor 0000 (using GL_RENDERER "llvmpipe (LLVM 7.0, 128 bits)").

OpenWrt: Orange Pi zeroにインストール

ヤオフクでOrange Pi zeroを入手したのでインストール作業に取り掛かりました。Orange Pi zeroはLanポートが100Mbpsなので本命ではないのですが、定評があるモデルなので持っている価値はある上、今ある条件で経験を積んでおきたいということとでやってみることにしました。Allwinner系のSBCはWi-Fi周りが弱いという欠点がありますが、他のルータと比べて処理能力が格段優れています。従来のルーターとこのSBCを組み合わせることで素晴らしい効果が期待できます。

このSBCボードで特にやりたかったことはShorewallの導入です。以前、Armbianに改造したTVBOXのルータで1年程度稼働したのですが、突然eMMCが壊れたという経験をしてから、ルータは極力ストレージアクセスを避けるべきだという方針に変えてました。仕方なく非力なルーターを使わざるを得なかったのですがShorewallを動かすには非力すぎました。そこでOpenWrtに対応する機器を調べていたらAllwinner系のSoCが使えるということがわかり、これを使えばShorewallが使えるのではと考えました。

問題はSBCの入手ですが、元の値段に対してどういうわけかみな高額でなかなかチャンスが見つけられないことが続いてたのですが、偶然ヤオフクでOrange Pi zeroを見つけました。本命ではないのですが、Orange Pi zeroなら今のADSL環境でもスペック的に十分対応可能なので入手することにしました。

入手したボードを調べてみるとv1.5でしたので最新のLTSバージョンということになります。調べたところ前バージョンのv1.4だと発熱の問題があり、あまり宜しくないようです。v1.5(LTS版)は発熱等ほかいくつか不具合が改善されているというアナウンスがされており実際に期待通りの結果でした。

インストールはOpenWrtのサイトからopenwrt-19.07.5-sunxi-cortexa7-sun8i-h2-plus-orangepi-zero-ext4-sdcard.img.gzというファイルをダウンロードしてTFカードに焼き付けるだけです。

gunzip -c openwrt-19.07.5-sunxi-cortexa7-sun8i-h2-plus-orangepi-zero-ext4-sdcard.img.gz | dd of=/dev/mmcblk(1) bs=1M

TFカードをOrange PiにセットしてUSBケーブルから電源を送り込めばOopenWrtが立ち上がります。リセットボタンが見当たらないのでfailsafeをどうするのかわかりませんが、UARTポートのシリアルアクセスができるのでこれで対処できそうです。参考にログ出力を載せておきます。

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.14.209 (builder@buildhost) (gcc version 7.5.0 (OpenWrt GCC 7.5.0 r11257-5090152ae3)) #0 SMP PREEMPT Sun Dec 6 07:31:03 2020
[    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=30c5387d
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt: Machine model: Xunlong Orange Pi Zero
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] On node 0 totalpages: 131072
[    0.000000] free_area_init_node: node 0, pgdat c0c58880, node_mem_map dfbac000
[    0.000000]   Normal zone: 1024 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 131072 pages, LIFO batch:31
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: Using PSCI v0.1 Function IDs from DT
[    0.000000] random: get_random_bytes called from 0xc0a00908 with crng_init=0
[    0.000000] percpu: Embedded 15 pages/cpu s30796 r8192 d22452 u61440
[    0.000000] pcpu-alloc: s30796 r8192 d22452 u61440 alloc=15*4096
[    0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 130048
[    0.000000] Kernel command line: console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait
[    0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
[    0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
[    0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[    0.000000] Memory: 508560K/524288K available (5648K kernel code, 356K rwdata, 956K rodata, 2048K init, 250K bss, 15728K reserved, 0K cma-reserved, 0K highmem)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
[    0.000000]     vmalloc : 0xe0800000 - 0xff800000   ( 496 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xe0000000   ( 512 MB)
[    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
[    0.000000]     modules : 0xbf000000 - 0xbfe00000   (  14 MB)
[    0.000000]       .text : 0xc0008000 - 0xc0784188   (7665 kB)
[    0.000000]       .init : 0xc0a00000 - 0xc0c00000   (2048 kB)
[    0.000000]       .data : 0xc0c00000 - 0xc0c59180   ( 357 kB)
[    0.000000]        .bss : 0xc0c6052c - 0xc0c9f010   ( 251 kB)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[    0.000000] Preemptible hierarchical RCU implementation.
[    0.000000] 	RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4.
[    0.000000] 	Tasks RCU enabled.
[    0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[    0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[    0.000000] GIC: Using split EOI/Deactivate mode
[    0.000000] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[    0.000000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[    0.000006] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[    0.000017] Switching to timer-based delay loop, resolution 41ns
[    0.000150] Console: colour dummy device 80x30
[    0.000188] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=240000)
[    0.000202] pid_max: default: 32768 minimum: 301
[    0.000315] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.000327] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.000818] CPU: Testing write buffer coherency: ok
[    0.001132] /cpus/cpu@0 missing clock-frequency property
[    0.001154] /cpus/cpu@1 missing clock-frequency property
[    0.001169] /cpus/cpu@2 missing clock-frequency property
[    0.001187] /cpus/cpu@3 missing clock-frequency property
[    0.001199] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[    0.040054] Setting up static identity map for 0x40200000 - 0x40200060
[    0.060049] Hierarchical SRCU implementation.
[    0.100107] smp: Bringing up secondary CPUs ...
[    0.180499] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
[    0.260622] CPU2: thread -1, cpu 2, socket 0, mpidr 80000002
[    0.340762] CPU3: thread -1, cpu 3, socket 0, mpidr 80000003
[    0.340839] smp: Brought up 1 node, 4 CPUs
[    0.340861] SMP: Total of 4 processors activated (192.00 BogoMIPS).
[    0.340867] CPU: All CPU(s) started in HYP mode.
[    0.340872] CPU: Virtualization extensions available.
[    0.344335] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5
[    0.344792] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.344815] futex hash table entries: 1024 (order: 4, 65536 bytes)
[    0.345005] pinctrl core: initialized pinctrl subsystem
[    0.346156] NET: Registered protocol family 16
[    0.346464] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.347919] No ATAGs?
[    0.373147] SCSI subsystem initialized
[    0.373445] libata version 3.00 loaded.
[    0.373721] usbcore: registered new interface driver usbfs
[    0.373789] usbcore: registered new interface driver hub
[    0.373882] usbcore: registered new device driver usb
[    0.374018] Linux video capture interface: v2.00
[    0.374075] pps_core: LinuxPPS API ver. 1 registered
[    0.374083] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.374109] PTP clock support registered
[    0.374424] Advanced Linux Sound Architecture Driver Initialized.
[    0.380913] clocksource: Switched to clocksource arch_sys_counter
[    0.386265] NET: Registered protocol family 2
[    0.386885] TCP established hash table entries: 4096 (order: 2, 16384 bytes)
[    0.386932] TCP bind hash table entries: 4096 (order: 3, 32768 bytes)
[    0.386995] TCP: Hash tables configured (established 4096 bind 4096)
[    0.387085] UDP hash table entries: 256 (order: 1, 8192 bytes)
[    0.387123] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
[    0.387287] NET: Registered protocol family 1
[    0.387632] kvm [1]: 8-bit VMID
[    0.388062] kvm [1]: vgic interrupt IRQ16
[    0.388166] kvm [1]: Hyp mode initialized successfully
[    0.389251] No memory allocated for crashlog
[    0.389393] workingset: timestamp_bits=30 max_order=17 bucket_order=0
[    0.393640] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.393796] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc.
[    0.396124] io scheduler noop registered
[    0.396138] io scheduler deadline registered
[    0.396276] io scheduler cfq registered (default)
[    0.396836] sun4i-usb-phy 1c19400.phy: Couldn't request ID GPIO
[    0.400047] sun8i-h3-pinctrl 1c20800.pinctrl: initialized sunXi PIO driver
[    0.401531] sun8i-h3-r-pinctrl 1f02c00.pinctrl: initialized sunXi PIO driver
[    0.406281] Serial: 8250/16550 driver, 16 ports, IRQ sharing enabled
[    0.408898] console [ttyS0] disabled
[    0.429199] 1c28000.serial: ttyS0 at MMIO 0x1c28000 (irq = 35, base_baud = 1500000) is a U6_16550A
[    1.035240] console [ttyS0] enabled
[    1.043397] loop: module loaded
[    1.047865] libphy: Fixed MDIO Bus: probed
[    1.052393] dwmac-sun8i 1c30000.ethernet: PTP uses main clock
[    1.058172] dwmac-sun8i 1c30000.ethernet: No regulator found
[    1.063943] dwmac-sun8i 1c30000.ethernet: Current syscon value is not the default 148000 (expect 58000)
[    1.073351] dwmac-sun8i 1c30000.ethernet: Chain mode enabled
[    1.079004] dwmac-sun8i 1c30000.ethernet: No HW DMA feature register supported
[    1.086231] dwmac-sun8i 1c30000.ethernet: Normal descriptors
[    1.091898] dwmac-sun8i 1c30000.ethernet: RX Checksum Offload Engine supported
[    1.099110] dwmac-sun8i 1c30000.ethernet: COE Type 2
[    1.104083] dwmac-sun8i 1c30000.ethernet: TX Checksum insertion supported
[    1.111000] libphy: stmmac: probed
[    1.114918] dwmac-sun8i 1c30000.ethernet: Found internal PHY node
[    1.121217] libphy: mdio_mux: probed
[    1.124810] dwmac-sun8i 1c30000.ethernet: Switch mux to internal PHY
[    1.131184] dwmac-sun8i 1c30000.ethernet: Powering internal PHY
[    1.137846] libphy: mdio_mux: probed
[    1.141942] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    1.148463] ehci-platform: EHCI generic platform driver
[    1.153879] ehci-platform 1c1a000.usb: EHCI Host Controller
[    1.159470] ehci-platform 1c1a000.usb: new USB bus registered, assigned bus number 1
[    1.167356] ehci-platform 1c1a000.usb: irq 26, io mem 0x01c1a000
[    1.200929] ehci-platform 1c1a000.usb: USB 2.0 started, EHCI 1.00
[    1.207189] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[    1.213994] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.221219] usb usb1: Product: EHCI Host Controller
[    1.226091] usb usb1: Manufacturer: Linux 4.14.209 ehci_hcd
[    1.231670] usb usb1: SerialNumber: 1c1a000.usb
[    1.236589] hub 1-0:1.0: USB hub found
[    1.240371] hub 1-0:1.0: 1 port detected
[    1.244849] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    1.251068] ohci-platform: OHCI generic platform driver
[    1.256459] ohci-platform 1c1a400.usb: Generic Platform OHCI controller
[    1.263110] ohci-platform 1c1a400.usb: new USB bus registered, assigned bus number 2
[    1.270957] ohci-platform 1c1a400.usb: irq 27, io mem 0x01c1a400
[    1.345080] usb usb2: New USB device found, idVendor=1d6b, idProduct=0001
[    1.354246] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.361479] usb usb2: Product: Generic Platform OHCI controller
[    1.367392] usb usb2: Manufacturer: Linux 4.14.209 ohci_hcd
[    1.372970] usb usb2: SerialNumber: 1c1a400.usb
[    1.377862] hub 2-0:1.0: USB hub found
[    1.381657] hub 2-0:1.0: 1 port detected
[    1.386161] usbcore: registered new interface driver usb-storage
[    1.392410] mousedev: PS/2 mouse device common for all mice
[    1.398324] i2c /dev entries driver
[    1.402459] sunxi-wdt 1c20ca0.watchdog: Watchdog enabled (timeout=16 sec, nowayout=0)
[    1.411641] sunxi-mmc 1c0f000.mmc: Got CD GPIO
[    1.470944] sunxi-mmc 1c0f000.mmc: base:0xe08c9000 irq:23
[    1.481148] NET: Registered protocol family 10
[    1.486658] Segment Routing with IPv6
[    1.490381] NET: Registered protocol family 17
[    1.494985] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[    1.507970] can: controller area network core (rev 20170425 abi 9)
[    1.514269] NET: Registered protocol family 29
[    1.518715] 8021q: 802.1Q VLAN Support v1.8
[    1.520185] mmc0: host does not support reading read-only switch, assuming write-enable
[    1.523028] Registering SWP/SWPB emulation handler
[    1.535128] mmc0: new high speed SD card at address e624
[    1.541597] mmcblk0: mmc0:e624 SU02G 1.84 GiB
[    1.542620] ehci-platform 1c1b000.usb: EHCI Host Controller
[    1.550783]  mmcblk0: p1 p2 p3
[    1.551674] ehci-platform 1c1b000.usb: new USB bus registered, assigned bus number 3
[    1.562573] ehci-platform 1c1b000.usb: irq 28, io mem 0x01c1b000
[    1.590919] ehci-platform 1c1b000.usb: USB 2.0 started, EHCI 1.00
[    1.597187] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002
[    1.603987] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.611211] usb usb3: Product: EHCI Host Controller
[    1.616083] usb usb3: Manufacturer: Linux 4.14.209 ehci_hcd
[    1.621660] usb usb3: SerialNumber: 1c1b000.usb
[    1.626599] hub 3-0:1.0: USB hub found
[    1.630380] hub 3-0:1.0: 1 port detected
[    1.635017] ohci-platform 1c1b400.usb: Generic Platform OHCI controller
[    1.641668] ohci-platform 1c1b400.usb: new USB bus registered, assigned bus number 4
[    1.649521] ohci-platform 1c1b400.usb: irq 29, io mem 0x01c1b400
[    1.725081] usb usb4: New USB device found, idVendor=1d6b, idProduct=0001
[    1.731886] usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.739099] usb usb4: Product: Generic Platform OHCI controller
[    1.745029] usb usb4: Manufacturer: Linux 4.14.209 ohci_hcd
[    1.750595] usb usb4: SerialNumber: 1c1b400.usb
[    1.755515] hub 4-0:1.0: USB hub found
[    1.759295] hub 4-0:1.0: 1 port detected
[    1.764472] sunxi-mmc 1c10000.mmc: allocated mmc-pwrseq
[    2.040932] sunxi-mmc 1c10000.mmc: base:0xe08ec000 irq:24
[    2.046402] hctosys: unable to open rtc device (rtc0)
[    2.051915] vcc3v0: disabling
[    2.054884] vcc5v0: disabling
[    2.057848] ALSA device list:
[    2.060811]   No soundcards found.
[    2.060861] mmc1: new high speed SDIO card at address 0001
[    2.076580] EXT4-fs (mmcblk0p2): mounted filesystem without journal. Opts: (null)
[    2.084128] VFS: Mounted root (ext4 filesystem) readonly on device 179:2.
[    2.093001] Freeing unused kernel memory: 2048K
[    2.154678] init: Console is alive
[    2.158264] init: - watchdog -
[    2.361121] random: fast init done
[    2.565592] kmodloader: loading kernel modules from /etc/modules-boot.d/*
[    2.586880] kmodloader: done loading kernel modules from /etc/modules-boot.d/*
[    2.594995] init: - preinit -
[    2.773287] random: jshn: uninitialized urandom read (4 bytes read)
[    2.811730] random: jshn: uninitialized urandom read (4 bytes read)
[    2.830024] random: jshn: uninitialized urandom read (4 bytes read)
[    2.889439] Generic PHY 0.1:01: attached PHY driver [Generic PHY] (mii_bus:phy_addr=0.1:01, irq=POLL)
[    2.900305] dwmac-sun8i 1c30000.ethernet eth0: No MAC Management Counters available
[    2.907984] dwmac-sun8i 1c30000.ethernet eth0: PTP not supported by HW
[    2.915843] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[    5.997796] mount_root: mounting /dev/root
[    6.001556] dwmac-sun8i 1c30000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
[    6.003022] EXT4-fs (mmcblk0p2): warning: mounting unchecked fs, running e2fsck is recommended
[    6.010450] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[    6.027263] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
[    6.145751] urandom-seed: Seeding with /etc/urandom.seed
[    6.190702] procd: - early -
[    6.194277] procd: - watchdog -
[    6.364729] urandom_read: 4 callbacks suppressed
[    6.364737] random: jshn: uninitialized urandom read (4 bytes read)
[    6.435126] random: jshn: uninitialized urandom read (4 bytes read)
[    6.499021] random: jshn: uninitialized urandom read (4 bytes read)
[    6.827996] procd: - watchdog -
[    6.831391] procd: - ubus -
[    6.885724] procd: - init -
[    7.187323] kmodloader: loading kernel modules from /etc/modules.d/*
[    7.197657] urngd: v1.0.2 started.
[    7.219194] NET: Registered protocol family 38
[    7.242415] device-mapper: ioctl: 4.37.0-ioctl (2017-09-20) initialised: dm-devel@redhat.com
[    7.247361] random: crng init done
[    7.257250] ntfs: driver 2.1.32 [Flags: R/O MODULE].
[    7.266502] NET: Registered protocol family 15
[    7.272409] Initializing XFRM netlink socket
[    7.278975] tun: Universal TUN/TAP device driver, 1.6
[    7.309471] gre: GRE over IPv4 demultiplexor driver
[    7.315702] ip_gre: GRE over IPv4 tunneling driver
[    7.325671] ip6_gre: GRE over IPv6 tunneling driver
[    7.340487] ip6_tables: (C) 2000-2006 Netfilter Core Team
[    7.353126] Mirror/redirect action on
[    7.363026] u32 classifier
[    7.365757]     input device check on
[    7.369443]     Actions configured
[    7.383419] nf_conntrack version 0.5.0 (8192 buckets, 32768 max)
[    7.427427] Bridge firewalling registered
[    7.432743] Loading modules backported from Linux version v4.19.137-0-gc076c79e03c6
[    7.440419] Backport generated by backports.git v4.19.137-1-0-g60c3a249
[    7.449300] ip_tables: (C) 2000-2006 Netfilter Core Team
[    7.558324] Netfilter messages via NETLINK v0.30.
[    7.568531] wireguard: WireGuard 1.0.20200611 loaded. See www.wireguard.com for information.
[    7.577513] wireguard: Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
[    7.617146] xt_time: kernel timezone is -0000
[    7.678639] ctnetlink v0.93: registering with nfnetlink.
[    7.692385] nf_tables: (c) 2007-2009 Patrick McHardy <kaber@trash.net>
[    7.719833] PPP generic driver version 2.4.2
[    7.725762] NET: Registered protocol family 24
[    7.751876] usbcore: registered new interface driver rt2800usb
[    7.758028] kmodloader: done loading kernel modules from /etc/modules.d/*
[   10.702139] Generic PHY 0.1:01: attached PHY driver [Generic PHY] (mii_bus:phy_addr=0.1:01, irq=POLL)
[   10.713199] dwmac-sun8i 1c30000.ethernet eth0: No MAC Management Counters available
[   10.720961] dwmac-sun8i 1c30000.ethernet eth0: PTP not supported by HW
[   10.727882] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[   10.737450] br-lan: port 1(eth0.111) entered blocking state
[   10.743280] br-lan: port 1(eth0.111) entered disabled state
[   10.749369] device eth0.111 entered promiscuous mode
[   10.754495] device eth0 entered promiscuous mode
[   10.761427] IPv6: ADDRCONF(NETDEV_UP): br-lan: link is not ready
[   10.838577] IPv6: ADDRCONF(NETDEV_UP): eth0.666: link is not ready
[   10.850833] IPv6: ADDRCONF(NETDEV_UP): eth0.999: link is not ready
[   11.054724] br-lan: port 2(vxlan0) entered blocking state
[   11.061555] br-lan: port 2(vxlan0) entered disabled state
[   11.068242] device vxlan0 entered promiscuous mode
[   11.074359] br-lan: port 2(vxlan0) entered blocking state
[   11.079813] br-lan: port 2(vxlan0) entered forwarding state
[   11.128490] IPv6: ADDRCONF(NETDEV_CHANGE): br-lan: link becomes ready
[   12.801589] dwmac-sun8i 1c30000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
[   12.810166] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[   12.817550] br-lan: port 1(eth0.111) entered blocking state
[   12.823214] br-lan: port 1(eth0.111) entered forwarding state
[   12.830242] IPv6: ADDRCONF(NETDEV_CHANGE): eth0.666: link becomes ready
[   12.837853] IPv6: ADDRCONF(NETDEV_CHANGE): eth0.999: link becomes ready
[   13.173942] pppoe-wan: renamed from ppp0
[   13.529989] xt_CT: No such helper "netbios-ns"
[   13.681391] xt_CT: No such helper "sane"
[   13.755089] xt_CT: No such helper "sane-0"
[   14.056347] xt_CT: No such helper "netbios-ns"
[   14.137165] xt_CT: No such helper "sane"
[   14.172282] xt_CT: No such helper "sane-0"

LANポートが一つしかないのでVLANを使いました。

レイアウト図です。

       vlan111                    vlan999
   LAN --------| Openwrt router |-------- Wan
                      |  |
             eth0.111 |  | eth0.999
                      |  |
               | Orange Pi zero |

VLANの設定はダッシュボードではなく/etc/config/networkを編集します。

config interface 'lan'
	option type 'bridge'
	option ifname 'eth0.111'
	option proto 'static'
	option ip6assign '60'
	list dns '8.8.8.8'
	list dns '1.1.1.1'
	list ipaddr '192.168.1.1/26'

config interface 'wan'
	option ifname 'eth0.999'
	option proto 'pppoe'
	option password '****************'
	option ipv6 'auto'
	option username '******.******.ne.jp'

OpenWrtのダッシュボードの設定からShorewallに変えてみるとさすがにシンプルで設定が楽です。ダッシュボードだと複雑な設定にすると乱雑になりすぎて間違いやすく、結果やはり変えてよかった思いました。

Post-installation

luci-firewallのアンインストール

opkg remove --force-depends luci-app-firewall

shorewallを有効にする

/etc/shorewall/shorewall.conf: STARTUP_ENABLED=Yes

/etc/init.d/firewwall disable

/etc/init.d/shorewall enable

/etc/init.d/shorewall start or reload

参考

  • https://linux-sunxi.org/Xunlong_Orange_Pi_Zero#Compatibility

POP! OS 20.10アップグレードで言語設定の不具合

POP! OS 20.04からPOP! OS 20.10へアップグレードしたところ、言語設定のfcitxの不具合がありました。そこで試しにfcitx5にしてみてもやはり不具合は解消されてませんでした。

原因はおそらく言語設定の変更が追いついていないためだと思いますが、とりあえず使えるようにしました。

echo -e "export XMODIFIERS=@im=fcitx\nexport GTK_IM_MODULE=\"xim\"\nexport QT_IM_MODULE=\"xim\"\nfcitx &">>~/.profile

fcitx5というのが前から気にかかっていたのですが、今回使えるようにしてみました。fcitxの改良版とでも言うのでしょうか、あまり違いはわかりませんがことのついでに設定してみました。

公式パッケージにはfcitx5-mozcがないので、外部リポジトリからインストールします。

$ sudo add-apt-repository ppa:ikuya-fruitsbasket/fcitx5
$ sudo apt upgrade
$ sudo apt install fcitx5 fcitx5-config-qt fcitx5-data fcitx5-frontend-gtk2 \
  fcitx5-frontend-gtk3 fcitx5-frontend-qt5 fcitx5-module-dbus fcitx5-module-emoji \
  fcitx5-module-ibus fcitx5-module-kimpanel fcitx5-module-quickphrase \
  fcitx5-module-quickphrase-editor fcitx5-module-wayland fcitx5-module-xorg \
  fcitx5-modules fcitx5-mozc kde-config-fcitx5 libfcitx5-qt-data libfcitx5-qt1 \
  libfcitx5config6 libfcitx5core7 libfcitx5gclient1 libfcitx5utils1 libfcitx5utils2
$  sed -i 's/fcitx/fcitx5/' .profile

ログアウトして入り直します。

Skinの追加

まだ公式リポジトリにないのでGitHubから導入してみます。テーマを/usr/share/fcitx5/themesにコピーします。fcitx5の設定でThemeを変更します。

参考

  • https://github.com/xuzhao9/fcitx5-theme-opensuse

OpenWrt: 802.11ac の 802.11s + wpa3 sae を使う

前日セットアップしたVxlanが遅すぎて絶望的な気分に浸っていたところで、802.11acで802.11sのメッシュがひょっとしたらできるのではないかと思いつきました。acモードの802.11sは以前に試してみたのですがうまく行きませんでしたが、WG1200CRは比較的新しい機種なのでひょっとしたらと思ったわけです。結論から言うと出来ました。ただし、Mediatekのルーター、WCR-1166DSはWG1200CRにはメッシュは繋がるもののファイル転送に失敗しました。と言うことでacモードの802.11sは機種限定ですが可能だと言うことを発見しました。

wpa3 saeを有効にする

opkg remove  wpad-basic
opkg install wpad-wolfssl

パッケージはこれだけです。あとはダッシュボードで802.11sの設定をするのみです。Channelは固定しておきます。

テスト:iperf3 (==: 有線LAN, –: Wi-Fi)

PC (macOS) — AP1 == NAS

[  5] local 192.168.211.20 port 5201 connected to 192.168.211.4 port 54092
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec  32.2 MBytes   270 Mbits/sec
[  5]   1.00-2.00   sec  34.9 MBytes   293 Mbits/sec
[  5]   2.00-3.00   sec  35.5 MBytes   298 Mbits/sec
[  5]   3.00-4.00   sec  35.8 MBytes   300 Mbits/sec
[  5]   4.00-5.00   sec  35.9 MBytes   301 Mbits/sec
[  5]   5.00-6.00   sec  34.3 MBytes   287 Mbits/sec
[  5]   6.00-7.00   sec  34.4 MBytes   289 Mbits/sec
[  5]   7.00-8.00   sec  34.7 MBytes   291 Mbits/sec
[  5]   8.00-9.00   sec  34.7 MBytes   291 Mbits/sec
[  5]   9.00-10.00  sec  34.3 MBytes   288 Mbits/sec
[  5]  10.00-10.02  sec   758 KBytes   260 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.02  sec   349 MBytes   292 Mbits/sec                  sender
[  5]   0.00-10.02  sec   347 MBytes   291 Mbits/sec                  receiver

PC (macOS) == AP2 — (802.11s) — AP1 == NAS

[  5] local 192.168.211.20 port 5201 connected to 192.168.211.2 port 51689
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec  19.9 MBytes   167 Mbits/sec
[  5]   1.00-2.00   sec  20.6 MBytes   173 Mbits/sec
[  5]   2.00-3.00   sec  21.2 MBytes   178 Mbits/sec
[  5]   3.00-4.00   sec  21.2 MBytes   179 Mbits/sec
[  5]   4.00-5.00   sec  20.8 MBytes   174 Mbits/sec
[  5]   5.00-6.00   sec  13.7 MBytes   115 Mbits/sec
[  5]   6.00-7.00   sec  17.4 MBytes   146 Mbits/sec
[  5]   7.00-8.00   sec  21.0 MBytes   176 Mbits/sec
[  5]   8.00-9.00   sec  21.2 MBytes   178 Mbits/sec
[  5]   9.00-10.00  sec  21.2 MBytes   178 Mbits/sec
[  5]  10.00-10.02  sec   334 KBytes   167 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.02  sec   199 MBytes   167 Mbits/sec                  sender
[  5]   0.00-10.02  sec   199 MBytes   166 Mbits/sec                  receiver

メッシュネットワーク越えでもそれほど速度低下はなくこれなら使えそうです。

Bug

11ac meshで有効にしたままファームウェアをアップグレードしようとすると失敗する → メッシュを一時的にオフにしてアップグレードする。

OpenWrt: Vxlanのセットアップ

前回、NEC Aterm WG1200CRにOpenWrtをインストールしました。この機種はヤオフクで手に入れたものですが、実は3台まとめての落札だったので、今回、この3台を使ってネットワーク周りをアップグレードすることにしました。現在のネットワークは11n(2.4GHz)の11s(メッシュ)+WPA3 SAEで、通信速度は150Mbpsです。メッシュネットワークは柔軟性のあるネットワークですが遅いという欠点があります。そこでAPモードを使って11acの性能を引き出そうというのが今回の試みです。

11acのWPA3 SAEのAPモード、Clientモードのネットワーク・セットアップまでは問題ないのですが、子機のClientモードの方が仕様上ブリッジできないという欠点があります。プライベートネットワーク上でnat超えは避けて同一のネットワークを透過的に使いたいところです。いろいろ検討してみたところ、トンネリング・インターフェースを使えば出来そうです。以前にWireGurad上にGreTapをのせてネットワークデバイスをブリッジしました。今回も同じ方法が使えます。

GreTap vs. Vxlan

L2ネットワークをトンネリングする方法としてGreTapの他にVxlanがあります。どちらも同じ目的で使いますが、何が違い、どちらがメリットがあるのかが疑問だったので調べてみたところ、Vxlanはudpプロトコルを使い、マルチキャストができることがわかりました。一方、GreTapはユニキャストのみです。ネットワーク同士をつなげるとしたらVxlanの方が有利なのは明らかです。そこで今回はVxlanを採用することにしました。

Vxlanのセットアップ

OpenWrtのドキュメントを調べたのですがどうも上手くいきません。そこでGoogleで調べて、何が欠けているのか、情報を収集してみました。

まずパッケージのインストールから始めました。

opkg install vxlan kmod-vxlan ip-full ip-bridge

しかし、これだけでは上手くいかず、前回、GreTapでnat周りのカーネルモジュールをインストールしたことを思い出しました。そこで手当たり次第に関連するカーネルモジュールをインストールしてみました。

opkg install kmod-ip6-tunnel kmod-ip6tables kmod-ipt-conntrack kmod-ipt-conntrack-extra \
    kmod-ipt-nat kmod-ipt-nat-extra kmod-iptunnel kmod-iptunnel6 kmod-nf-conntrack \
    kmod-nf-conntrack-netlink kmod-nf-conntrack6 kmod-nf-nat kmod-nf-nat6 kmod-nf-nathelper \
    kmod-nf-nathelper-extra kmod-nfnetlink kmod-udptunnel4 kmod-udptunnel6 kmod-vxlan

AP、Clientの両方の/etc/config/networkに追加します。peeraddrとipaddrはネット環境に合わせて調整します。またインターフェースvxlan0をbr-lan(LAN環境)にブリッジします。

config interface 'vxlan0'
	option proto 'vxlan'
	option port '4789'
	option vid '8'
	option ipaddr '10.201.0.53'
	option peeraddr '10.201.0.50'
	#option tunlink 'l2vpn'
	#option mtu '1400'

config interface 'l2vpn'
#	option ifname '@vxlan0'
	option ifname 'l2vpn0'
	option proto 'static'
	option ipaddr '10.201.0.53'
	option netmask '255.255.255.192'
	#option layer '2'
	option delegate '0'

インターフェースのセットアップ

wi-fiのセットアップ

firewallはVxlan用に作成します。

ネットワークトポロジー

 PCs                                             redius server2
  |                                                   ||
 wifi AP == wifi Client -- (vxlan) -- wifi AP == GW router == WAN
  ||                                   |              |
 radius server1                 (mesh network,  (mesh network,2.4G
                          2.4G,11s + wpa3 sae)  11s + wireguard + gretap)
                                       |              |              
                                      PCs          IP camera

ルーター種別

  • Vxlan: 11acルーター(wi-fi:866Mbps, lan:1Gbps)
  • 11s + wpa3 sae: Atheros router, mt7621以降 (wi-fi:150Mbps, lan:100Mbps)
  • 11s + wireguard + gretap: rt3050, rt5350, mt7620 (wi-fi:150Mbps, lan:100Mbps)

Multi network化

Vxlanは柔軟性あるネットワーキングができるのでクラウド環境でよく使われています。余っている11acルーターを使って試しに自宅ネットワーク環境で試してみます。

config interface 'vxlan0'
	option proto 'vxlan'
	option port '4789'
	option vid '8'
	option ipaddr '10.201.0.53'
	option peeraddr '10.201.0.50'

config interface 'vxlan1'
	option proto 'vxlan'
	option port '4790'
	option vid '8'
	option ipaddr '10.201.0.53'
	option peeraddr '10.201.0.60'

config interface 'l2vpn'
	option ifname 'l2vpn0'
	option proto 'static'
	option ipaddr '10.201.0.53'
	option netmask '255.255.255.192'
	option delegate '0'

ポートを+1ずらして設定しました。

テスト:iperf (==: 有線LAN, –: Wi-Fi)

1 ) AP router == NAS

[  4] local 192.168.211.20 port 5001 connected with 192.168.211.52 port 46574
[  4]  0.0-10.0 sec   146 MBytes   122 Mbits/sec

2) ThinkPad x230 (macOS) — AP router == NAS

[  4] local 192.168.211.20 port 5001 connected with 192.168.211.4 port 54857
[  4]  0.0-10.1 sec   281 MBytes   234 Mbits/sec

3) AP router 2 (Vxlan) == AP router == NAS

[  4] local 192.168.211.20 port 5001 connected with 192.168.211.53 port 34536
[  4]  0.0-10.0 sec   305 MBytes   256 Mbits/sec

4) Client router (vxlan) — AP router 2 (vxlan) == AP router == NAS

[  5] local 192.168.211.20 port 5001 connected with 192.168.211.60 port 46286
[  5]  0.0-10.1 sec  91.7 MBytes  76.5 Mbits/sec

5) ThinkPad x220 (Linux) == Client router (vxlan) — AP router 2 (vxlan) == AP router == NAS

[  5] local 192.168.211.20 port 5001 connected with 192.168.211.2 port 44770
[  5]  0.0-10.4 sec  94.1 MBytes  76.2 Mbits/sec

1図はarproxyのためか速度が半分になってます。2図は通常のAPルーターとして使った場合、十分な速度が出ています。3図は二つ目のAPルーターです。想定通りの速度です。4図はVxlanを通してClientルーターからの速度です。速度が約1/3になっています。ここがボトルネックのようです。仮想状のトンネルはCPUパワーが必要なのか設定の問題なのかわかりませんが調査が必要です。5図はエンドポイントです。4図とほぼ同じです。

総括するとOpenWrtでVxlanで実現しようとしてもかなり遅くなってしまうので11nモードのメッシュでもいいかもと言う結果でした。

参考

  • https://forum.openwrt.org/t/wireguard-vxlan-and-multicast/39405/7
  • https://openwrt.org/docs/guide-user/network/tunneling_interface_protocols#examples
  • https://www.reddit.com/r/networking/comments/4bko87/vxlan_vs_gre/

OpenWrt: Aterm WG1200CRにインストール

今回初めてNEC製ルータにOpenWrtをインストールしました。NEC製でOpenWrtをインストールできる機種は3種のみ(2020年11月現在)です。NECのルーターはクオリティが高いという評判なのでいつか使ってみたとは思ってたのですが、人気があるため手に入りづらくなかなかチャンスはありませんでした。たまたまヤオフクで手ごろな製品を見つけたので落札してみました。

この機種はBuffalo WCR-1166DSに近いスペックなのですが、有線LANの1Gbpsが2ポートあります。将来的に光インターネットにした場合、WCR-1166DSのLANポートの100Mbpsではボトルネックの可能性があるので、持っていて損のない製品です。

このWG1200CRのインストールには一つハードルがあり、最新のファームウェアでは直接、OpenWrtがインストールできないということがあります。なので手元届いたら真っ先にこのルーターにアクセスしてファームウェアのバージョンを調べました。幸運にも古いものだったので直接Factoryイメージをインストールできました。なおu-bootからインストールする場合、パスワードがかかってるので解除する必要があります。

通信速度はACモードで今まで使っていたものより1.5倍くらい速い結果でした。ただ、たまたまだったのか、じっくり検証をしてみないと何とも言えません。

その他

hardware/software offload

opkgのssl化

opkg install wget ca-certificates libustream-openssl

/etc/opkg/distfeeds.confを編集してhttp→httpsに変更

SQM

opkg install sqm-scripts luci-app-sqm

参考

  • https://tetsupc.wordpress.com/2019/04/07/nec-aterm-wg1200cr/
  • https://openwrt.org/toh/hwdata/nec/nec_aterm_wg1200cr

Pop!_OS 20.04 LTSとwpa_supplicant

ひさしぶりにLinuxをたちあげたところなぜかWi-Fiがつながらないという事例がおきたので調べてみました。最初はカーネルが新しすぎてWi-Fiドライバーのすり合わせがうまくいってないのかと考えて旧カーネルでやってみても不具合が治らなかったのでwpa_supplicantを疑ってみました。この件についてはarmbianのTVBOXのときでも別の理由でダウングレードしたので、同じやり方で旧バージョンのBionicのwpa_supplicantにダウングレードしました。

journalctl --since="2020-11-14 00:00:00"

Nov 14 02:18:51 pop-os wpa_supplicant[987]: wlp3s0: Association request to the driver failed
Nov 14 02:18:51 pop-os kernel: ERROR @wl_set_key_mgmt : 
Nov 14 02:18:51 pop-os kernel: invalid cipher group (1027076)

radius serverはradiusd -Xでデバッグモードで起動しておきます。

cat <<'EOF' | sudo tee /etc/apt/sources.list.d/bionic.list
deb http://cz.archive.ubuntu.com/ubuntu bionic main
deb http://cz.archive.ubuntu.com/ubuntu bionic-updates main
EOF
apt-get update
apt-get install wpasupplicant=2:2.6-15ubuntu2.5
echo -e "Package: wpasupplicant\nPin: release o=Ubuntu,n=bionic\nPin-Priority: 1001" | \
 tee /etc/apt/preferences.d/bionic

前回とほぼおなじなのですが整理して再度掲載しました。これでwpa enterprise(TLS)ができるようになりました。

(再) ELECOM WRC-1167GHBK2-SにOpenWrtをインストール

ELECOM WRC-1167GHBK2-SはOpenWrtのサポートがありますがWi-Fiが使えません。WLANがMediaTek MT7615Dというチップを使っていてそのサポートがないからです。しかしながら最新のSnapshot版では一応ドライバーは導入されておりWi-Fiが使えるようになっていますが、まだ不具合があります。MT7615D一つで2.4Gと5Gが使えるのですが、そのままですとどちらか一つのモードしか使えません。前回、5月にインストールを試してみたのですが、結果は良くありませんでした。今回はその時から改善を期待して再挑戦しました。

OpenWrtのフォーラムで調べてみると設定すれば使えるようです。/etc/config/wirelessを編集します。

config wifi-device 'radio0'
	option type 'mac80211'
	option path '1e140000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0'
	option htmode 'HT40'
	option disabled '0'

config wifi-iface 'default_radio0'
	option device 'radio0'
	option network 'lan'
	option disabled '0'
	option mode 'mesh'
	option mesh_id 'Mesh'
	option mesh_fwding '1'
	option mesh_rssi_threshold '0'
	option encryption 'sae'
	option key 'xxxxxxxxxxxxxxxx'
	#option wps_pushbutton '1'

config wifi-device 'radio1'
	option type 'mac80211'
	option hwmode '11a'
	option path '1e140000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0+1'
	option htmode 'VHT80'
	option disabled '0'
	option country 'JP'

config wifi-iface 'default_radio1'
	option device 'radio1'
	option network 'lan'
	option mode 'ap'
	option disabled '0'
	option ssid 'Network-5g'
	option encryption 'wpa2+ccmp'
	option auth_server '192.168.1.1'
	option auth_secret 'xxxxxxxx'
	option disassoc_low_ack '0'
        option disabled '0'

設定で大事なことはPhy0が2.4GでPhy1が5Gです。

次にコマンドを実行します。

wifi down
sleep 3
echo "1" > /sys/kernel/debug/ieee80211/phy0/mt76/dbdc
sleep 3
wifi up
echo e > /sys/class/net/eth0/queues/rx-0/rps_cpus

ip aを実行してWi-Fiデバイスが2つあることを確認します。さらにLuCIのダッシュボードで見てみます。

テストでは一応安定を保ってますが時たまphy1が不安定にあるときがあります。次期安定版では改善していることを期待したいところです。

Androidの静的ルーティング

今までOpenWrtやArmbianでネットワーク周りの設定をして、Androidのスマホの設定でどうしてできないものがありました。Andoridには静的ルーティングの設定項目の設定がありません。検索してみると2つほど解決策がありました。一つはsshでログインしてipコマンドで設定する方法です。2つ目はアプリをインストールすることです。

ipコマンドで静的ルーティングする場合

sshサーバをインストールします。いくつかアプリがあるのですが、SSHelperが良さそうだったのでインストールしました。sshコマンドでスマホにログインして、suコマンドでルートになります。ip route add <network> via <IP address>を実行すればできます。特に難しくはないのですが、毎回コマンドを打たなくてはいけないので面倒です。そこでアプリをインストールしてみました。

アプリから設定する場合

AIProuteをダウンロードします。

Androidアプリのソースコードらしいのですが、ビルドしたことがなかったので検索したところ、Android Studioをビルドできることがわかりました。macOSにインストールしたのですが、そう簡単にビルドできず、エラーが出るごとに不足している色々なパッケージをインストールして最終的にエラーが出なくなった時点でビルド完了となります。

https://mega.nz/folder/5fwxTaBI#zFNjDTuB4XVVddMXFCWSJQ