kuroの覚え書き

96の個人的覚え書き

MAiX II DOCKをいじってみる

どうもこれに入っているLinuxはTina-LinuxといってOpenWRTに由来する組み込みLinuxらしいとの情報を得た。
Allwinner Tina Linux · GitHub
https://d1.docs.aw-ol.com/en/study/study_1tina/

OpenWRT懐かしい。2008年頃、FONという無線LANをみんなでシェアしようと言う趣旨のプロジェクトがあって、そこで安価で配布された無線LANルータのFoneraという装置があった。このFoneraの基板には意味ありげなピンヘッダが立っていて、それがシリアルコンソールであることに気がついた人たちのあいだで、そのコンソールからファームウェアを流し込んでもとの無線LANルータ機能を上書きしてしまうハックが流行った。そこで使われていたのがOpenWRTであった。基本無線LANルータとしてのファームウェアなんだけど、実態としては組み込みLinuxだということで、無線LANルータとしてではなく、安価なLinuxboxとして使ってしまおうというプロジェクトも派生していった。基板上のパターンを解析してSDカードを乗せるSPI接続を実現したり、シリアル通信でArduinoと接続してIOを制御したり、まさに現在、ラズベリーパイがやっているようなことを先駆けてやっていたのよね。当然GUIが動くほどの能力がルータのSOCにあるはずもなく、すべてCUI。多くのコマンドが入っているBusyBoxを駆使しまくってた。WebサーバとかSDカードを使ったファイル共有サーバとか温湿度計を繋いでエアコンリモート制御とか。

閑話休題

で、MAiX ll DOCKですよ。

BusyBox v1.27.2 () built-in shell (ash)

------run profile file-----
 _   .-')      ('-.            ) (`-.
( '.( OO )_   ( OO ).-.         ( OO ).
 ,--.   ,--.) / . --. /  ,-.-')(_/.  \_)-.
 |   `.'   |  | \-.  \   |  |OO)\  `.'  /
 |         |.-'-'  |  |  |  |  \ \     /\
 |  |'.'|  | \| |_.'  |  |  |(_/  \   \ |
 |  |   |  |  |  .-.  | ,|  |_.' .'    \_)
 |  |   |  |  |  | |  |(_|  |   /  .'.  \
 `--'   `--'  `--' `--'  `--'  '--'   '--'
   __   _
  / /  (_)__  __ ____ __ ------------------------
 / /__/ / _ \/ // /\ \ /  sipeed.com (Neptune)
/____/_/_//_/\_,_//_\_\  ------------------------

ほらBusyBoxじゃん。
ということでかつてのお約束のようにシリアルコンソール接続でログインを試みる。
その前にネットワークにつなぐ設定をしておく。SDカードをカードリーダーで覗くとトップディレクトリにWIFIの設定ファイル wpa_supplicant.conf があるので、SSIDとパスワードを入力しておく。
(追記)技適取れてないので無線接続はしてはいけません。日本語の情報が極端に少ないのはこのせいか。

USBでMacとつなぐと/dev/cu.usbserial-14330が現れるので

cu -l /dev/cu.usbserial-14330 -s 115200

としてやってMAiXをリセットすると

Last login: Fri May 17 13:58:12 on ttys002

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
------run rc.modules file-----
------run rc.final file-----
Load mpp modules
insmod: can't insert '/lib/modules/4.9.118/videobuf2-core.ko': No such file or directory
insmod: can't insert '/lib/modules/4.9.118/videobuf2-memops.ko': No such file or directory
insmod: can't insert '/lib/modules/4.9.118/videobuf2-v4l2.ko': No such file or directory
load /etc/asound.conf ...
alsactl: set_control:1461: Cannot write control '2:0:0:codec trigger playback time value:0' : Operation not permitted
alsactl: set_control:1461: Cannot write control '2:0:0:codec trigger capture time value:0' : Operation not permitted
exist /root/wpa_supplicant.conf
Starting app...
enable android usb
Initializing random number generator... done.
Starting network...
Start dropbear: OK
Starting ntpd: done


BusyBox v1.27.2 () built-in shell (ash)

------run profile file-----
 _   .-')      ('-.            ) (`-.
( '.( OO )_   ( OO ).-.         ( OO ).
 ,--.   ,--.) / . --. /  ,-.-')(_/.  \_)-.
 |   `.'   |  | \-.  \   |  |OO)\  `.'  /
 |         |.-'-'  |  |  |  |  \ \     /\
 |  |'.'|  | \| |_.'  |  |  |(_/  \   \ |
 |  |   |  |  |  .-.  | ,|  |_.' .'    \_)
 |  |   |  |  |  | |  |(_|  |   /  .'.  \
 `--'   `--'  `--' `--'  `--'  '--'   '--'
   __   _
  / /  (_)__  __ ____ __ ------------------------
 / /__/ / _ \/ // /\ \ /  sipeed.com (Neptune)
/____/_/_//_/\_,_//_\_\  ------------------------

root@sipeed:/# WARNING: Logging before InitGoogleLogging() is written to STDERR
I0522 03:02:09.853097   795 dup2SeldomUsedFd.c:20]          <dup2SeldomUsedFdInit> gFdLock init
Successfully initialized wpa_supplicant
udhcpc: started, v1.27.2
udhcpc: sending discover
I0522 03:02:10.799209   795 mpi_sys.c:766]                  <AW_MPI_SYS_SetConf> kfctmpdir is [/tmp]
I0522 03:02:10.800760   795 mpi_sys.c:1195]                 <AW_MPI_SYS_Init> ISP init
I0522 03:02:10.800925   795 mpi_sys.c:1197]                 <AW_MPI_SYS_Init> ISP init done
I0522 03:02:10.807874   795 hwdisplay.c:83]                 <hw_display_init> <(hwd_init 989)d_init:989> 95 hwdisplay.c:989] 
I0522 03:02:10.808255   795 hwdisplay.c:1044]               <hwd_init> <hwd_iniret[0][2,0]ch[2]lyl[0] init: enable[1], screenwin[0,0, 240x240], zorder[16], alpha[mode:0, value:255]
I0522 03:02:10.808458   795 alsa_interface.c:659]           <alsaOpenMixer> open mixer:hw:0
I0522 03:02:10.848054   795 alsa_interface.c:721]           <alsaOpenMixer> set player pa switch level 0
I0522 03:02:10.848312   795 alsa_interface.c:709]           <alsaOpenMixer> set playback vol_val to value: 27
E0522 03:02:10.969903   795 video_buffer_manager.c:211]     <VideoBufMgrCreate> Alloc 20 input frame buffers in list manager.
E0522 03:02:10.970302   795 VideoVirVi_Component.c:481]     <VideoViSetViDevAttr> fps 20 nbufs 3
E0522 03:02:11.001482   795 video_buffer_manager.c:211]     <VideoBufMgrCreate> Alloc 20 input frame buffers in list manager.
E0522 03:02:11.001873   795 VideoVirVi_Component.c:481]     <VideoViSetViDevAttr> fps 20 nbufs 3
I0522 03:02:11.002887   795 hwdisplay.c:1244]               <hwd_get_disp_type>Current the  disp_type:0x1  tv_mode:0x0
I0522 03:02:11.003194   795 hwdisplay.c:1117]               <hwd_layer_request_hlay:0, zorder=0, cnt:2t_hlay:1117> 
I0522 03:02:11.003396   795 mpi_vo.c:1030]                  <AW_MPI_VO_SetVideoLayerAttr> ch[0]lyl[0]:dispRect changed, [0, 0, 320x240]->[0, 0, 240x240]
I0522 03:02:11.003574   795 hwdisplay.c:408]                <hwd_layer_set_rectch[0]lyl[0]: screen_win[0,0, 240x240]
E0522 03:02:11.004062   795 vo.c:683]                       <vo_init> debuf create vo channel[0] success!
I0522 03:02:11.004436   896 Clock_Component.c:1109]         <Clock_ComponentThread> ClockComp state[0x1]->Idle!
E0522 03:02:11.004617   795 vo.c:718]                       <vo_init> debuf create clock channel[0] success!
I0522 03:02:11.004777   896 cedarx_avs_counter.c:148]       <avscounter_start> (f:avscounter_start, l:148) Avscounter status [pause]->[run], pauseDuration[0][0]ms
I0522 03:02:11.004956   795 hwdisplay.c:1117]               <hwd_layer_request_hlay:9, zorder=9, cnt:3t_hlay:1117> 
I0522 03:02:11.005098   795 mpi_vo.c:1030]                  <AW_MPI_VO_SetVideoLayerAttr> ch[2]lyl[1]:dispRect changed, [0, 0, 320x240]->[0, 0, 240x240]
I0522 03:02:11.005194   795 hwdisplay.c:408]                <hwd_layer_set_rectch[2]lyl[1]: screen_win[0,0, 240x240]
I0522 03:02:11.005291   795 mpi_vo.c:1130]                  <AW_MPI_VO_SetVideoLayerAlpha> video layer alpha changed, [0, 128]->[0, 25]
E0522 03:02:11.006791   795 vo.c:454]                       <CreateVoUiLayer> create vo channel[0] success!
udhcpc: sending discover
before paHostApiInitializers[0].
ALSA version (build): 1.1.4.1
ALSA version (runtime): 1.1.4.1
BuildDeviceList: Ignoring ALSA plugin device [cards] of type [unknown]
BuildDeviceList: Found plugin [default] of type [unknown]
BuildDeviceList: Found plugin [sysdefault] of type [unknown]
BuildDeviceList: Found plugin [front] of type [unknown]
BuildDeviceList: Found plugin [rear] of type [unknown]
BuildDeviceList: Found plugin [center_lfe] of type [unknown]
BuildDeviceList: Found plugin [side] of type [unknown]
BuildDeviceList: Found plugin [surround21] of type [unknown]
BuildDeviceList: Found plugin [surround40] of type [unknown]
BuildDeviceList: Found plugin [surround41] of type [unknown]
BuildDeviceList: Found plugin [surround50] of type [unknown]
BuildDeviceList: Found plugin [surround51] of type [unknown]
BuildDeviceList: Found plugin [surround71] of type [unknown]
BuildDeviceList: Found plugin [iec958] of type [unknown]
BuildDeviceList: Found plugin [spdif] of type [unknown]
BuildDeviceList: Found plugin [hdmi] of type [unknown]
BuildDeviceList: Found plugin [dmix] of type [unknown]
BuildDeviceList: Ignoring ALSA plugin device [dsnoop] of type [unknown]
BuildDeviceList: Found plugin [modem] of type [unknown]
BuildDeviceList: Found plugin [phoneline] of type [unknown]
BuildDeviceList: Ignoring ALSA plugin device [hw] of type [hw]
BuildDeviceList: Ignoring ALSA plugin device [plughw] of type [plug]
BuildDeviceList: Ignoring ALSA plugin device [plug] of type [plug]
BuildDeviceList: Ignoring ALSA plugin device [shm] of type [shm]
BuildDeviceList: Ignoring ALSA plugin device [tee] of type [file]
BuildDeviceList: Ignoring ALSA plugin device [file] of type [file]
BuildDeviceList: Ignoring ALSA plugin device [null] of type [null]
BuildDeviceList: Filling device info for 19 devices
FillInDevInfo: Filling device info for: sun8iw19-codec: - (hw:0,0)
GropeDevice: collecting info ..
GropeDevice: collecting info ..
Default input device: sun8iw19-codec: - (hw:0,0)
Default output device: sun8iw19-codec: - (hw:0,0)
FillInDevInfo: Adding device sun8iw19-codec: - (hw:0,0): 0
FillInDevInfo: Filling device info for: sysdefault
GropeDevice: collecting info ..
GropeDevice: Limiting number of plugin channels to 128
GropeDevice: collecting info ..
GropeDevice: Limiting number of plugin channels to 128
FillInDevInfo: Adding device sysdefault: 1
FillInDevInfo: Filling device info for: front
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.front
OpenPcm: Opened device 'front' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: front, all channels == 0
FillInDevInfo: Filling device info for: rear
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
OpenPcm: Opened device 'rear' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: rear, all channels == 0
FillInDevInfo: Filling device info for: center_lfe
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
OpenPcm: Opened device 'center_lfe' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: center_lfe, all channels == 0
FillInDevInfo: Filling device info for: side
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
OpenPcm: Opened device 'side' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: side, all channels == 0
FillInDevInfo: Filling device info for: surround21
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround21
OpenPcm: Opened device 'surround21' ptr[0] - result: [-2:No such file or directory]
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround21
OpenPcm: Opened device 'surround21' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: surround21, all channels == 0
FillInDevInfo: Filling device info for: surround40
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround40
OpenPcm: Opened device 'surround40' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: surround40, all channels == 0
FillInDevInfo: Filling device info for: surround41
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround41
OpenPcm: Opened device 'surround41' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: surround41, all channels == 0
FillInDevInfo: Filling device info for: surround50
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround50
OpenPcm: Opened device 'surround50' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: surround50, all channels == 0
FillInDevInfo: Filling device info for: surround51
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround51
OpenPcm: Opened device 'surround51' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: surround51, all channels == 0
FillInDevInfo: Filling device info for: surround71
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround71
OpenPcm: Opened device 'surround71' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: surround71, all channels == 0
FillInDevInfo: Filling device info for: iec958
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.iec958
OpenPcm: Opened device 'iec958' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: iec958, all channels == 0
FillInDevInfo: Filling device info for: spdif
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.iec958
OpenPcm: Opened device 'spdif' ptr[0] - result: [-2:No such file or directory]
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.iec958
OpenPcm: Opened device 'spdif' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: spdif, all channels == 0
FillInDevInfo: Filling device info for: hdmi
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
OpenPcm: Opened device 'hdmi' ptr[0] - result: [-2:No such file or directory]
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
OpenPcm: Opened device 'hdmi' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: hdmi, all channels == 0
FillInDevInfo: Filling device info for: modem
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
OpenPcm: Opened device 'modem' ptr[0] - result: [-2:No such file or directory]
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
OpenPcm: Opened device 'modem' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: modem, all channels == 0
FillInDevInfo: Filling device info for: phoneline
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
OpenPcm: Opened device 'phoneline' ptr[0] - result: [-2:No such file or directory]
ALSA lib pcm.c:2501:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
OpenPcm: Opened device 'phoneline' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: phoneline, all channels == 0
FillInDevInfo: Filling device info for: default
GropeDevice: collecting info ..
GropeDevice: Limiting number of plugin channels to 128
GropeDevice: collecting info ..
GropeDevice: Limiting number of plugin channels to 128
Default input device: default
Default output device: default
FillInDevInfo: Adding device default: 2
FillInDevInfo: Filling device info for: dmix
ALSA lib pcm_direct.c:1421:(snd1_pcm_direct_initialize_poll_fd) unable to open timer 'hw:CLASS=3,SCLASS=0,CARD=0,DEV=0,SUBDEV=0'
ALSA lib pcm_dmix.c:1183:(snd_pcm_dmix_open) unable to initialize poll_fd
OpenPcm: Opened device 'dmix' ptr[0] - result: [-2:No such file or directory]
FillInDevInfo: Skipped device: dmix, all channels == 0
BuildDeviceList: Building device list took 0.692696 seconds
after paHostApiInitializers[0].
before paHostApiInitializers[1].
PaOSS BuildDeviceList: Total number of devices found: 0
after paHostApiInitializers[1].
PaAlsaStreamComponent_Initialize: Host Chans P 2
AlsaOpen: Opening device default
PaAlsaStreamComponent_InitialConfigure: device MMAP SND_PCM_ACCESS_MMAP_INTERLEAVED: YES
PaAlsaStreamComponent_InitialConfigure: device MMAP SND_PCM_ACCESS_MMAP_NONINTERLEAVED: YES
PaAlsaStreamComponent_InitialConfigure: device can MMAP: YES
PaAlsaStreamComponent_DetermineFramesPerBuffer: user-buffer (frames)           = 1024
PaAlsaStreamComponent_DetermineFramesPerBuffer: user-buffer (sec)              = 0.046440
PaAlsaStreamComponent_DetermineFramesPerBuffer: suggested latency (sec)        = 0.008707
PaAlsaStreamComponent_DetermineFramesPerBuffer: suggested host buffer (frames) = 2048
PaAlsaStreamComponent_DetermineFramesPerBuffer: suggested host buffer (sec)    = 0.092880
PaAlsaStreamComponent_DetermineFramesPerBuffer: periods min = 2, max = 512, req = 4 
PaAlsaStreamComponent_DetermineFramesPerBuffer: suggested host buffer period   = 1024 
PaAlsaStreamComponent_DetermineFramesPerBuffer: device period minimum          = 64
PaAlsaStreamComponent_DetermineFramesPerBuffer: device period maximum          = 16384
PaAlsaStreamComponent_DetermineFramesPerBuffer: host buffer period             = 1024
PaAlsaStreamComponent_DetermineFramesPerBuffer: host buffer period latency     = 0.046440
PaAlsaStream_Configure: Playback period size: 1024, latency: 0.046440
OpenStream: Stream: framesPerBuffer = 1024, maxFramesPerHostBuffer = 1024, latency i=0.000000, o=0.046440
I0522 03:02:15.532507   891 VideoVirVi_Component.c:360]     <DoVideoViReturnAllValidFrames> release [1]validFrames
I0522 03:02:15.532899   891 VideoVirVi_Component.c:1077]    <Vi_ComponentThread> wait using frame return done
W0522 03:02:15.543506   890 videoInputHw.c:4128]            <VideoInputHw_CapThread> VIPP[0], No Virvi Component, drop this one yuv data.
E0522 03:02:15.548595   795 video_buffer_manager.c:211]     <VideoBufMgrCreate> Alloc 20 input frame buffers in list manager.
E0522 03:02:15.548939   795 VideoVirVi_Component.c:481]     <VideoViSetViDevAttr> fps 20 nbufs 3
I0522 03:02:16.274793   897 video_render_linux.cpp:224]     <vr4l_init> mDisplayFormat[0x200], new CedarXNativeRenderer
I0522 03:02:16.275141   897 CedarXNativeRenderer.cpp:174]   <CedarXNativeRenderer> hwc disp fmt[0x80], color space:260
I0522 03:02:16.275300   897 hwdisplay.c:239]                <hwd_layer_set_src>x: 0, y: 0, width: 0xf0, height: 0xf0
I0522 03:02:16.275398   897 hwdisplay.c:246]                <hwd_layer_set_src>width: 0xf000000000, height: 0xf000000000
I0522 03:02:16.275480   897 hwdisplay.c:366]                <hwd_layer_set_src>set fb.format 128 0, color_space 260 end, size0[240x240], size1[0x0]
E0522 03:02:16.275611   897 vo.c:281]                       <VoUiCallbackWrapper> debuf vo report video display size[240x240]
I0522 03:02:16.275724   897 VideoRender_Component.c:2316]   <VideoRender_ComponentThread> init video_render, param: displayRect[0,0][240x240], bufSize[240x240], vdecColorFormat[0xb]
I0522 03:02:16.275821   897 mpi_vo.c:508]                   <VideoRenderEventHandler> KeyFrameDecoded, pts[0]us
E0522 03:02:16.276000   897 vo.c:286]                       <VoUiCallbackWrapper> debuf vo report rendering start
udhcpc: sending discover
udhcpc: sending select for 10.0.1.201
udhcpc: sending select for 10.0.1.201
udhcpc: lease of 10.0.1.201 obtained, lease time 172800
udhcpc: ifconfig wlan0 10.0.1.201 netmask 255.255.255.0 broadcast +
udhcpc: setting default routers: 10.0.1.1

root@sipeed:/#  ls
bin          home         overlay      rom          squashfs     usr
data         lib          proc         root         swapfile     var
dev          lost+found   pseudo_init  run          sys
etc          mnt          rdinit       sbin         tmp

これは普通にLinux boxとして使えそうだ。エッジAIとして使うかどうかはさておき。

追記
とりあえずできること
viでテキスト編集

できないこと
すでに入っている以外のアプリケーションのopkgでのインストール

とりあえずファイルの転送手段としてネットワーク越しは一旦おいておくことにしてまずUSBでの転送を考える。
このデバイスにはUSB-Cが2つついていて、1つを電源&シリアルコンソールとして使っている。もう1つのUSBはOTGということだが、そのままではPCからUSBデバイスとして認識されるモードとなっているため、これをUSBホストに変えてやる。

echo "usb_host" > /sys/devices/platform/soc/usbc0/otg_role

これでOK。
ひとまずSDカードをリーダに入れて接続してみる。
exFATはだめっぽい
FAT32なら

mount -t vfat /dev/sda1 ./media

であらかじめ作っておいたマウントポイント./mediaにマウントすることができた。
これで、とりあえずMacpythonコードを書いてMAiX IIに移して実行。ということは可能になった。アプリのインストールもできるかな。

しかし本格的に活用するなら、やはり無線LANに繋がないとどうにもならないだろうな。
一応無線LANチップ自体は技適が取れているようなので、
総務省 電波利用ホームページ|その他|技適未取得機器を用いた実験等の特例制度
こちらで申請すれば短期間なら試験できるようだけど、180日経ったら廃止申請を出すとか面倒すぎるので、やっぱり使い物にはならない。せめてUSB無線子機を繋いで使えるようにできればいいのだが、それもなかなかハードルが高い。

追記
色々と忘れてしまっていたのだが、OpenWRTではSquashFSを使っているため、読み込み専用でファイルへの書き込みができない。なので、設定を書き換えようが、なにかインストールしようが、電源を切るともとに戻ってしまう。overlayとかchrootを使うんだったかなあ。忘却の彼方。