20200206のLinuxに関する記事は10件です。

bash-completionを活用して、manやhelpを見ずに、バシバシ長いコマンドを打つ

1. 入力補完機能を使っていますか?

bashをはじめとして、多くのシェルやコマンドプロンプトで入力補完機能(completion)が提供されている。Windowsでも使える機能だし、ほとんどの人が使っているだろう。

入力補完機能によるファイル名補完の例
$ ls
sample.txt  test1.txt  test2.txt  test3.txt
$ cat s[TAB]キー入力
$ cat sample.txt  ★TABキーを押すと、一致するファイル名が補完される

そしてRHEL6(2010年代~)あたりからは、ファイル名やディレクトリ名だけでなく、コマンドのオプション入力にも使えるようになっている。

1-1.前提条件

  • LinuxやMacOS

1-2. TL;DR

  • 入力補完機能は使っていたが、Linuxコマンドのオプション入力で使えるのは知らなかった。恥ずかしい…。

2. systmctlのオプション長げー問題

ここ数年はRHEL7系をメインに使っているが、長らくRHEL5/RHEL6系を使ってきた。RHEL7系で戸惑うのはserviceコマンドやchkconfigコマンドが使えないことだ(一部は互換機能で使える)。

システム構築・運用でよく使うコマンドなので「chkconfig --listって、systemctlだと何だったっけ…」となりがちである。

そんなときに役立つのがコマンド・オプションの入力補完機能だ。

次のようにsystemctlのあとに「TABキー」を入力すると、オプションの一覧を表示できる。

$ sudo systemctl [TAB]キー入力 ★systemctlのあとに1スペース入れてからTAB
add-requires           hybrid-sleep           reload-or-restart
add-wants              is-active              reload-or-try-restart
cancel                 is-enabled             rescue
cat                    is-failed              reset-failed
condreload             isolate                restart
condrestart            is-system-running      set-default
condstop               kexec                  set-environment
daemon-reexec          kill                   set-property
daemon-reload          link                   show
default                list-dependencies      show-environment
delete                 list-jobs              snapshot
disable                list-sockets           start
edit                   list-timers            status
emergency              list-unit-files        stop
enable                 list-units             suspend
exit                   mask                   switch-root
force-reload           poweroff               try-restart
get-default            preset                 unmask
halt                   reboot                 unset-environment
help                   reenable
hibernate              reload

一覧が表示されれば、こちらのもの。続いてlist-unit-filesを入力すればよい。オプションを入力してる途中も「TABキー」の入力補完は効く。

$ sudo systemctl list-unit-files ★list-unit-filesの途中でもTABの補完が効く

これでsystemctlも怖くない! えっへん!

3. bash-completionとは

ファイル名やディレクトリ名の入力補完では無く、コマンドのオプションを補完するのがbash-completionだ。complete -pを入力して大量の行が表示されるならば利用できると思っていい。

3-1. ディストリビューションごとの状況

Linuxディストリビューションの種類やバージョンによって、標準リポジトリに含まれていないことがある。

  • RHEL6系:EPELリポジトリ
  • RHEL7系以降:標準リポジトリ
  • Ubuntu 18.04 LTS:標準リポジトリ
RHEL8系
$ rpm -q bash-completion
bash-completion-2.7-5.el8.noarch
RHEL7系
$  rpm -q bash-completion
bash-completion-2.1-6.el7.noarch
RHEL6系
$ rpm -q bash-completion
package bash-completion is not installed
Ubuntu18.04LTS
$ dpkg -l bash-completion
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  bash-completio 1:2.8-1ubunt all          programmable completion for the b

少し古いので現在当てはまるか微妙だが、MacOSの情報はこちら。

3-2. RHEL6系OSへのインストール

RHEL6やCentOS 6、Oracle Linux 6では、bash-completionをEPELリポジトリからインストールする必要がある。その手順を説明する。

  1. EPELリポジトリが有効になっているか確認する。次のように行が存在し、enabledになっていれば利用できる。
$ yum repolist all | grep -i epel
epel                         Extra Packages for Enterprise Linux enabled: 12,586

2.上記以外のときは状況に応じてEPELリポジトリを有効にする。

行はあるがdisabledのとき

$ sudo yum-config-mangaer --enable epel

行自体がないとき

$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm -y

3.次のように「Available Packages」に表示されたときは、インストールされていないが、リポジトリには存在している。

$ sudo yum list bash-completion
Loaded plugins: refresh-packagekit, security, ulninfo
Available Packages
bash-completion.noarch                          1:1.3-7.el6                          epel

4.ここまで確認できたらbash-completionをインストールする。

$ sudo yum install bash-completion -y

5.bash-completionを有効にするためにログアウト/ログインする。ログアウトする理由は/etc/profile.d/bash_completion.shでbash-completionの定義ファイルを読むためだ。

3-3. bash-completionの定義ファイル

bash-completionの定義ファイルは、次のディレクトリ配下に存在する。

  • /etc/bash_completion.d/
  • /usr/share/bash-completion/completions/

ディレクトリを確認すると大量の定義ファイルがある。このファイルがあるコマンドは、オプションの入力補完ができることになる。

$ ls  /usr/share/bash-completion/completions/ | wc -l
454

$ ls /usr/share/bash-completion/completions/
addpart       fsck.minix      lvextend     raw                  timedatectl
blkdiscard    fsfreeze        lvm          readprofile          tuned-adm
blkid         fstrim          lvmdiskscan  rename               udevadm
blockdev      gapplication    lvreduce     renice               ul
bootctl       gdbus           lvremove     repquota             umount
busctl        getopt          lvrename     resizepart           unshare
bzip2         groupadd        lvresize     rev                  useradd
cal           groupdel        lvs          rpm                  userdel
cfdisk        groupmod        lvscan       rtcwake              usermod
★以下省略

3-4. 入力補完例いろいろ

先ほどのsystemctlの例ではlist-unit-filesオプションを補完した。それ以外にもハイフン(-)やハイフンハイフン(--)で始まるオプションも入力補完できる。

$ sudo systemctl -[TAB]キー入力
-a                     --ignore-dependencies  --quiet
--after                --kill-who             -r
--all                  -l                     --recursive
--before               --no-ask-password      --reverse
--defaults             --no-block             --root
-f                     --no-legend            --runtime
--fail                 --no-pager             -s
--failed               --no-reload            --signal
--force                --now                  --state
--full                 --no-wall              --system
--global               -p                     -t
-h                     -P                     --type
-H                     --privileged           --version
--help                 --property
--host                 -q

表示まで少し時間はかかるが、サービス名(ユニットファイル名)の途中で「TABキー」を入力すると、一致するサービスの一覧を表示できる。

$ sudo systemctl restart sshd[TAB]キー入力
sshd@                sshd.service
sshd-keygen.service  sshd.socket

sshの場合

sshでは、~/.ssh/known_hosts~/.ssh/config/etc/hostsからホスト名候補を表示できる。

1スペースのあとに[TAB]キー
$ ssh [TAB]キー入力
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.5.1.35 ol7srv.dbprivatenrt01s.work01nrtvcn.oraclevcn.com ol7srv
ホスト名の途中で[TAB]キー
$ ssh ol7[TAB]キー入力
ol7ksplice
ol7srv
ol7srv2
ol7srv3
ol7srv-vip.dbprivatenrt01s.work01nrtvcn.oraclevcn.com
-oオプションのあとに[TAB]キー
$ ssh -o [TAB]キー入力
AddressFamily=                     IdentitiesOnly=
BatchMode=                         IdentityFile=
BindAddress=                       IPQoS=
ChallengeResponseAuthentication=   KbdInteractive

ここまで来ると何でもありだ。とりあえず「TABキー」を試してみたい。

定義ファイルを解析すれば、コマンドごとに何ができるかわかる。だけれど数が多いので覚えるのはナンセンスだ。

次のように本来オプションを指定するコマンドなのに、カレントディレクトリのファイルやディレクトリが表示されたときは定義されていない、と覚えた方がいいだろう。

$ sudo yum-config-managar [TAB]キー入力
bash-completion-extras-2.1-11.el7.noarch.rpm
.bash_history
.bash_logout
.bash_profile
.bashrc
.cache/
.config/
.lesshst
sample.txt
.ssh/

3-5. さらに追加モジュール

bash-completionには追加モジュールのbash-completion-extrasがある。こちらはRHEL7系でもEPELリポジトリが必要だ。

なお、現時点利用できるのはEPEL7だけで、EPEL6とEPEL8では提供されていない。しかし、el7のサフィックスは付いていてもnoarchなので、wgetやyumdownloaderで入手して、RHEL6/8系にインストールすれば使えるだろう。

  1. クラウドではデフォルトでEPELリポジトリが有効になっていることがある。次のコマンドでEPELを確認する。このように表示されたときは、すぐにインストールできる。
$ sudo yum list bash-completion-extras
Loaded plugins: langpacks, ulninfo
Available Packages
bash-completion-extras.noarch          1:2.1-11.el7           ol7_developer_EPEL

2.EPELリポジトリがインストールされていないときはインストールする。

RHEL7系
$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y

3.bash-completion-extrasパッケージをインストールする。これで終了だ。

$ sudo yum list bash-completion-extras -y

4.パッケージの中身を確認すると300近いモジュールがあり、mysqlやpostgresqlなどもあることがわかる。

$ rpm -ql bash-completion-extras |wc -l
271

$ rpm -ql bash-completion-extras
/usr/share/bash-completion/completions
/usr/share/bash-completion/completions/a2x
/usr/share/bash-completion/completions/aclocal
/usr/share/bash-completion/completions/add_members
/usr/share/bash-completion/completions/alias
/usr/share/bash-completion/completions/alternatives
/usr/share/bash-completion/completions/animate
/usr/share/bash-completion/completions/ant
/usr/share/bash-completion/completions/apropos
/usr/share/bash-completion/completions/arch
/usr/share/bash-completion/completions/arping
★以下省略

4. まとめ

  • bash-completionを使用すると、コマンド・オプションを入力補完できる
  • RHEL6系ではEPELからインストールする必要がある
  • RHEL7/8やUbuntuではデフォルトでインストールされていることが多い。少なくとも標準リポジトリには存在する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Android でもとりあえず Ubuntu のデスクトップ環境を使いたい(Termux 版)

はじめに

先に公開した Android Studio を使うための最低限のデスクトップ環境の構築方法を記載します。
日本語入力もありませんが、その代わり最短で構築できると思います。

注意点

デスクトップ環境(LXDEやXfce)のインストールは数時間かかります。
時間を確保してから実施するほうが良いと思います。

インストール

Play ストア で Termux と XSDL をインストールしてください。
Termux は Linux という OS の一種が動作する環境になります。
Android も OS ですので、OS の上で OS が動作するという、ちょっとややこしい環境になります。
XSDL は画面を担当するアプリケーションです。
Termux はコマンドラインまでしかサポートしませんので、XSDL で画面をサポートしてもらいます。

Termux の設定

Termux を起動して、以下のコマンドでパッケージ(Linux アプリケーションの倉庫のようなもの)を更新してください。

# パッケージのアップデート
pkg upgrade

pkg は apt コマンドのラッパーとのことです。
apt コマンドはパッケージを操作するためのプログラムを指します。
Termux では基本的に pkg を使用してアプリケーションのインストールを行います。

続いて、termux-setup-storage を実行して Termux と Android の間でファイルのやりとりをできるようにします。

# Android で扱っているファイルを Termux からも扱えるようにする
termux-setup-storage

Termux がアクセスして良いかと聞くダイアログが出ますので、OKを選択して下さい。

Termux と Android のディレクトリの対応を記載します。
ファイルの受け渡しなどの参考にしてください。

Termux Android
/data/data/com.termux/files/home/storage/shared/ (本体 側)/sdcard/
/data/data/com.termux/files/home/storage/downloads/ (本体 側)/sdcard/Download/
/data/data/com.termux/files/home/storage/external-1/ (SD Card 側)/storage/(SD Cardの名前)/Android/data/com.termux/files/
/storage/(SD Cardの名前)/ (SD Card 側)/storage/(SD Cardの名前)/

Ubuntu のインストール

続いて Termux に Ubuntu の環境を構築します。
Ubuntu も OS の一種になります。
Termux という Linux の上に Ubuntu という Linux を構築するという、Linux の上に Linux を載せるという形になります。
公式サイトのやり方ではありませんが Ubuntu をインストールする方法が載っています。
今回はこちらの方法を使用させてもらいます。
以下のサイトで、Installation steps と書かれている箇所のコマンドを実行して下さい。

https://github.com/MFDGaming/ubuntu-in-termux

Ubuntu と Android のディレクトリの対応を記載します。
ファイルの受け渡しなどの参考にしてください。

Ubuntu Android
/sdcard/ (本体 側)/sdcard/
/storage/(SD Cardの名前)/ (SD Card 側)/storage/(SD Cardの名前)/

以下の公式サイトに Ubuntu のインストール方法が書いてあるのですが、SD Card などの Android とのファイル共有の方法が分からなかったため、今回は使用しません。

https://wiki.termux.com/wiki/Ubuntu

Ubuntu の起動

先述のサイトの Installation steps の 10.Now just start ubuntu: に記載がありますが、Termux から Ubuntu を起動するコマンドを記載します。

cd
cd ubuntu-in-termu
./startubuntu.sh

Ubuntu デスクトップ環境のインストール

ここからは Ubuntu での操作になります。

まずは apt でパッケージを更新します。

apt update
apt upgrade -y

次にデスクトップ環境をインストールします。
調べた限りでは、LXDE, Xfce の2種類が使えます。
LXDE の方が軽いそうですが、Xfce の方が見た目が良くLXDE程ではないですけれども十分な軽さを持っているそうです。
ここは好みで選択すれば良いと思います。

なお、ここでネットワークやスマートフォンの速度にもよると思いますが数時間掛かります。
後述の設定は、最初や最後ではなく(やや後ろの方ではありますが)途中で出てきます。
お勧めはインストールを開始して数時間放置し、設定を行ってからまた数時間放置するやり方です。

・ LXDE のインストール

apt install -y lxde
# 途中で地域の質問があるので 6 → Enter → 79 → Enterという操作で選択する。数字の意味は、6:Asis、79:Tokyo となる。
# 次にキーボードの質問があるが、 31 → Enter → 1 → Enterという操作で選択する。数字の意味は、31:America(US)、1:Engrish(US) となる。ここは好みだが ソフトウェアキーボードの人は、 Hacker's Keyboard を使うので、この選択が間違いがないと思われる。
# デスクトップマネージャである gdm3 と lightgdm を選択するように言われるが、特にこだわりがないなら軽い lightgdm を選択すれば良いと思われる。

・ XFCE のインストール

apt install -y xfce4

環境の設定

XSDL を立ち上げてしばらく待って下さい。
最後なにやら文字列を表示している画面が出るので以下をメモしてください。

上から2行目に以下の文字列が出るはずです。DISPLAY のポート番号をメモしてください。

export DISPLAY=(何かのIPアドレス):(ポート番号)

上から3行目に以下の文字列が出るはずです。同様に PULSE_SERVER のポート番号をメモしてください。

export PULSE_SERVER=(何かのIPアドレス):(ポート番号)

IPアドレスはメモする必要はないです。
再び Termux の Ubuntu に戻って下さい。
XSDL に接続するために、設定ファイルに先程メモしたポート番号とローカルのIPアドレスを記載します。

# テキストエディタ vim をインストールしていない人はインストール
apt install -y vim

# .bashrc にXDSLの接続設定を記載する
cd
vim .bashrc

.bashrc の一番下辺りにでも、以下を記載して下さい。

export DISPLAY=:(さっきメモした DISPLAY のポート番号)
export PULSE_SERVER=127.0.0.1:(さっきメモした PULSE_SERVER のポート番号)

vim の操作方法を知らない人は以下だけ覚えればなんとかなります。

キーボードのキー 役割
i コマンドモードから入力モードに入る
ESC 入力モードを抜けてコマンドモードに戻る
:wq 保存して終了する。コマンドモードで操作すること。

今回に限り、先程記載した設定を手動で実行します。
次回からは自動的に実行するにで以下の操作は不要になります。

source .bashrc

デスクトップ環境の起動

まず、XSDLを立ち上げてください。先程のポート番号等が出る画面まで待ちます。
次に、Termux に戻り、Ubuntu の上で以下のコマンドを実行します。

・ LXDE の場合

startlxde

・ Xfce の場合

startxfce4

XSDL に戻り、しばらく待つと Ubuntu のデスクトップ環境が立ち上がるはずです。

この辺りはボタン一発でデスクトップ環境が立ち上がる UserLAnd の方が楽ですね。

参考サイト

Android で動く Linux 環境 UserLAnd が XServer XSDL に対応

通勤中のTermuxでおすすめの兵法

AndroidタブレットにUbuntuをインストールする

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Android でも Android アプリを開発したい

はじめに

どれだけの人が Android で Android アプリを開発したいと思っているのか分かりませんが、本記事は Android 上でセルフ開発を行うための環境構築を目的としています。
セルフ開発とは、自身の端末で自身の端末向けのアプリケーションを開発することを指します。
Windows や Mac、Linux などはセルフ開発が出来ますが、Android は少なくとも公式には開発ツールが出てませんでしたのでついやってみたくなり、思い立ったが吉日とばかりに構築してみました。
(とはいっても公式の Linux 版を使用しているのですけれどもね。。。)
まだ構築したばかりですので、もしかすると実際に開発を行うと不備があるかもしれませんが、その辺りはご容赦ください。
何か見つかれば調査して解決方法を書いていきたいと思います。
本記事では Android Studio を最低限の動作を行うところまでを構築します。

なお Android Studio を使うにあたってはスタイラスペンはあった方が良く、100円ショップのでも無いよりはマシです。
Android Studio のメニューが細いので親指はおろか小指でのタッチでもつらいです。
なお先端がプラスチックの Nintendo 3DS 向けのものは買わないで下さい。タッチパネルが反応しせんでした・・・

事前準備(Ubuntu のデスクトップ環境)

事前に UserLAnd や Termux 等で Ubuntu のデスクトップ環境を用意してください。
もし構築していない人は、後で最低限のデスクトップ環境の構築手順を記載しますので良かったら参考にして下さい。
おそらく Android Studio の動作速度は Termux の方が速いですが手順が面倒です。
速い端末をお持ちの人は UserLAnd で楽をするのも手かもしれません。

なお Debian はJDKのバージョンの問題で、Android Studio が動作しませんのでおすすめしませんが、openjdk 8 をなんとか用意できる人なら動かせるかもしれません。

ダウンロード

Android Studio, SDK tools, Arm64版attp2 をダウンロードします。
ダウンロードは Windows での操作を前提に書いていますが、Android でも同じ事はできると思います。

Android Studio, SDK tools のダウンロード

Android Studio downloads に入って Android Studio package の Linux (64-bit)版と SDK tools package の Linux 版をダウンロードします。

私の時には、android-studio-ide-191.6010548-linux.tar.gz と sdk-tools-linux-4333796.zip がありました。

後で、このファイル名を指定してコマンドを実行している箇所がありますが、もしファイル名が変わっていましたら、ご自分のダウロードしたファイル名に置き換えてコマンドを実行して下さい。

Android SDK Toolsは、開発とデバッグのためのツール一式を含むものになります。
Android Studio は単体ではなく、様々な外部ツールと連携して動作することになります。
後で Gradle と呼ばれるビルドツールで更に別のコマンドラインツール等をダウンロードします。

Arm64版attp2 のダウンロード

aapt2 とは、APKファイル(Androidでインストールに使用するアプリケーションのパッケージファイル)を生成等をするためのツールになります。
公式には Arm64 CPU 版は出ていませんが、Githubで公開されている方がいらっしゃいましたのでありがたく使わせていただきました。

https://github.com/thejunkjon/android-tools/tree/master/build/android-9.0.0_r33/aapt2/arm64-v8a/bin

上記のサイトに行き、Download ボタンを押下して、aapt2 ファイルをダウンロードしてください。

設置

Android の何か適当なファイル管理ツールでの操作になります。
私は、X-plore という Android アプリを使用していますが、ファイルを操作できれば何でも良いと思います。
先程ダウンロードした Android Studio, SDK tools を UserLAnd または Termux の Ubuntu から見える位置に設置します。

UserLAnd の場合

以下の対応表を見て、好みの位置に設置して下さい。

Ubuntu Android
/storage/internal/ (本体 側)/sdcard/Android/data/tech.ula/files/storage/
/storage/sdcard/ (SD Card 側)/storage/(SD Cardの名前)/Android/data/tech.ula/files/storage/

Termux の場合

以下の対応表を見て、好みの位置に設置して下さい。

Ubuntu Android
/sdcard/ (本体 側)/sdcard/
/storage/(SD Cardの名前)/ (SD Card 側)/storage/(SD Cardの名前)/

JDKのインストール

Ubuntu での操作になります。
まだデスクトップ環境を立ち上げる必要は無いので、シェルだけ立ち上げたほうが実施しやすい方はそうして下さい。

openjdk 8 をインストールします。
なお、Termux は root アカウントのため、先頭の sudo は不要です。

# openjdk 8 のインストール
sudo apt install -y openjdk-8-jdk

# openjdk 8 がインストールされているか確認
ls /usr/lib/jvm/java-8-openjdk-arm64

# テキストエディタ vim をインストールしていない人はインストール
sudo apt install -y vim

# 環境設定ファイルの編集
sudo vim /etc/enviroment

enviroment ファイルには以下を記載して保存します。

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-arm64"

vim の操作方法を知らない人は以下だけ覚えればなんとかなります。

キーボードのキー 役割
i コマンドモードから入力モードに入る
ESC 入力モードを抜けてコマンドモードに戻る
:wq 保存して終了する。コマンドモードで操作すること。

保存したら環境設定ファイルを自分の環境に反映します。

source /etc/enviroment

Arm64版の openjdk 11 だと Android Studio が動作しません。
もし 11 も入れている人が居るのでしたら、後述のおまけに書かれている方法で 8 に切り替えましょう。

Android SDK tools のインストール

続いて、Android SDK tools をインストールします。

# UserLAnd の場合
mkdir -p /home/(自分のID)/Android/Sdk
cd (sdk-tools-linux-4333796.zip のあるディレクトリ)
cp sdk-tools-linux-4333796.zip /home/(自分のID)/Android/Sdk
cd /home/(自分のID)/Android/Sdk/
unzip sdk-tools-linux-4333796.zip

# Termux の場合
mkdir -p /root/Android/Sdk
cd (sdk-tools-linux-4333796.zip のあるディレクトリ)
cp sdk-tools-linux-4333796.zip /root/Android/Sdk
cd /root/Android/Sdk
unzip sdk-tools-linux-4333796.zip

UserLAnd の場合には ID ごとにディレクトリが変わりますが、ID は最初に Ubuntu を選択した時に登録する ID になります。
おそらくコマンドプロンプトの左側に書いてあるはずですので、その値を使用して下さい。

Android Studio のインストール

いよいよ Android Studio のインストールです。

# UserLAnd, Termux 共通

cd (android-studio-ide-191.6010548-linux.tar.gz のあるディレクトリ)
cp android-studio-ide-191.6010548-linux.tar.gz /usr/local/
cd /usr/local/
tar -xvzf android-studio-ide-191.6010548-linux.tar.gz
cd /usr/local/android-studio/bin/
sudo chmod +x studio.sh

Android Studio 自体のインストールはここまでですが、後で外部ツールの一部を手作業で作成して設置する必要があります。

Android Studio の設定

ここからは Ubuntu のデスクトップ環境での操作になります。

注意点ですが、XSDLを使用している方は、font scale を小さく(私は 0.5 にしました)設定して下さい。
大きく設定すると Android Studio のダイアログが、画面よりも大きくなってしまいボタンが画面からはみ出して押せなくなります。
また解像度が低くてもダイアログが画面からはみ出してしまうので、ある程度の大きさが必要なようです。私の場合は、1280x720 にしてあります。

コマンドラインから studio.sh を実行して Android Studio を立ち上げます。

LXTerminal (画面左下の鳥のマーク → System Tools → LXTerminal) 等を立ち上げて以下のコマンドを実行して下さい。

※私の場合にはデスクトップ環境にLXDEを使用しているので画面左下の鳥のマークと書いていますが、Xfceの場合には左上と読み替えて下さい。

# UserLAnd, Termux 共通

/usr/local/android-studio/bin/studio.sh

設定ファイルをインポートするダイアログが出るので、設定ファイルがあれば指定してOKボタンを押下してください。
なければ、そのままOKボタンを押下してください。

android studio(なぜか小文字)が書かれたスプラッシュウィンドウが出た後に、何やらデータを Google に送って欲しいというダイアログが出ます。
好きなボタンを選んで下さい。

Welcome ダイアログが出るので、Next ボタンを押下してください。

Install Type ダイアログが出ますが、私は Standard しか選んだことがないので、ここから先は Satndard を選んだものとして話を進めます。Next ボタンを押して下さい。

Select UI Theme ダイアログが出るので、好みのデザインを選択してから Next ボタンを押して下さい。

Veryfy Settings ダイアログが出るので、 Next ボタンを押下します。もしここでエラーメッセージが出るようでしたら、SDK Tools のインストール先が間違っているので、一旦 Cancel ボタンを押下して Android Studio を終了し、インストール先を修正してから再度 Android Studio を立ち上げて下さい。

Emulator Settings ダイアログが出ますが、特にやることはないので Finish ボタンを押下します。

Downloading Components ダイアログが出てコンポーネントをダウンロードします。ダウンロードが終わったら、Finish ボタンを押下します。
私の環境ではダウンロードに10分ほど掛かりました。

Android Studio ダイアログが出ますので、Start a new Android Studio project を押下します。

Create New Project ダイアログが出ますので、適当なパネルを選択し、Next ボタンを押下します。

Configure your project ダイアログが出ますので、API レベルは自分のスマートフォンの Android のバージョン(スマートフォンごとに Android の設定画面のメニューが違うので、Android のバージョンの確認方法は各自調査してください)に合わせて、他は適当な値を設定し、Finish ボタンを押下します。
ここでちょっと固まりますが、あわてず待ちましょう。しばらく待つと IDE が立ち上がるはずです。

右下に 2 processes running... の文字が見えたら gradle と呼ばれるビルドツールを自動的にダウンロードして、ビルドを行います。

gradle の動作が止まったら、メニューから File → Project Structure を選択して Project Structure ダイアログを開いて下さい。
SDK Location の JDK locations を JAVA_HOME に設定し、OK ボタンを押下します。

再びビルドが始まるので、気長にエラーが出るまで待ちます。
ビルドが始まらなかったら Android Stdio のメニュー Build → Rebuild Project を選択します。

ここでは gradle が使用する外部ツールでエラーが発生します。
Android Studio の下の方に Gradle Sync という文字が出ており、その右側にバーが出ているはずです。そのバーの動きが止まるまで待って下さい。
環境にもよりますが、私が UserLAnd で行ったときには10分以上はかかりました。

gradle がオフラインで動作するように設定します。
メニューから File → Settings を選択して Settings ダイアログを開いて下さい。
Build, Execution, Deployment → Gradle を選択し、Global Gradle settings にある Offline work にチェックを入れて、OK ボタンを押下します。
この処理は後述の jar ファイルが置き換えられないようにできないかなと思って設定していますが、ちょっと調べた限りでは置き換えが起こるかどうか分かりませんでした。。。←どうやらオンラインのままでも置きかわらないようです。でもオフラインの方が普段は速いので、オフラインにしておいましょう。たまに(LXDEからXfceに環境を変えたときなど)ビルド時にオフラインを解除してとエラーメッセージが出るときがあるので、その時に一旦解除してビルドを行い、再びオフラインにすると良いと思います。

aapt2 の為の jar ファイルの作成

先程、エラーがでましたが、原因は appt2 というツールです。
このツールの公式版は Intel CPU 向けなので Arm64 CPU であるスマホの上だと動作しません。
Arm64 CPU 版の aapt2 に置き換えます。

aapt2 は jar ファイルに含まれているので、まずは jar ファイルを探します。

画面左下の鳥のマーク → System Tools → File Manager PCManFM(以後、PCMan と呼びます) を選択します。
PCMan が立ち上がったらメニュー View → Show Hidden にチェックを入れます。
以下のフォルダを開いて下さい。

・UserLAnd の場合

/home/(ユーザーID)/.gradle/caches/modules-2/files-2.1/com.android.tools.build/aapt2

・Termux の場合

/root/.gradle/caches/modules-2/files-2.1/com.android.tools.build/aapt2

この下に aapt2-x.x.x-xxxxxx-linux.jar (x にはバージョンを表す数字が入る)があるはずですので探して下さい。
proto とついている方は今回は無視して大丈夫です。

aapt2-x.x.x-xxxxxx-linux.jar をどこかにコピーします。
ファイル名の拡張子を jar から zip に書き換えて解凍します。
aapt2 が入っているはずなので、最初にダウンロードした Arm64 CPU 版の aapt2 に置き換えます。
META-INFフォルダ、aapt2、NOTICE の3つを、aapt2-x.x.x-xxxxxx-linux.zip に圧縮します。
ファイル名の拡張子を zip から jar に書き換えます。
jar ファイルを、最初に見つけた jar ファイルの位置に上書きします。

Android Studio で再びビルド

Android Studio に再び戻り、メニューの Build → Rebuild project を選択して、リビルドでエラーが発生しないことを確認して下さい。

続いてメニューの Build → Build Bundle(s) / APK(s) → Build APK(s) を選択して APK ファイル(Androidアプリケーションのインストール用パッケージ)を作成してみて下さい。
右下に Build APK(s) というインフォメーションが出て、文字列の中に locate の文字が出るので、その文字列をクリックして下さい。
フォルダが開いて、その中に拡張子が apk のファイルが生成されていたら成功です。

試してみたい方は、APK ファイルを Android 側に渡して、インストールを試してみましょう。
もしインストールで解析ができないとか言われた場合には、自分のスマートフォンの Android のバージョンが APK ファイルの指定しているバージョンよりも古い可能性がありますので、プロジェクトを新たに作成し、自分のスマートフォンの Android のバージョンに合わせたSDKを(プロジェクトの生成ダイアログの Minimum API level の設定)合わせて下さい。

以上で開発環境の構築は終わりです。
空いた時間にでも軽く(?)開発するのもおつなものかもしれませんね。

おまけ

openjdk 11 を入れてしまった人の為の解決方法

まずは先述の通り、openjdk 8 をインストールします。

続いて以下のコマンドを実行して java-8-openjdk-arm64 が選択肢に出るので、番号で選択して下さい。

sudo update-alternatives --config java

最後に先述の通り /etc/environment を記載して JAVA_HOME 等を設定します。

参考サイト

Ubuntu18.04にJavaを導入する方法(JREやJDKの違いについても解説)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

全てのファイルをファイル名順でリストアップするコマンド

以下のコマンドで全てのファイルをファイル名順でリストアップできます。

ls -la $(find / -type f) | sort -k9

ファイルサイズ順(降順)なら

ls -la $(find / -type f) | sort -nr -k5

ファイルサイズ順(降順)トップ10だけなら

ls -la $(find / -type f) | sort -nr -k5 | head -10
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[高速版]ファイル or ディレクトリを検索して一括削除する

他の人が既に投稿してるかもしれないが、よく使うコマンドなので備忘録。

結論

find+xargsで爆速になる。

find <path> -name <name> -type <type> | xargs rm -rf

解説

ググるとxargsの他に-execオプションを使う方法もヒットする。

find <path> -name <name> -type <type> -exec rm -rf {} \;

-exec {} ;の場合、1 行ずつコマンドに渡しrmを実行する。

rm -rf foo.txt
rm -rf bar.txt
rm -rf baz.txt
rm -rf qux.txt

xargsの場合、可能な限り複数行をまとめてコマンドに渡しrmを実行する。

rm -rf foo.txt bar.txt baz.txt qux.txt

毎回実行するか、まとめて実行するかの違い。なのでxargsの方が高速。

因みに-exec {} +を使うと、複数行をまとめてコマンドに渡せるけど、実行対象が数万件とかだとxargsの方が効率的らしい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UltraZed/Ultra96/Ultra96-V2 向け Debian GNU/Linux (v2019.2版) ブートイメージの提供

はじめに

この記事は、UltraZed/Ultra96/Ultra96-V2 用に Boot Loader(U-Boot等)、Linux Kernel、Debian10(buster) Root File System を以下の URL に用意したので、そのインストール方法を説明します。Boot Loader や Linux Kernel のビルドが面倒くさいという方はどうぞ。

概要

  • Hardware
    • UltraZed-EG-IOCC : Xilinx Zynq UltraScale+ MPSoC Starter Kit by Avnet.
    • Ultra96 : Xilinx Zynq UltraScale+ MPSoC development board based on the Linaro 96Boards specification.
    • Ultra96-V2 : updates and refreshes the Ultra96 product that was released in 2018.
  • Boot Loader
    • FSBL(First Stage Boot Loader for ZynqMP)
    • PMU Firmware(Platform Management Unit Firmware)
    • BL31(ARM Trusted Firmware Boot Loader stage 3-1)
    • U-Boot xilinx-v2019.2 (customized)
  • Linux Kernel Version v4.19.0
    • linux-xlnx tag=xilinx-v2019.2
    • Enable Device Tree Overlay with Configuration File System
    • Enable FPGA Manager
    • Enable FPGA Bridge
    • Enable FPGA Reagion
    • Enable ATWILC3000 Linux Driver for Ultra96-V2
  • Debian10(buster) Root File System
  • FPGA Device Drivers and Services

インストール

ダウンロード

github から次のようにダウンロードしてください。現時点の最新バージョンは v2019.2.1 です。なお、いくつかのイメージファイルはかなり大きいので、Git LFS(Large File Storage)を使っています。お使いの環境に git-lfs がインストールされている必要があります。

shell$ git clone -b v2019.2.1 git://github.com/ikwzm/ZynqMP-FPGA-Linux
shell$ cd ZynqMP-FPGA-Linux
shell$ git lfs pull

ファイルの説明

  • target/Ultra96
    • boot/
      • boot.bin : Stage 1 Boot Loader
      • uEnv.txt : U-Boot environment variables for linux boot
      • image-4.19.0-xlnx-v2019.2-zynqmp-fpga : Linux Kernel Image (use Git LFS)
      • devicetree-4.19.0-xlnx-v2019.2-zynqmp-fpga-ultra96.dtb : Linux Device Tree Blob
      • devicetree-4.19.0-xlnx-v2019.2-zynqmp-fpga-ultra96.dts : Linux Device Tree Source
  • target/Ultra96-V2
    • boot/
      • boot.bin : Stage 1 Boot Loader
      • uEnv.txt : U-Boot environment variables for linux boot
      • image-4.19.0-xlnx-v2019.2-zynqmp-fpga : Linux Kernel Image (use Git LFS)
      • devicetree-4.19.0-xlnx-v2019.2-zynqmp-fpga-ultra96v2.dtb : Linux Device Tree Blob
      • devicetree-4.19.0-xlnx-v2019.2-zynqmp-fpga-ultra96v2.dts : Linux Device Tree Source
  • target/UltraZed-EG-IOCC/
    • boot/
      • boot.bin : Stage 1 Boot Loader
      • uEnv.txt : U-Boot environment variables for linux boot
      • image-4.19.0-xlnx-v2019.2-zynqmp-fpga : Linux Kernel Image (use Git LFS)
      • devicetree-4.19.0-xlnx-v2019.2-zynqmp-fpga-ultra96v2.dtb : Linux Device Tree Blob
      • devicetree-4.19.0-xlnx-v2019.2-zynqmp-fpga-ultra96v2.dts : Linux Device Tree Source
  • debian10-rootfs-vanilla.tgz : Debian10 Root File System (use Git LFS)
  • linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb : Linux Image Package (use Git LFS)
  • linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb : Linux Headers Package (use Git LFS)
  • fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.3.0-1_arm64.deb : fclkcfg(1.3.0) Device Driver Package
  • udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.4.6-0_arm64.deb : udmabuf(1.4.6) Device Driver Package
  • u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga_2.1.3-0_arm64.deb : udmabuf(2.1.3) Device Driver Package

SD-Card のフォーマット

  1. SD-Card のパーティション1を VFAT File System でファイルシステムを作ります。
  2. SD-Card のパーティション2を ext4 File System でファイルシステムを作ります。

Linux での SD-Card のフォーマット方法は次の URL を参照してください。

SD-Card への書き込み

0. SD-Card のマウント

shell# mount /dev/sdc1 /mnt/usb1
shell# mount /dev/sdc2 /mnt/usb2

1. Boot Partition のコピー

Ultra96 の場合

SD-Card のパーティション1(下の例では/dev/sdc1)に target/Ultra96/boot/ 下のファイルをコピーします。

shell# cp target/Ultra96/boot/*                                           /mnt/usb1
Ultra96-V2 の場合

SD-Card のパーティション1(下の例では/dev/sdc1)に target/Ultra96-V2/boot/ 下のファイルをコピーします。

shell# cp target/Ultra96-V2/boot/*                                        /mnt/usb1
UltraZed の場合

SD-Card のパーティション1(下の例では/dev/sdc1)に target/UltraZed-EG-IOCC/boot 下のファイルをコピーします。

shell# cp target/UltraZed-EG-IOCC/boot/*                                  /mnt/usb1

2. RootFS Partition の生成

SD-Card のパーティション2(下の例では/dev/sdc2)に debian10-rootfs-vanilla.tgz の中身を展開します。展開したルートファイルシステムの home/fpga にデバイスドライバの Debian パッケージをあらかじめコピーしておくと良いでしょう。後から network 経由でコピーしてもかまいません。

shell# tar xfz debian10-rootfs-vanilla.tgz -C                             /mnt/usb2
shell# mkdir                                                              /mnt/usb2/home/fpga/debian
shell# cp linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb   /mnt/usb2/home/fpga/debian
shell# cp linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb /mnt/usb2/home/fpga/debian
shell# cp fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.3.0-1_arm64.deb       /mnt/usb2/home/fpga/debian
shell# cp udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.4.6-0_arm64.deb       /mnt/usb2/home/fpga/debian
shell# cp u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga_2.1.3-0_arm64.deb     /mnt/usb2/home/fpga/debian

3. Boot Partition を見えるように fstab を設定

Boot Partition を Linux 側から常時見えるようにしておくと便利です。その場合は、あらかじめ fstab にブートパーティションをマウントするように設定しておくと良いでしょう。すでに fstab には configfs のマウントが設定されているので注意してください。

shell# mkdir /mnt/usb2/mnt/boot
shell# cat <<EOT >> /mnt/usb2/etc/fstab
/dev/mmcblk0p1  /mnt/boot   auto    defaults    0   0
EOT

余談: このくらいの記述ならあらかじめ debian10-rootfs-vanilla.tgz に書いておけば良いのに、何故わざわざ後で設定するのか疑問に思われるかもしれません。その理由は、debian10-rootfs-vanilla.tgz が Ultra96 と UltraZed と共用だからです。Ultra96 の SD-Card のブートパーティションは /dev/mmcblk0p1 ですが、UltraZed の SD-Card のブートパーティションは /dev/mmcblk1p1 です。しかも UltraZed には /dev/mmcblk0p1 というのも存在していて、あらかじめ debian10-rootfs-vanilla.tgz に書いてしまっていると UltraZed では間違えて別のデバイスにアクセスしてしまいます。そこで、面倒ですが後で設定するようにしました。

4. network の設定

Ultra96/Ultra96-V2 は WiFi を通じてネットワークに接続します。あらかじめホスト側で設定ファイルを作って RootFS に書いておくと良いかもしれません。もちろん、後で Ultra96/Ultra96-V2 を起動してそちらで設定してもかまいません。

ここでは SSID を ssssssssに、パスフレーズを ppppppppp に、暗号化したアクセスキーを xxxx とします。

まずは wpa_passphrase に SSID とパスフレーズを入力して暗号化したアクセスキーを作ります。

shell# wpa_passphrase ssssssss ppppppppp
network={
    ssid="ssssssss"
    #psk="ppppppppp"
    psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
4.1 /etc/network/interfaces.d/wlan0 に直接記述

SSID と暗号化したアクセスキーをネットワーク設定ファイル(/etc/network/interfaces.d/wlan0)に直接記述します。

/mnt/usb2/etc/network/interfaces.d/wlan0
auto  wlan0
iface wlan0 inet dhcp
    wpa-ssid ssssssss
    wpa-psk  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4.2 /etc/wpa_supplicant/wpa_supplicant.conf に記述

ネットワーク設定ファイル(/etc/network/interfaces.d/wlan0)に、次のように、ブート時に wpa_supplicant.conf を読み込んで Wifi を設定するように記述します。

/mnt/usb2/etc/network/interfaces.d/wlan0
auto  wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

SSID と暗号化したアクセスキーをWifi設定ファイル(/etc/wpa_supplicant/wpa_supplicant.conf)に記述します。

/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/run/wpa_supplicant
update_config=1

network={
    ssid="ssssssss"
    psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}

なお、ステルス SSID の場合、スキャンを強制的に行う必要があります。この場合は、/etc/wpa_supplicant/wpa_supplicant.conf に scan_ssid=1 を追加します。

/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/run/wpa_supplicant
update_config=1

network={
    ssid="ssssssss"
    scan_ssid=1
    key_mgmt=WPA-PSK
    psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}

パスフレーズ無し の SSID に接続する場合は、key_mgmt=NONE(NONE は大文字) にすると良いようです。

/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/run/wpa_supplicant
update_config=1

network={
    ssid="ssssssss"
    scan_ssid=1
    key_mgmt=NONE
}

5. SD-Card のアンマウント

shell# umount /mnt/usb1
shell# umount /mnt/usb2

デバイスドライバ パッケージのインストール

Ultra96/Ultra96-V2/UltraZed をブートして root でログイン

root'password is "admin".

debian-fpga login: root
Password:
root@debian-fpga:~#

Linux Image Package のインストール

debian10-rootfs-vanilla.tgz にはすでに v2019.2.1 の Linux Image Package(linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb) がインストールされています。ですので、以下の作業は不要ですが、なんらかの事情で再インストールする際の参考にしてください。

root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb
(Reading database ... 26393 files and directories currently installed.)
Preparing to unpack linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb ...
Unpacking linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga (4.19.0-xlnx-v2019.2-zynqmp-fpga-2) over (4.19.0-xlnx-v2019.2-zynqmp-fpga-2) ...
Setting up linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga (4.19.0-xlnx-v2019.2-zynqmp-fpga-2) ...

Linux Header Package のインストール

dpkg を使って linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb をインストールします。

root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb
Selecting previously unselected package linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga.
(Reading database ... 26393 files and directories currently installed.)
Preparing to unpack linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb ...
Unpacking linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga (4.19.0-xlnx-v2019.2-zynqmp-fpga-2) ...
Setting up linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga (4.19.0-xlnx-v2019.2-zynqmp-fpga-2) ...
make: Entering directory '/usr/src/linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga'
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  YACC    scripts/kconfig/zconf.tab.c
  LEX     scripts/kconfig/zconf.lex.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
scripts/kconfig/conf  --syncconfig Kconfig
  HOSTCC  scripts/dtc/dtc.o
  HOSTCC  scripts/dtc/flattree.o
  HOSTCC  scripts/dtc/fstree.o
  HOSTCC  scripts/dtc/data.o
  HOSTCC  scripts/dtc/livetree.o
  HOSTCC  scripts/dtc/treesource.o
  HOSTCC  scripts/dtc/srcpos.o
  HOSTCC  scripts/dtc/checks.o
  HOSTCC  scripts/dtc/util.o
  HOSTCC  scripts/dtc/dtc-lexer.lex.o
  HOSTCC  scripts/dtc/dtc-parser.tab.o
  HOSTLD  scripts/dtc/dtc
  CC      scripts/mod/empty.o
  HOSTCC  scripts/mod/mk_elfconfig
  MKELF   scripts/mod/elfconfig.h
  HOSTCC  scripts/mod/modpost.o
  CC      scripts/mod/devicetable-offsets.s
  HOSTCC  scripts/mod/file2alias.o
  HOSTCC  scripts/mod/sumversion.o
  HOSTLD  scripts/mod/modpost
  HOSTCC  scripts/bin2c
  HOSTCC  scripts/kallsyms
  HOSTCC  scripts/conmakehash
  HOSTCC  scripts/sortextable
  HOSTCC  scripts/asn1_compiler
  HOSTCC  scripts/extract-cert
make: Leaving directory '/usr/src/linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga'

fclkcfg デバイスドライバのインストール

dpkg を使って fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.3.0-1_arm64.deb をインストールします。

root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.3.0-1_arm64.deb
Selecting previously unselected package fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga.
(Reading database ... 45373 files and directories currently installed.)
Preparing to unpack fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.3.0-1_arm64.deb ...
Unpacking fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga (1.3.0-1) ...
Setting up fclkcfg-4.19.0-xlnx-v2019.2-zynqmp-fpga (1.3.0-1) ...

udmabuf デバイスドライバのインストール

dpkg を使って udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.4.6-0_arm64.deb をインストールします。

root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.4.6-0_arm64.deb
Selecting previously unselected package udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga.
(Reading database ... 45379 files and directories currently installed.)
Preparing to unpack udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga_1.4.6-0_arm64.deb ...
Unpacking udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga (1.4.6-0) ...
Setting up udmabuf-4.19.0-xlnx-v2019.2-zynqmp-fpga (1.4.6-0) ...

v2019.2 からは udmabuf の別名の u-dma-buf の Package も用意しています。もし必要ならば、これもインストールしておくと良いでしょう。
udmabuf から u-dma-buf に名前を変更した理由は、udmabuf と同じ名前の別のカーネルモジュールが Linux Kernel 5.0 に追加されたからです。したがって、Linux Kernel 5.0 以降では udmabuf という名前は使用できません。そこで u-dma-buf が替わりに提供されます。

root@debian-fpga:~# cd /home/fpga/debian
root@debian-fpga:/home/fpga/debian# dpkg -i u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga_2.1.3-0_arm64.deb
Selecting previously unselected package u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga.
(Reading database ... 45384 files and directories currently installed.)
Preparing to unpack u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga_2.1.3-0_arm64.deb ...
Unpacking u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga (2.1.3-0) ...
Setting up u-dma-buf-4.19.0-xlnx-v2019.2-zynqmp-fpga (2.1.3-0) ...

v2019.1 からのアップグレード

v2019.1 からの変更点

v2019.1 から、次の点が変更になっています。

  • Debian10(buster) Root File System の各種アプリケーションがバージョンアップしている
  • device-tree-compiler のビルドを削除
  • Linux Kernel のバージョンが 4.19.0-xlnx-v2019.1 から 4.19.0-xlnx-v2019.2 になった
  • Boot Loader の各バイナリ(U-Boot、ATF、PMUFW、FSBL、design_1_wrapper.bit) のバージョンアップ
  • uEnv.txt の大幅な追加

従って、以下の手順で v2019.1 から v2019.2 にアップグレードすることが出来ます。

アップグレード手順

1. Debian10(buster) のアップグレード

Debian10(buster) の各種アプリケーションがバージョンアップしています。Ultra96/Ultra96-V2/UltraZed がネットワークに接続しているならば、apt コマンド で v2019.1 から v2019.2 相当にアップグレードできます。Ultra96/Ultra96-V2/UltraZed をブートして root でログインして apt update と apt upgrade を実行してください。

debian-fpga login: root
Password:
root@debian-fpga:~# apt update
   :
   (中略)
   :
root@debian-fpga:~# apt upgrade
   :
   (中略)
   :

この方法では、Package すべてアップグレードしてしまいます。もしアップグレードしたくない Package がある場合は注意してください。

2. Linux Image Package のアップグレード

https://github.com/ikwzm/ZynqMP-FPGA-Linux に linux-image-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb を用意しているので、これを dpkg でインストールしてください。

3. Linux Header Package のアップグレード

https://github.com/ikwzm/ZynqMP-FPGA-Linux に linux-headers-4.19.0-xlnx-v2019.2-zynqmp-fpga_4.19.0-xlnx-v2019.2-zynqmp-fpga-2_arm64.deb を用意しているので、これを dpkg でインストールしてください。

4. Device Driver のアップグレード

Linux Kernel のバージョンが上ったため、デバイスドライバを新しい Linux Kernel バージョンに対応させる必要があります。udmabuf と fclkcfg は https://github.com/ikwzm/ZynqMP-FPGA-Linux に Package を用意しているので、これを dpkg でインストールしてください。

5. device-tree-compiler のインストール

v2018.2 で採用した Debian9では device-tree-compiler のバージョンが古い(シンボルに対応していなかった)ため、https://git.kernel.org/pub/scm/utils/dtc/dtc.git から v1.4.7 をダウンロードしてビルド&インストールしていました。
v2019.1 で採用した Debian10 では device-tree-compiler のバージョンが v1.4.7 になってシンボルに対応しました。しかし、私が v2019.1 を作っていたときはこのことに気が付かず、v2018.2 と同じように https://git.kernel.org/pub/scm/utils/dtc/dtc.git から v1.4.7 をダウンロードしてビルド&インストールしていました。
v2019.2 の Debian10 Root File System では Debian10 が提供している device-tree-compiler がインストールされています。v2019.1 からアップグレードする際は /usr/local/bin/dtc を削除して、apt コマンドで device-tree-compiler をインストールしておいたほうが良いでしょう。

6. Boot Partition のアップグレード

Boot Partition には Boot Loader、Linux Kernel Image、uEnv.txt が含まれます。github から v2019.2.1 をダウンロードて、target/[Ultra96|Ultra96-V2|UltraZed-EG-IOCC]/boot 下のファイルを Boot Partition にコピーしてください。ただし、uEnv.txt も上書きしてしまいますので、uEnv.txt になにか重要な変更を加えていた場合はバックアップをとっておくと良いでしょう。

6.1 Ultra96 の場合

SD-Card のパーティション1(下の例では/mnt/boot)に target/Ultra96/boot/ 下のファイルをコピーします。

shell# cp target/Ultra96/boot/* /mnt/boot
6.2 Ultra96-V2 の場合

SD-Card のパーティション1(下の例では/mnt/boot)に target/Ultra96-V2/boot/ 下のファイルをコピーします。

shell# cp target/Ultra96-V2/boot/*  /mnt/boot
6.3 UltraZed の場合

SD-Card のパーティション1(下の例では/mnt/boot)に target/UltraZed-EG-IOCC/boot 下のファイルをコピーします。

shell# cp target/UltraZed-EG-IOCC/boot/* /mnt/boot

参考

v2019.2 から Boot Loader(U-Boot等) のビルド環境はターゲット毎に別々のリポジトリに暖簾分けされました。以下の URL を参考にしてください。

現時点の最新バージョンは v2019.2.1 ですが、それ以前のバージョンをインストールする際は以下の記事を参照してください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Zabbix-agentでTomcatのプロセスを監視する

どうやるの?

Tomcatの起動プロセスの監視アイテムを作るぞ。
まずはzabbix_getで動作確認だ。

$ zabbix_get -s 192.168.200.24 -k proc.num[httpd]
6
$ zabbix_get -s 192.168.200.24 -k proc.num[tomcat]
0

tomcatはどうやって取るんだ・・・?

答えはこれ

$ zabbix_get -s 192.168.200.24 -k proc.num[java,,,"org.apache.catalina.startup.Bootstrap start"]
1

環境

  • RHEL 7.7 (Maipo)
  • zabbix_server 4.0.16
  • zabbix_agent 4.0.16
  • Tomcat 8.5.50

リファレンスをちゃんと読む

Zabbix Documentation 2.2に使い方があったので調べてみると、プロセス名を知る必要があることを知る。

proc.num[<name>,<user>,<state>,<cmdline>]

  • name - プロセス名(デフォルトは「全プロセス」)
  • user - ユーザー名(デフォルトは「全ユーザー」)
  • state - 可能な値: all (デフォルト)、run, sleep, zomb
  • cmdline - コマンドラインによるフィルター(正規表現)

tomcatのプロセス名を調べる

起動しているtomcatの状態を調べます。

$ systemctl status tomcat
● tomcat.service - Apache Tomcat 8
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since 木 2020-02-06 15:01:19 JST; 1h 29min ago
  Process: 844 ExecStart=/opt/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 844 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/tomcat.service
           └─875 /usr/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.prot...

 2月 06 15:01:19 192.168.200.24 systemd[1]: Starting Apache Tomcat 8...
 2月 06 15:01:19 192.168.200.24 systemd[1]: Started Apache Tomcat 8.

PID875をさらに調べます。

$ cat /proc/875/stat 
875 (java) S 1 844 844 0 -1 1077944320 19379 0 124 0 937 64 0 0 20 0 41 0 752 2357014528 21813 18446744073709551615 4194304 4196524 140724105374304 140724105356960 140023800299543 0 0 2 16800973 18446744073709551615 0 0 17 0 0 0 5 0 0 6294912 6295604 12607488 140724105383058 140724105383592 140724105383592 140724105383914 0

()で囲われている箇所がプロセス名です。
tomcatを起動しているプロセス名はjavaのようです。

解決(間違い)

$ zabbix_get -s 192.168.200.24 -k proc.num[java]
1

取れました!

...でもふと気づく。
これではただのJavaのプロセスなだけで、tomcatのプロセスかどうかは判別できないことに。

プロセスをもう一度確認

$ ps aux | grep java
tomcat     875  0.1  8.6 2301772 87452 ?       Sl   15:01   0:10 /usr/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/opt/tomcat -Dcatalina.home=/opt/tomcat -Djava.io.tmpdir=/opt/tomcat/temp org.apache.catalina.startup.Bootstrap start

どうやらこのプロセスはtomcatが実行しているようです。

$ zabbix_get -s 192.168.200.24 -k proc.num[java,tomcat]
1

取れました。

ただ、よくよく考えてみると、tomcatユーザがjavaコマンドを実行しているだけで
Tomcatの起動プロセスを監視しているわけではないことに気付きました。

もう一度調べる

プロセスを確認して気付きました。
optionが長くてわかりにくかったけど、起動プロセス(org.apache.catalina.startup.Bootstrap start)の記述があるじゃないですか。

$ ps aux | grep java
tomcat    2023 83.6  7.3 2299724 74204 ?       Sl   17:26   0:02 

/usr/bin/java 
  -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties 
  -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 
  -Djdk.tls.ephemeralDHKeySize=2048 
  -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 
  -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 
  -Dignore.endorsed.dirs= 
  -classpath /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar 
  -Dcatalina.base=/opt/tomcat 
  -Dcatalina.home=/opt/tomcat 
  -Djava.io.tmpdir=/opt/tomcat/temp 
  org.apache.catalina.startup.Bootstrap start

proc.num[<name>,<user>,<state>,<cmdline>]
第4引数のコマンドラインを使えば抽出できそうです。

$ zabbix_get -s 192.168.200.24 -k proc.num[java,,,"org.apache.catalina.startup.Bootstrap start"]
1

無事に起動プロセスのカウントを取得できました。
tomcatユーザであるかどうかはあまり意味がないと思ったのであえて書きませんでした。

終わりに

長々と書いてしまいました。
proc.num[java,tomcat]と書いてある記述も見かけたので、こちらを紹介させていただきました。

補足

Tomcatのインストール方法によっては上記のやり方とは異なりますが、調べ方さえ分かれば応用は効きくと思います。
私の場合はソースをDL・展開してインストールを行いました。
参考:ApacheとTomcatを連携させてみた

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LPIC201学習メモ

LPIC201学習メモ

10年ぶりにLPIC試験を受けなおすのでその勉強の過程で記憶に残った部分をメモしていく

  • ブートローダの設定ファイルの場所
    /boot/grub/menu.lst(GRUBの場合)

  • GRUB2の場合
    /etc/default/grubの内容を修正した後update-grub2コマンド実行

  • ブートローダ時に設定されたカーネルパラメータは以下のコマンドで確認
    cat /proc/cmdline

  • systemdの管理コマンド→systemctl

    httpdサービス起動(.serviceは省略可能)
    systemctl start httpd.service
    or
    systemctl start httpd

  • 変更されているすべての設定ファイル表示
    systemd-delta

-debian系のサービス管理コマンド
update-rc.d samba default

-/etc/fstabの書式
デバイス名 マウントポイント ファイルシステム オプション dump fsck

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Let's Encrypt certbot renew 自動更新エラー

Let's Encryptを使ってssl証明書を取得後、自動更新の設定をしたものの、エラーが出て自動更新されなかった時の解決法を一つ紹介します。

前提

・Debian(GCP)
・Let's Encryptを使ってSSL証明書の取得、https化が完了している。

目標

Let's EncryptのSSL証明書は有効期限が3ヶ月なのでnerewコマンドをcrontabで定期実行させて証明書を自動更新する。

変更前の設定(実行スケジュールの部分は省略)
crontab
certbot renew --post-hook "/etc/init.d/apache2 restart"
更新エラー

portが使用中なので更新できないと言っています。起動中のwebサーバ(SSL証明書の更新対象サービス)を停止させてからrenewコマンドを実行させなければいけませんでした。

WARNING:certbot.renewal:Attempting to renew cert from /etc/letsencrypt/renewal/SITE_URI.conf produced an unexpected error: At least one of the required ports is already taken.. Skipping.
変更後の設定(実行スケジュールの部分は省略)
crontab
certbot renew --pre-hook "/etc/init.d/apache2 stop" --post-hook "/etc/init.d/apache2 start"

変更前のコマンドに--pre-hookオプションを追加しました。

補足

・"/etc/init.d/apache2 restart"、"/etc/init.d/apache2 start"、"/etc/init.d/apache2 stop"の箇所はwebサーバの停止、起動、再起動のコマンドです。環境によって読み替えてください。

・rootユーザのcrontabに追加するとコマンドはroot権限で実行されます。他ユーザのcrontabに追加する時は"sudo /etc/init.d/apache2 restart"のようにコマンドの前にsudoを付ける必要があります。

・certbot renewの箇所は環境によってcertbot-autoなどに読み替えてください。環境によってcertbotのディレクトリを明示する場合もあります。/home/user_name/certbot renew など。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ラズパイ4のsshが超遅いときはIPv6を無効化するとよい

環境

セットアップ環境の詳細はラズパイ4にraspbian busterをセットアップを参照。

  • Raspberry Pi 4 Model B (RAM 4GB)
  • raspbian buster (2019-09-26-raspbian-buster.zip)

現象

ラズパイにssh接続すると、繋がるまでに時間がかかる。

原因

デフォルトがIPv6接続→IPv4接続の順となっており、IPv6接続のタイムアウトまでの時間がかかっていた。(セットアップ時にどっかミスったのかもしれないけど)

Windows Powershellから接続しても、他のLinuxから接続しても遅いためラズパイ側の問題だろうとあたりをつけた。

sshするときに-vオプションを付けて実行すると、デバッグ情報が表示できる。ここではWindowsからラズパイに接続しており、IPv6アドレスっぽい接続にタイムアウトで失敗したあと、IPv4で接続していることが分かる。

$ ssh -v ユーザ名@マシン名
OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
debug1: Connecting to マシン名 [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx] port 22.
debug1: connect to address xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx port 22: Connection timed out
debug1: Connecting to pisrv [yyy.yyy.yyy.yyy] port 22.
debug1: Connection established.

改善方法

ラズパイの設定を変更する。

$ sudo vi /etc/sysctl.conf

sysctl.confに下記を追記する。

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

sysctl.confの変更を反映する。

$ sudo sysctl -p

下記コマンドでinet6という項目がないことを確認する。

$ ip a

一度、ssh接続を終了.

$ exit

再度sshで接続して確かめる。

$ ssh -v ユーザ名@マシン名
OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
debug1: Connecting to pisrv [yyy.yyy.yyy.yyy] port 22.
debug1: Connection established.

( ..)φメモ

上記は、全インターフェースでIPv6を無効化している。特定のインターフェースのみ無効化したい場合は、/etc/sysctl.confへの追記項目を下記にすればよい。以下、eth0のみ無効にする例。

net.ipv6.conf.eth0.disable_ipv6 = 1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む