2019.08.12

ZYNQのWebsocketのアプリを作り、速度を測定した

自分のアプリを作りたいわけですが、まずはlibwebsocketsのサンプルプログラムを見てみます。libwebsockets\minimal-examples\ws-server\ 配下のディレクトリにサーバ側のサンプルプログラムがたくさんあり、何が何だかわかりにくいのですがminimal-ws-server、minimal-ws-server-echo、minimal-ws-server-pmdあたりを参考にしました。

Projects

要約すると、libwebsockets(以下、LWSと略す)のプログラムは、

struct lws_context_creation_info info;

という構造体を作り、そのinfoの各種パラメータを設定して、

struct lws_context *context = lws_create_context(&info);

を作ります。

そして、

lws_service(context, タイムアウト[ms]);

でサーバを起動します。

基本的にコールバックで動いていて、コールバックされる関数は

info.protocols = protocols;

でprotocolsという構造体の中にプロトコル名やバッファサイズと共に格納されています。

{ \
"protocol-name", \
callback_func, \
sizeof(struct per_session_data__minimal), \
128, \
0, NULL, 0 \
}

そして、このプロトコルは1つのサーバのポートに複数登録できます。例えば、HTTPと、独自のWebsocketプロトコルの2つという具合にです。

コールバック関数は以下のようなプロトタイプをしています。

static int callback_func(struct lws *wsi, enum lws_callback_reasons reason,
void *user, void *in, size_t len);

wsiというのはすべての情報が詰まったハンドルのようなもの。reasonがコールバックが呼び出された理由です。

処理するべきreasonは

  • LWS_CALLBACK_PROTOCOL_INIT
  • LWS_CALLBACK_PROTOCOL_DESTROY
  • LWS_CALLBACK_ESTABLISHED
  • LWS_CALLBACK_CLOSED
  • LWS_CALLBACK_SERVER_WRITEABLE
  • LWS_CALLBACK_RECEIVE

です。LWS_CALLBACK_PROTOCOL_INITは最初に呼び出され、lws_protocol_vh_priv_zalloc関数を使ってプロトコルごとに必要なローカルのメモリを確保します。リングバッファを作成したりするのもここです。LWS_CALLBACK_ESTABLISHEDは、通信のセッションが貼られると呼び出されます。

クライアントから何かデータを受信するとLWS_CALLBACK_RECEIVEが呼び出されます。inにlenバイトのデータが入っているのでmemcpyか何かして取り出します。

サーバからクライアントにデータを送るにはlws_write()を使うのですが、この関数はLWS_CALLBACK_SERVER_WRITEABLEの中で呼び出すようです。

つまり、何かのデータを受信して、それを処理してクライアントに応答を返したいという場合、RECEIVEの中で送信関数を呼び出すのではなく、次に送信可能になった時に送り出してもらうように登録するというふうにします。

登録するのが

lws_callback_on_writable(wsi);

で、呼び出されたLWS_CALLBACK_SERVER_WRITEABLEの中で

lws_write(wsi, バッファアドレス + LWS_PRE, 長さ, LWS_WRITE_TEXTまたはLWS_WRITE_BINARY);

とします。

気を付けなければならないのは、送信したデータが100バイトのときバッファは100+LWS_PRE(=16)バイトを確保しておく必要があり、送信データは&buf[LWS_PRE]から書き込んでおきます。websocketのデータにはヘッダが付くので、そのヘッダの分をバッファの先頭に付けれ置かなければならないようです。ユーザがヘッダを何かする必要はありません。mallocで確保したままの状態で構いません。

さて、Javascriptからトリガを与えて、ZYNQ上のwebsocketサーバが応答を返すプログラムを作り、どのくらいのスループットが出るのかを試してみました。ZYNQ側はLAN9514接続の100BASE-TX、PC側はGitabitEtherです。

Speed

パケットサイズが1000バイトのときは0.8Mbyte、10kバイトのときは2.1MByte、100kバイトのときは2.2MByte、1Mバイトのときも2.2MByteでした。

すなわち、ZYNQのUSB経由の100Mイーサでも2.1~2.2Mバイト/秒の速度が出ていました。ボトルネックがZYNQのCPUの処理速度か、USB経由のLANか、ブラウザのJavascriptかはわかりませんが、手軽に動かすには十分な速度が出ると思っていいでしょう。

初期化の際のrx_buffer_sizeとtx_buffer_sizeをともに増やしてみました。転送速度は、

  • フレームサイズ1000バイトのとき・・0.8MB/sec
  • フレームサイズ1000バイトのとき・・3.8MB/sec
  • フレームサイズ100kバイトのとき・・7.8MB/sec
  • フレームサイズ1Mバイトのとき・・9.7MB/sec

・・ちょっと速すぎる気がします。

詳しいことは後日改めて計測することにしましょう。

 

| | コメント (0)

2019.08.11

ZYNQでwebsocketを動かす

Cosmo-Zの近代化のため、ZYNQでwebsocketを動かそうとしています。

websocketというのは、Javascriptとサーバとの間で通信をするための仕組みですが、ajaxと比べて

  • サーバからクライアント(ブラウザ)にデータを送ることができる
  • 反応が早い

というメリットがあります。

websocketのプロトコルは結構面倒なので、自分で作るよりも既存のライブラリを使ったほうがはるかに簡単にできます。(以前、MITOUJTAGオンライン用に自前のwebsocketを作ったが、大きなサイズのデータの転送では怪しかった)

使ったライブラリはlibwebsocketsというもの。最新バージョンはv3.1だと思われます。ネットにある様々なソースの断片はv3.1でないものが多いので、そのままでは動かない可能性があるでしょう。

Cosmo-Zで試したいところですが、まずは手元にあったZynqberryで実験します。

本体のインストールの前に、

$ apt install libssl-dev
$ apt install cmake

でOpenSSLの開発パッケージとcmakeを入れておきます。

それから、以下のコマンドでダウンロードとビルド、インストールを行います。

$ sudo git clone https://github.com/warmcat/libwebsockets
$ cd libwebsockets
$ mkdir build
$ cd build
$ cmake .. & make
$ sudo make install

git cloneのダウンロード先は、https://libwebsockets.org/repo/libwebsocketsではなく、https://github.com/warmcat/libwebsockets です。libwebsockets.orgのほうにすると、

root@zynqberry:~# sudo git clone https://libwebsockets.org/repo/libwebsockets
Cloning into 'libwebsockets'...
remote: Enumerating objects: 28888, done.
remote: Counting objects: 100% (28888/28888), done.
remote: Compressing objects: 100% (7594/7594), done.
error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly terminated.
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

というエラーが出て、どのようにしてもインストールできませんでした。(Windowsのgitからcloneしても同様にダメなので、ZYNQのgitが壊れているのではなさそう)

次に、buildというディレクトリを作ってビルドするのですが、ダウンロードしてきたlibwebsocketにはbuildディレクトリはないので自分で作ってください。そして、buildディレクトリに移って、cmake .. && makeですが、一つ上の(つまりlibwebsocketの)ディレクトリでcmakeを走らせるという意味です。

Cmake1

cmakeというのは、簡単な記述でMakefileを生成してくれる便利なツールです。今回のインストールで初めて知りました。いやぁ、便利なものがあるものですね。次回からどんどん使わせていただきましょう。

Cmake2

ZYNQ上でビルドしても、それほど時間はかかりません。20分くらいでしょう。

そうしたら、サンプルのプログラムを試してみます。libwebsockets/minimal-examples/ws-server/minimal-ws-server-pmd に移動し、

$ cmake . & make

とタイプします。もし、

Lws configuration of LWS_WITHOUT_EXTENSIONS is incompatible with this

というエラーが出たら、CMakeLists.txtの68行目にある

require_lws_config(LWS_WITHOUT_EXTENSIONS 0 requirements)

require_lws_config(LWS_WITHOUT_EXTENSIONS 1 requirements)

にして再度ビルドします。

ビルドに成功したら、

./lws-minimal-ws-server-pmd

で起動しますが、もしここで.soのパスが見当たらずにうまく起動できない人は

LD_LIBRARY_PATH=/usr/local/lib:/usr/lib; export LD_LIBRARY_PATH

でパスを通しておいてください。

そうしたら、./lws-minimal-ws-server-pmdで起動します。

Ws1

クライアントとなるPCでWebブラウザを立ち上げ、http://zynqberry:7681/と入力します。すぐにWebページが開き、下の図のようなページが表示されます。

Ws2_20190813010401

ここでsendボタンを押すと、テキストボックスに入力された文字列がwebsocketでサーバに送られ、上のtextareaに表示されるというふうになっています。

このサンプルのすごいところは、同じポート(7681)なのに、Webページの表示とWebsocketの応答をプロトコルを切り替えられるところです。1つのポートで複数のサーバを同時に運用できるのです。

 

| | コメント (0)

2019.08.07

ZYNQで動くUbuntu 18.04LTSのイメージをリリースしました

ZYNQで動くUbuntu 18.04LTSのイメージをリリースしました。

対象となるハードウェアはZynqberryですが、ご要望があれば他のボードにも拡張していく可能性があります。

特徴は、

  • armhf版のUbuntu 18.04LTS
  • PetaLinuxを使用せず、Ubuntu本家からダウンロードして構築
  • HDMIに1280x720の画像出力(フレームバッファ利用)
  • X Window systemのデスクトップ環境(LXDE)をインストール済み
  • XRDPをインストール済み。Windowsからリモートデスクトップでログイン可能
  • Jupyter notebookをインストール済み(numpy pandas matplotlib seaborn scikit-learn plotlyが利用可能)
  • 無線LANが利用可能
  • イメージファイルは3.5GByteだが、Zynqberryを最初に起動した際に、SDカードで利用できる最大のサイズにパーティションが自動拡張される
  • samba、emacs、sshをインストール済み

となっています。

ユーザ名とパスワード

デフォルトで用意されているユーザはzynqで、パスワードはberryです。

rootのパスワードはrootです。

コンソール(USB COMポート経由)で接続した場合はユーザ名・パスワードを入力することなく、自動的にrootとしてログインされます。

Autologin

SSHではrootではログインできませんので、特権操作が必要な場合はsudoまたはsuしてください。

パーティションの自動拡張

このイメージファイルはzynqberry_ubuntu18_complete.imgという名前で、約3.3GByteのサイズがあります。

Imagefile

このファイルを、Win32 Disk Imagerなどを使って新しいSDカードに書き込みます。

Win32diskimg

SDカードは2つのパーティションが切られています。最初のパーティションはWindowsからも読める300MBのFAT32、2番目のパーティションはUbuntuのrootが入っているext4となっています。

Partition

SDカードをZynqberryに挿して起動すると、初回起動時に2番目のパーティションが自動的に拡張され、

Autoresize

SDカードの容量いっぱいまで拡張されますが、16GBのSDカードでも、32GBのSDカードでも使い切ることができます。書き込むのは最小のサイズのイメージファイルでよく、書き込み時間が短縮できます。利用可能な最小のSDカードは4GBです。

sambaによるファイル共有と名前解決

/home/shareに共有フォルダが用意されていて、Windowsから\\zynqberry でアクセスすることができます。また、zynqberryという名前でWindowsから名前解決することができます。

Samba

デスクトップ環境の利用

様々なデスクトップマネージャを試し、armhfでも安定して動作できるLXDEを採用しました。

HDMIコネクタにモニタをつなぎ、マウスとキーボードをつなげばスタンドアローンで使用することもできます。スタンドアローンでデスクトップ環境を利用するにはコンソールから

$ startx

と入力します。

リモートデスクトップの利用

または、Windowsのリモートデスクトップから接続することも可能です。リモートデスクトップでzynqberryに接続すると、下の図のような画面が表示されるので、SessionはXorg、ユーザ名はroot、パスワードはrootを入力してください。

Xrdp

リモートデスクトップが使えるようになります。この環境では無線LANの設定などがグラフィカルに行えます。

Wifi1

Wifi2

無線LANの利用

無線LANを有効にするには、USB LANアダプタを挿し、

$ nmcli device wifi connect [SSID] password [パスワード]

を入力します。

なお、現在のデバイスの状態を見るには、

$ nmcli device status

と入力します。

利用可能なSSIDの一覧を見るには、

$ nmcli device wifi

と入力します。

なお、無線LANを切断するには、statusで確認したデバイス名を用いて、

$ nmcli device disconnect デバイス名

と入力します。

Jupyter notebookの利用

データ解析に便利なJupyter notebookがあらかじめインストールされています。numpy pandas matplotlib seaborn scikit-learn plotlyがあらかじめインストールされていて、人工知能の研究・開発に便利なnumpyや、綺麗なグラフを表示するseabornなどもすぐに使えます。

Jupyter1

Jupyter notebookなので、グラフの一部を拡大したり、回転したりすることもできます。

Jupyter

Jypyterを利用するには、

$ jupyter notebook --allow-root &

と入力し、コンソールに表示された http://zynqberry:8080/ をクリックします。

Launch_jupyter

Jupyterのファイル一覧が表示されるので、New→Python3と操作します。

Jupyter3

JupyterのPython入力画面が開くので、ここにコードを入力して実行してください。

Jupyter4

まとめ

ダウンロード先はこちらです。

フル機能を搭載したこのUbuntu18を利用することで、Zynqberryを「カスタマイズ可能な計測・制御プラットフォーム」として利用しやすくなります。

こちらのページからzynqberry_ubuntu18_complete.img.gzをダウンロードしてください。

Ubuntu18で快適なZYNQ生活をご堪能ください。

 

| | コメント (0)

2019.08.06

ZYNQのUbuntu 18.04にJupyterを入れる

ZYNQのUbuntu 18.04にJupyterを入れる方法を確立しました。

Qiitaの記事で参考にしたのは下記の2つです。

  1. Jupyter事始め
  2. Jupyter notebook鯖をRaspbian(arm)で走らせる

最初に紹介した記事の要点は、

$ sudo apt-get install -y python-pip libpq-dev python-dev libpng12-dev libjpeg8-dev libfreetype6-dev libxft-dev
$ sudo pip install -U pip
$ sudo pip install numpy pandas matplotlib seaborn scikit-learn plotly ipython[notebook]

です。apt-getで様々なライブラリを入れた後、pipでnumpyからplotlyと、ipython[notebook]を入れるという手順です。

ただいくつか問題があって、ZYNQ(アーキテクチャ的にはarmhf)のUbuntu18ではこのままだと入りません。libpng12-devをlibpng-devにする必要があります。それから、scikit-learnあたりでエラーとなります。

  Running setup.py bdist_wheel for scikit-learn ... error
Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-v9kpo07_/scikit-learn/setup.py';f=geta ttr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/tmp kuuydzfcpip-wheel- --python-tag

2番目の記事ではRaspbianでpython2.7の環境のようですが、

$ sudo apt-get install libpng12-dev libjpeg8-dev libfreetype6-dev libxft-dev liblapack-dev libatlas-base-dev gfortran g++
$ sudo pip install numpy pandas matplotlib seaborn scikit-learn --no-cache-dir

とされています。

liblapack-dev libatlas-base-dev gfortranあたりが大事なところで、これがscikit-learnをインストールする当たりでlapackがないとかatrasがないとか、fortranがないとかエラーが出ていました。

私が考えた、ZYNQのUbuntu 18.04にJupyterを入れる手順を以下に示します。

$ apt-get install libpng-dev libjpeg8-dev libfreetype6-dev
$ pip3 install numpy
$ pip3 install pandas
$ apt install liblapack-dev libatlas-base-dev gfortran g++
$ pip3 install cython
$ pip3 install matplotlib
$ pip3 install seaborn
$ pip3 install scikit-learn
$ pip3 install jupyter
$ pip3 install ipython[notebook]

cythonってなんだよ~とか思いながら、足りないといわれているパッケージを地道に入れていきます。ただし、この作業には大変な時間がかかります。pip3 installでは中でGCCが動いてコンパイルしているらしく、全部で12時間くらいはかかります。

様々なサイトで見つけたサンプルを動かしてみた結果を示します。

J1J2

ブラウザの中でグラフが表示できています。

なお、先頭行の

%matplotlib inline

%matplotlib notebook

にすると、グラフをインタラクティブに操作できます。

J3

ただしこれができるようにするには、

$ pip3 install ipython[notebook]

でインストールしておかなければならないようです。そうしないと、

[IPKernelApp] ERROR | No such comm target registered:

というエラーが出て、グラフが表示されません。

最終的に使うのかどうかわからないseaborn scikit-learnなどのパッケージも入り、このような綺麗なグラフが出せるようになりました。

J4

Jupyterが動くようになったZYNQ Ubuntu18のイメージは近日中にダウンロードできるようにします。お楽しみに。

| | コメント (0)

2019.08.03

ZYNQのLinuxでSDカードのパーティションを自動拡張する方法

Raspberry Piでは1GBくらいのRaspbianのイメージをSDカードに入れて起動すると、最初の起動時にSDカードの最大限までパーティションを拡張してファイルシステムが構築されます。ユーザが何GBのSDカードを用意しても、容量一杯までパーティションを拡張してくれる。それなのにダウンロードする容量は最小限でよいという素晴らしい仕組みです。

同じことをZYNQで動くLinuxでもやってみたいのですが、どうしたらよいでしょうか?

Raspberry Piでの自動拡張の仕組みは

Raspberry Piで最小サイズのバックアップを作成する
https://dev.classmethod.jp/hardware/raspberrypi-backup-restore/」

のページが詳しいのですが、そのままZYNQ Linuxには適用できませんでした。

上のページの内容を読んでみると、Raspberry Piでは以下のような仕組みでパーティションの自動拡張を行っているようです。

  1. resize2fs_onceというファイルを/etc/init.d/配下に置き、S01resize2fs_onceというリンクがrc3.dやrc5.dにあることで、起動時にこれが実行される。
  2. このファイルの中身は、ROOT_DEVという環境変数(/dev/mmcblk0p2などSDカードのパーティションを指定したもの)を設定する
  3. resize2fs $ROOT_DEVで、このパーティションのファイルシステムを最大限拡張する
  4. update-rc.d resize2fs_once removeで、S01resize2fs_onceのシンボリックリンクを削除し、次回から起動されないようにする
  5. rm /etc/init.d/resize2fs_onceで、スクリプト自体を削除する

パーティションを拡大しているコマンドはresize2fsなのですが、resize2fsは物理パーティションの拡張をしてくれません。

当然ながらZYNQのUbuntu 18.04ではresize2fs /dev/mmcbkl0p2を行ってもパーティションのサイズは拡張されませんでした。Raspberry Piとの違いは詳しく調べていませんが、物理パーティションと論理、拡張パーティションとかそういう違いなのでしょう。

そこで、ZYNQ Ubuntu 18.04でも動くパーティション自動拡張のやり方を考えました。

Zynqberryを使って実験します。

① /etc/init.d/zb_parted_once というファイルを作る。中身は以下のとおり。

#!/bin/sh
### BEGIN INIT INFO
# Provides: zb_parted_once
# Required-Start:
# Required-Stop:
# Default-Start: 3
# Default-Stop:
# Short-Description: Maximize the root filesystem and partition # Description:
### END INIT INFO
. /lib/lsb/init-functions
case "$1" in
start)
log_daemon_msg "Starting zb_parted_onec, Maximize the root filesystem and partition"
ROOT_DEV=$(findmnt / -o source -n) &&
parted -s /dev/mmcblk0 unit s "print free" "resizepart 2 -1s" "print free" &&
resize2fs $ROOT_DEV &&
update-rc.d zb_parted_once remove &&
rm /etc/init.d/zb_parted_once &&
log_end_msg $?
;;
*)
echo "Usage: $0 start" >&2
exit 3
;;
esac

② 実行権限を与える

$ chmod 755 /etc/init.d/zb_parted_once

③ zb_parted_once が起動時に実行されるようにする。

$ update-rc.d zb_parted_once defaults

起動スクリプトとして実行する前に、まずは

$ parted /dev/mmcblk0
unit s
print free
resizepart 2 -1s
print free

を実行して、予備実験を行います。

Parted

実行前にはLinuxのパーティションは1.6GBほどで、後ろに広大なFree Spaceがあったのですが、resizepartの後でパーティション2が14GBに拡大されてFree Spaceが消えたのがわかります。esizepart 2 -1sというのは、パーティション2を最大セクタまで拡張するという意味です。

このスクリプトを登録したSDカードをZynqberryに挿して起動してみると、

・・・
[ OK ] Reached target Basic System.
Starting Permit User Sessions...
[ OK ] Started Set the CPU Frequency Scaling governor.
Starting System Logging Service...
[ OK ] Started Regular background program processing daemon.
Starting Dispatcher daemon for systemd-networkd...
Starting Login Service...
[ OK ] Started Message of the Day.
Starting LSB: Maximize the root filesystem and partition...
[ OK ] Started D-Bus System Message Bus.
[ OK ] Started Login Service.
・・・

と、無事に起動時に実行されたようです。fdiskの結果は、

zb@zynqberry:~$ sudo fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 14.4 GiB, 15489564672 bytes, 30253056 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xacbccfd5

Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 2048 616447 614400 300M b W95 FAT32
/dev/mmcblk0p2 616448 30253055 29636608 14.1G 83 Linux
zb@zynqberry:~$

と、無事に最大まで拡張されました。

Fdisk

これで、最小サイズのSDカードイメージを配って、ユーザが用意したSDカードで利用可能な最大サイズまでパーティションを拡張するという、Raspbianみたいなことが自分のシステムでもできるようになりました。

| | コメント (0)

2019.08.02

ZYNQ+Ubuntu 18.04にデスクトップを入れなおす

ZynqberryでUbuntu 18.04が動くようになってGUI環境も整ってきたのですが、どのようにしたら確実にデスクトップマネージャが入るかを再現可能なように手順をメモしながら再チャレンジしました。

まず、LXDEとxinitを入れます。LXDEは軽量のデスクトップマネージャで、xinitはXをスタートするためのものです。

$ sudo apt install lxde
$ sudo apt install xinit

次に、lightdmのサービスを停止します。gnome関係のものが動いているとうまくログインできないことがあるので、止めます。

$ sudo systemctl disable lightdm

次にデスクトップマネージャの切り替えを行います。

root@zynqberry:~# sudo update-alternatives --config x-session-manager
There are 4 choices for the alternative x-session-manager (providing /usr/bin/x-session-manager).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/gnome-session 50 auto mode
1 /usr/bin/gnome-session 50 manual mode
2 /usr/bin/lxsession 49 manual mode
3 /usr/bin/openbox-session 40 manual mode
4 /usr/bin/startlxde 50 manual mode
Press to keep the current choice[*], or type selection number: 4
update-alternatives: using /usr/bin/startlxde to provide /usr/bin/x-session-manager (x-session-manager) in manual mode

デフォルトではgnome-sessionになっているので、4番のstartlxdeを選択します。

これで再起動すると、コンソールが起動します。

Login

ユーザ名とパスワードを入れて、startxで打てば、LXDEが立ち上がります。

Lxde

なお、豪華なデスクトップマネージャにあこがれてlubuntu-desktopを入れても、ZYNQ 7000には重すぎてまともに動きません。LXDEが精一杯です。

以下はやってはいけない例です。

$ apt install -y lubuntu-desktop
$ apt install -y ubuntu-session

これをやると、ファイルのいろいろなところが書き変わるのでLXDEさえも起動しなくなります。

デスクトップマネージャはLXDE以外は使い物になりませんが、LXDEが動くというだけで、その上で何かの作業ができるわけではありません。

firefoxが最初から入っていますが、とても重いのでネットサーフィンもきついでしょう。ブラウザアプリを動かすのも大変だと思います。

そもそも、そんな重いデスクトップ環境を整える意味はあるのかというと、

  • GUIアプリを自分で作ったり
  • 無線LANをグラフィカルに設定したい場合

などに役に立つのではないかと思います。

ちなみに、

$ sudo apt install xrdp

でXRDPを入れてリモートデスクトップ環境を整えても、同じくらい遅いです。どうやら画像表示のフレームバッファが遅いのではなく、ZYNQ 7000にとってUbuntu18+デスクトップ環境というのがそもそも重いのでしょう。

スワップを有効にすれば、わずかに改善できるかもしれません。

$ dd if=/dev/zero of=/var/swap bs=1M count=1024
$ mkswap /var/swap
$ chmod 600 /var/swap
$ swapon /var/swap

Zynqberryのメモリは512Mバイトなのですが、freeコマンドで見るといつも苦しそうです。スワップを有効にすることで気休め程度に緩和される気がします。

 

| | コメント (0)

2019.08.01

Zynqberry Ubuntu 18.04用最小のSDカードを作る

ZYNQ+Ubuntu 18.04のデスクトップが動いたので、手順を確実にするため、再びゼロから入れなおしています。

前回の問題点は、

  • ext4のパーティションサイズをケチったのでデスクトップマネージャを入れている間に何度か容量不足になった
  • 何をどういう順番で入れたか覚えていない
  • Ubuntu 19.04というマイナーな最新版を入れたので、参考になる情報が少ない

ということでした。

そういうわけで、再びUbuntu 18.04をゼロから入れてみることにします。ああ、インストールってなんて楽しいのだろう。せっかくなら、作業時にはSDカードいっぱいのパーティションで作業して、配布用SDカードのimgファイルを作るときには小さくしたいですね。

縮小されたSDカードの作り方は、Raspberry Pi用の情報を探せば出てきます。

基本的にはZynqberry上から自分自身のパーティションを縮小することはできないので、ZynqberryのSDカードを引っこ抜いて別のLinuxが動くPCで読み込んで操作します。

以下、ホストPCでの作業を示します。

まずは、fdiskで現状を確認します。

naitou@ubuntu:~$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 14.4 GiB, 15489564672 bytes, 30253056 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xacbccfd5
Device Boot Start End Sectors Size Id Type
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 616447 614400 300M b W95 FAT32
/dev/sdb2 616448 30253055 29636608 14.1G 83 Linux

naitou@ubuntu:~$ sudo resize2fs -P /dev/sdb2
resize2fs 1.44.1 (24-Mar-2018)
Estimated minimum size of the filesystem: 345056

第二パーティションはセクタ616448からセクタ30253055の、29636608個のセクタに入っていることがわかります。1セクタ=512Byteなので、トータルの容量は15489564160バイト(約16GB)となります。

次にresize2fsで、ファイルシステムに必要な最小サイズを調べます。

naitou@ubuntu:~$ sudo resize2fs -P /dev/sdb2
resize2fs 1.44.1 (24-Mar-2018)
Estimated minimum size of the filesystem: 345056

このコマンドで使う345056という数値はブロック単位で、1ブロックは4096バイトです。したがって、インストール直後のZynqberry Ubuntu18のファイルシステムは345056×4096=1,413,349,376バイトあれば格納できることがわかります。

次にパーティションを縮小するのですが、ぎりぎりで作ってしまうとよくないので1024ブロックほど増やしたサイズに縮小します。

345056+1024=346080ブロック=2768640セクタにします。

naitou@ubuntu:~$ sudo parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) u s ・・・セクタ単位での表示にする
(parted) print free ・・・セクタ単位での表示にする
Model: Multiple Card Reader (scsi)
Disk /dev/sdb: 30253056s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
63s 2047s 1985s Free Space
1 2048s 616447s 614400s primary fat32
2 616448s 30253055s 29636608s primary ext4
(parted) resizepart 2 2768640 ・・・パーティション2を2768640セクタに縮める
Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
Yes/No? y
(parted) print free ・・・パーティションの状態を表示する
Model: Multiple Card Reader (scsi)
Disk /dev/sdb: 30253056s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
63s 2047s 1985s Free Space
1 2048s 616447s 614400s primary fat32
2 616448s 2768640s 2152193s primary ext4
2768641s 30253055s 27484415s Free Space ←パーティション2が縮んで空き領域が出来た
(parted) q
Information: You may need to update /etc/fstab.

これで、パーティションを縮めることができました。

最後にddを使ってイメージファイルを作成します。

naitou@ubuntu:~$ sudo dd if=/dev/sdb of=zynqberry_ubuntu18.img count=2768641 bs=512

これでイメージファイルが作成できました。

手順をまとめると、

  • ファイルシステムを最小のサイズ+αに縮小してから、partedでパーティションを縮小する

ということになります。

いろいろな概念が出てきましたが、

  • パーティションのサイズと、ファイルシステムのサイズというのは別である(入れ物の大きさと、中に入っている風船の大きさのようなイメージ?)
  • ファイルシステムの大きさはresize2fsで変えられる
  • パーティションを変えるには、fdiskでdeleteしてからnewする方法もあるが、partedを使えばマウントしたまま作業できるので楽

ということかなと思います。

 

| | コメント (0)

2019.07.30

ZYNQのUbuntu 19にデスクトップを入れる

昨日からチャレンジしている「ZynqberryにUbuntu 19をインストール」ですが、そのままではHDMI出力もコンソールになっていて味気なかったので、デスクトップマネージャを入れてみました。

何をどういう順番でインストールしたかは覚えていないのですが、

$ apt install xinit

$ apt install lubuntu-desktop

などを実行した気がします。

最初に動いたGUIがこれです。

Zb_ubuntu18

GNOME関係が動くようになったときがこちら。

Loginloop

ただ、GNOMEを入れると、パスワードを入れても再びログイン画面に戻ってきてしまうようになったので、

$ systemctl disable lightdm

$ systemctl disable gdm3

でこれらのウィンドウマネージャが起動しないようにしておいて、startxで起動しました。

LDXEという軽量なウィンドウマネージャならログインループすることなく起動することができて、FirefoxでWebが見えるようになりました。

Ubuntu_lxde

しかし、極めて遅いですね。

Zynqberryのメモリは512Mバイトですが、ほとんど使用中だったのでSWAPを設定してみました。

なんとかYoutubeまで見えましたが、ほんとうに遅いです。

Zb_youtube

そもそもZYNQですから、計測用のシンプルなLinuxが動けばよく、リッチな環境は必要ないのですが、試してみたくなりますね。

ZynqberryはGPUを積んでいるわけではなく、ZYNQのPLでDMAを使ったFrameBufferで画像を表示しています。FrameBufferというのはメモリ上の値をそのまま画面に出すというシンプルなものです。アクセラレーションも何もないただのVRAMのことです。

それでもここまで動くなんて、Linuxってすごいですね。

 

| | コメント (0)

«Zynqberry(ジンクベリー)にUbuntu 19をインストール