WSL上のFedoraでDockerを使ってみたい(残念ながら、今回も失敗)

WSL上のFedoraでDockerを使ってみたい。

$ docker run hello-world
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

残念ながら、systemdがPID 1で動作していないので、docker runが動かない。
対処方法は、以下のURLでgenieを使えば良いことが判明。
https://www.tomoyan.net/windows/wsl

$ sudo dnf install git
$ cd ~
$ git clone https://github.com/arkane-systems/genie.git
$ cd genie

ここでMakefileを見ると、
make package-fedora
すればよさそうだとわかる。しかし、ビルド環境がないから、そちらを先にinstallする。
$ sudo dnf install make
$ sudo dnf install rpmdevtools
このrpmdevtoolsってのは、

qiita.com

を参考にインストール。

$ make package-fedora
すると、また違うエラー
error: Failed build dependencies:
dotnet-sdk-5.0 is needed by genie-1.43-1.fc34.x86_64

依存性をインストール
$ sudo dnf install dotnet-sdk-5.0

$ make package-fedora
すると、さらに違うエラー
+ install -m 0755 -o root othersrc/scripts/map-user-runtime-dir.sh /home/xxxx/rpmbuild/BUILDROOT/genie-1.43-1.fc34.x86_64/usr/libexec/genie
install: cannot change ownership of '/home/xxxx/rpmbuild/BUILDROOT/genie-1.43-1.fc34.x86_64/usr/libexec/genie/map-user-runtime-dir.sh': Operation not permitted

これって、root権限が必要ってこと?面倒だな。
$ sudo make package-fedora
すると、またまた違うエラー
install -m 0644 -vp othersrc/usr-lib/binfmt.d/WSLInterop.conf' /root/rpmbuild/BUILDROOT/genie-1.43-1.fc34.x86_64/usr/lib/binfmt.d/
install: cannot stat 'othersrc/usr-lib/tmpfiles.d/genie-stub-resolv.conf /root/rpmbuild/BUILDROOT/genie-1.43-1.fc34.x86_64/usr/lib/tmpfiles.d/'$'\n''install -m 0644 -vp othersrc/usr-lib/binfmt.d/WSLInterop.conf': No such file or directory

$ ls othersrc/usr-lib/binfmt.d/
WSLInterop.conf
あるんだけど。
$ sudo ls /root/rpmbuild/BUILD/genie-1.43/othersrc/usr-lib/binfmt.d
WSLInterop.conf
こっちにもあるな。

 

どうやらgenie.specが腐っている感じ。

$ diff -uNr package/fedora/genie.spec.old package/fedora/genie.spec
--- package/fedora/genie.spec.old 2021-07-23 18:50:48.368428000 +0900
+++ package/fedora/genie.spec 2021-07-23 18:51:16.563295900 +0900
@@ -52,8 +52,8 @@
install -m 0644 -vp othersrc/lib-systemd-system/wslg-xwayland.service %{buildroot}%{_unitdir}
install -m 0644 -vp othersrc/lib-systemd-system/wslg-xwayland.socket %{buildroot}%{_unitdir}
install -m 0644 -vp othersrc/lib-systemd-system/user-runtime-dir@.service.d/override.conf %{buildroot}%{_unitdir}/user-runtime-dir@.service.d
-install -m 0644 -vp othersrc/usr-lib/tmpfiles.d/genie-stub-resolv.conf" %{buildroot}%{_exec_prefix}/lib/tmpfiles.d/
-install -m 0644 -vp othersrc/usr-lib/binfmt.d/WSLInterop.conf" %{buildroot}%{_exec_prefix}/lib/binfmt.d/
+install -m 0644 -vp othersrc/usr-lib/tmpfiles.d/genie-stub-resolv.conf %{buildroot}%{_exec_prefix}/lib/tmpfiles.d/
+install -m 0644 -vp othersrc/usr-lib/binfmt.d/WSLInterop.conf %{buildroot}%{_exec_prefix}/lib/binfmt.d/
ln -sf %{_libexecdir}/%{name}/%{name} %{buildroot}%{_bindir}/%{name}
ln -sf %{_libexecdir}/%{name}/80-genie-envar.sh %{buildroot}%{_exec_prefix}/lib/systemd/system-environment-generators/
ln -sf %{_libexecdir}/%{name}/80-genie-envar.sh %{buildroot}%{_exec_prefix}/lib/systemd/user-environment-generators/

 

もとに戻ってビルド
$ sudo make package-fedora
$ ls out/fedora/
genie-1.43-1.fc34.x86_64.rpm

無事に完成。
早速インストール。
$ sudo rpm -ivh out/fedora/genie-1.43-1.fc34.x86_64.rpm
error: Failed dependencies:
daemonize is needed by genie-1.43-1.fc34.x86_64
systemd-container is needed by genie-1.43-1.fc34.x86_64

 

依存関係の解決。

$ sudo dnf install daemonize systemd-container

再チャレンジ。
$ sudo rpm -ivh out/fedora/genie-1.43-1.fc34.x86_64.rpm


$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 8948 396 ? Ssl 17:15 0:00 /init
root 745 0.0 0.0 8948 232 tty1 Ss 17:49 0:00 /init

$ sudo genie -s
genie: systemd is not supported under WSL 1.

えっ? WSL 1環境だったのか?

 

ということで、古いPCではBIOSに仮想化がないのでダメっぽい。

WSLでFedoraを使う方法があるらしい

元ネタは 

var.blog.jp

こちらの記事にあるように、Fedora-Remix-for-WSLというのがある。

github.com

今日ダウンロードしたのはこちら。Fedora-Remix-for-WSL-SL_34.5.6.0_x64_arm64.msixbundle

ダブルクリックでインストーラが起動するので、起動するまでしばらく待ちます。

無事に起動したらFedoraでした。いや、便利な世の中になっていました。

$HOMEにwinhomeというシンボリックリンクがあり、Windowsのユーザーフォルダへリンクされていました。いや、便利な世の中になっていました。

dnf updateなんかも使えるので、最新を試せます。いや、便利な世の中になっていました。

WSLのDebianをFedoraにしようとして失敗した話

WSLではDebianWindows Store経由でインストールできるが、Fedoraは見つからなかった。なので、Debianを入れて、rpmを使えるようにしてFedoraに変更することを考えた。今回は失敗に終わったので、このまま参考にしないほうが良いと思うが、備忘録として残す。

 

WSLでDebianを動かすまでは、たくさんの人が紹介しているので割愛。

 

Debianをインストールしてからの段取りとして、まずは最新版に更新。

$ sudo apt update
$ sudo apt upgrade

 

開発環境をインストール。

$ sudo apt install build-essential

ついでにwgetもインストール。

$ sudo apt install wget

 

rpmのソースを取得。

$ wget https://ftp.osuosl.org/pub/rpm/releases/rpm-4.16.x/rpm-4.16.1.3.tar.bz2

 

そしてビルド開始。

$ tar -xf rpm-4.16.1.3.tar.bz2
$ cd rpm-4.16.1.3
$ ./configure --prefix=/usr

 

まあ、たくさんエラーが出るので、ビルドに必要なものをインストール。

$ sudo apt install zlib1g-dev

$ sudo apt install libgcrypt-dev

$ sudo apt install libmagic-dev

$ sudo apt install libpopt-dev

$ sudo apt install libarchive-dev

$ sudo apt install libdb5.3-dev

$ sudo apt install liblua5.3-dev

 

libluaのpkg-config用のファイル名がconfigure.acで指定しているものと違うので、シンボリックリンクで回避。

$ pushd /usr/lib/x86_64-linux-gnu/pkgconfig/
$ sudo ln -sf lua5.3.pc lua.pc
$ popd

 

これで一応ビルドできるようにはなる。しかし、動作しないので、Fedorarpm.specを参考にする。

$ wget https://dl.fedoraproject.org/pub/fedora/linux/releases/34/Everything/source/tree/Packages/r/rpm-4.16.1.3-1.fc34.src.rpm
$ rpm -ivh rpm-4.16.1.3-1.fc34.src.rpm

 

そして、以下のパッケージも追加。

 まずは、autoreconf用

$ sudo apt install gettext
$ sudo apt install autopoint

 

$ sudo apt install zstd
$ sudo apt install libzstd-dev

$ sudo apt install libssl-dev

$ sudo apt install libsqlite3-dev

$ sudo apt install python3

$ sudo apt install libpython3.7-dev

$ sudo apt install libselinux1-dev

 

libimaevmはあきらめて、rpm.specの以下の行削除。
%{?with_libimaevm: --with-imaevm} \
%bcond_without libimaevm

 

$ sudo apt install libcap-dev

$ sudo apt install libacl1-dev

 

これでrpmのビルドができるようになったので、もう一度ソースからビルド。

$ ./configure --prefix=/usr
$ make
$ sudo make install

 

これでrpmが使えるようになった。

 

最終的には、Fedoraバイナリをそのまま使いたいので、rpmパッケージをrpmコマンドで--nodepsを使わずにインストールしてみた。

$ sudo rpm -ivh rpm-4.16.1.3-1.fc34.x86_64.rpm coreutils-8.32-21.fc34.x86_64.rpm curl-7.76.0-1.fc34.x86_64.rpm popt-1.18-4.fc34.x86_64.rpm glibc-2.33-5.fc34.x86_64.rpm glibc-common-2.33-5.fc34.x86_64.rpm glibc-langpack-ja-2.33-5.fc34.x86_64.rpm coreutils-common-8.32-21.fc34.x86_64.rpm basesystem-11-11.fc34.noarch.rpm tzdata-2021a-1.fc34.noarch.rpm setup-2.13.7-3.fc34.noarch.rpm fedora-release-34-1.noarch.rpm fedora-release-common-34-1.noarch.rpm fedora-release-identity-basic-34-1.noarch.rpm filesystem-3.14-5.fc34.x86_64.rpm fedora-repos-34-1.noarch.rpm fedora-gpg-keys-34-1.noarch.rpm libarchive-3.5.1-2.fc34.x86_64.rpm libacl-2.3.1-1.fc34.x86_64.rpm libcap-2.48-2.fc34.x86_64.rpm libattr-2.5.1-1.fc34.x86_64.rpm openssl-libs-1.1.1k-1.fc34.x86_64.rpm rpm-libs-4.16.1.3-1.fc34.x86_64.rpm ca-certificates-2020.2.41-7.fc34.noarch.rpm crypto-policies-20210213-1.git5c710c0.fc34.noarch.rpm grep-3.6-2.fc34.x86_64.rpm sed-4.8-7.fc34.x86_64.rpm p11-kit-0.23.22-3.fc34.x86_64.rpm p11-kit-trust-0.23.22-3.fc34.x86_64.rpm alternatives-1.15-2.fc34.x86_64.rpm gmp-6.2.0-6.fc34.x86_64.rpm libcurl-7.76.0-1.fc34.x86_64.rpm zlib-1.2.11-26.fc34.x86_64.rpm libgcc-11.0.1-0.3.fc34.x86_64.rpm bzip2-libs-1.0.8-6.fc34.x86_64.rpm lz4-libs-1.9.3-2.fc34.x86_64.rpm xz-libs-5.2.5-5.fc34.x86_64.rpm libxml2-2.9.10-10.fc34.x86_64.rpm libzstd-1.4.9-1.fc34.x86_64.rpm audit-libs-3.0.1-2.fc34.x86_64.rpm lua-libs-5.4.2-2.fc34.x86_64.rpm sqlite-libs-3.34.1-2.fc34.x86_64.rpm libmetalink-0.1.3-14.fc34.x86_64.rpm pcre-8.44-3.fc34.1.x86_64.rpm libffi-3.1-28.fc34.x86_64.rpm libtasn1-4.16.0-4.fc34.x86_64.rpm libbrotli-1.0.9-4.fc34.x86_64.rpm libcom_err-1.45.6-5.fc34.x86_64.rpm krb5-libs-1.19.1-3.fc34.x86_64.rpm libidn2-2.3.0-5.fc34.x86_64.rpm gawk-5.1.0-3.fc34.x86_64.rpm openldap-2.4.57-2.fc34.x86_64.rpm libnghttp2-1.43.0-2.fc34.x86_64.rpm libpsl-0.21.1-3.fc34.x86_64.rpm libssh-0.9.5-2.fc34.x86_64.rpm libselinux-3.2-1.fc34.x86_64.rpm keyutils-libs-1.6.1-2.fc34.x86_64.rpm pcre2-10.36-4.fc34.x86_64.rpm pcre2-syntax-10.36-4.fc34.noarch.rpm libssh-config-0.9.5-2.fc34.noarch.rpm libsepol-3.2-1.fc34.x86_64.rpm publicsuffix-list-dafsa-20190417-5.fc34.noarch.rpm libcap-ng-0.8.2-4.fc34.x86_64.rpm libverto-0.3.2-1.fc34.x86_64.rpm libunistring-0.9.10-10.fc34.x86_64.rpm expat-2.2.10-2.fc34.x86_64.rpm mpfr-4.1.0-5.fc34.x86_64.rpm libsigsegv-2.13-2.fc34.x86_64.rpm readline-8.1-2.fc34.x86_64.rpm ncurses-libs-6.2-4.20200222.fc34.x86_64.rpm ncurses-base-6.2-4.20200222.fc34.noarch.rpm cyrus-sasl-lib-2.1.27-8.fc34.x86_64.rpm libxcrypt-4.4.18-1.fc34.x86_64.rpm libdb-5.3.28-46.fc34.x86_64.rpm

 

残念ながら、この実行中にerrorが大量に発生し始め、libc関係のバージョンミスマッチでrpmがこけたのち、coreutilsのlsとかcpとかも利用不可能になりました。

 

LFSみたいにクロス環境で構築していくか、src.rpmとnoarch.rpmを使ってひたすらビルドしてインストールする方法が良いのかもしれません。今回はできなかったということで…

WSL上のDebianでgnome起動

 ネット上の記事ではUbuntuが多いけど、Debianでもgnomeは起動した。

$ sudo apt install gnome

して、

VcXsrvをインストールして、

.bashrcに以下を追加して、

 

# set DISPLAY environment
export DISPLAY=127.0.0.1:0.0

# set XDG_SESSION_TYPE
export XDG_SESSION_TYPE=x11

# set LIBGL_ALWAYS_INDIRECT
export LIBGL_ALWAYS_INDIREST

 

VcXsrvをフルスクリーンまたは一つの大きな窓で起動して、

$ gnome-session

で無事に起動する。

 

困ったのが、gnome-sessionでgnome-terminalを起動するとgnome-sessionが落ちること。マルチウィンドウのgnome-terminalは落ちないんだけどな。

あとは、Debianを起動すると、毎回キーボードが英語にされること。Winキー+SPACEで治るけど、かなり面倒。

 

dbus関係のエラーも出てるから、もう少し調べてみるか。

Raspberry Pi を休止してAndroidの勉強してたらスマホが壊れた。ということで、Raspberry Piの勉強を再開しようと思い再設定中。久々に電源入れたら、なんか調子が悪い。再インストールから開始。とはいうものの、特に興味がある分野がないから、Pythonの勉強でもするつもり。

Raspbery Pi 3 で Python3環境にOpenCV3を突っ込んでみる

これらは、Google+でチョコチョコ書いた内容をまとめただけ。

 

Raspberry Pi 3 のPythonのバージョン

>>> import platform
>>> platform.python_version()
'3.5.3'

 

>>> import cv2
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
import cv2
ImportError: No module named 'cv2'

 

当然入ってない。

コマンドプロンプトからpip3でinstallする。

$ sudo pip3 install opencv-python
Collecting opencv-python
Downloading https://www.piwheels.org/simple/opencv-python/opencv_python-3.4.1.15-cp35-cp35m-linux_armv7l.whl (7.5MB)
100% |████████████████████████████████| 7.5MB 16kB/s
Requirement already satisfied: numpy>=1.12.1 in /usr/lib/python3/dist-packages (from opencv-python)
Installing collected packages: opencv-python
Successfully installed opencv-python-3.4.1.15

>>> import cv2
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
import cv2
File "/usr/local/lib/python3.5/dist-packages/cv2/__init__.py", line 3, in <module>
from .cv2 import *
ImportError: libcblas.so.3: cannot open shared object file: No such file or directory

ライブラリが足りない。

 

apt-cache searchなどで探す。そして、libcblas3 libjasper1 libqt4-testをインストール。芋づる式にいろいろインストール。

$ sudo apt-get install libcblas3 libjasper1 libqt4-test

(略)

 

>>> import cv2
>>> cv2.__version__
'3.4.1'

これで、Python3+OpenCV3の環境の出来上がり。

 

picameraを使って静止画の取り込み。

----ここから----

import cv2
import picamera
import numpy

camera = picamera.PiCamera()
image = numpy.empty(camera.resolution.width * camera.resolution.height * 3, dtype=numpy.uint8)
camera.capture(image, 'bgr')
image = image.reshape( (camera.resolution.height, camera.resolution.width, 3) )
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

----ここまで----

 

picameraを使って動画表示

----ここから----

import cv2
import picamera
import numpy

camera = picamera.PiCamera()
image = numpy.empty(camera.resolution.width * camera.resolution.height * 3, dtype=numpy.uint8)
while (True):
    camera.capture(image, 'bgr')
    image = image.reshape( (camera.resolution.height, camera.resolution.width, 3) )
    cv2.imshow("image", image)
    if cv2.waitKey(1) >= 1 :
        break;
cv2.destroyAllWindows()

----ここまで----

後は、適当に遊びます。

Raspberry Pi 3の感想など

約1ヶ月 Raspberry Pi 3で遊んでみた。カメラモジュールや3inchモニタもつけてみた。ネットにはたくさん情報がある。だから、そんなに困らない。ただ、情報には鮮度があるようで、新しく更新された情報が新しいわけではなく、古い情報を使っている場合もあるので、試行錯誤は必要になるかな?

 

Raspberry Pi 3 で遊ぶという観点で、Linux From Scratchを試してみた。

PiLFS - Linux From Scratch on the Raspberry Pi

多少嵌るところはあるかもしれないけど、Linux From Scratchの日本語ドキュメントとPiLFSのサイトの情報を丁寧に読めば大丈夫。しかし、PiLFSはSVN形式でRaspbianのsystemdとは異なるから、勉強にはなるけど使わなくなるかな。時間もかかるし、発熱も心配なぐらいだから、一通りLinuxの起動やファイルシステムや開発環境を理解するために一度やれば十分だと思う。

 

開発はPython中心。でも、Python 2が主流かな。UIもRaspbianなLXDEなので、gtk+2になると思う。枯れた技術を学ぶには良いかもしれない。私はできるだけ最新を選びたいので、Pythonで遊ぶ。情報量は減るが、以外に最新情報が多い気がする。

 

さて、これ以降は、自分のための設定内容です。2018/5/27現在の内容だから、しばらくすると古い内容になる可能性が高い。

 

母艦として、Windows7を利用している。DiskImageを書くには、

https://sourceforge.net/projects/win32diskimager/

Raspbianは本家から。

Download Raspbian for Raspberry Pi

SSH

PuTTY-ranvis - Ranvis software

VNC

Download VNC Viewer | VNC Connect

ファイル共有はWinSCPを使う

WinSCP プロジェクト日本語トップページ - OSDN

これだけあれば、基本的な問題はない。

 

一度だけHDMI経由でモニタにつなぎ、キーボードとマウスを接続して起動。Desktopが起動したら、メニューで設定を選ぶか、

$ sudo rc_gui

で設定画面を起動。Interface でssh vncを有効にする。localizationなども日本語にしておけば楽かも。vncさえあれば、後はWindowsから何とかまる。

 

日本語入力のために、fxict-mozcを入れる。これは、開発が止まっているみたい。まあ、使えるからいいか。

Fcitx - Fcitx

$ sudo apt-get install fcitx-mozc

 

文字化けするのでIPAフォント群を入れる。

IPAフォント:IPA 独立行政法人 情報処理推進機構

$ sudo apt-get install fonts-ipafont

 

後は、最新状態にする。

$ sudo apt-get update

$ sudo apt-get upgrade

$ sudo apt-get dist-upgrade

$ sudo rpi-update

$ sudo apt autoremove

これで、基本的な設定は完了。