1.記事一覧
記事は複数回に分けて投稿します。Zynq7020SoCで動作する、PetaLinuxを使わない素のLinuxを構築します。
エッジArm Linux構築編(armv7l)
- 【Zynq7】Yoctoを使わずに素のLinuxをソースから構築する
- 【Zynq7】1.FSBL(1stStageBootLoader)の構築
- 【Zynq7】2.U-bootの構築
- 【Zynq7】3.Linuxカーネルの構築
- 【Zynq7】4.Zyboz7ボードのデバイスツリー構築
- 【Zynq7】5.RootFSのマウント(Ubuntu18.04) ←本ページ
- 【Zynq7】6.カーネルモジュールの配置
- 【Zynq7】番外編1.u-bootが途中で止まる問題
- 【Zynq7】番外編2.MACアドレスをQSPIFlashから読み出して設定する
エッジArm Linux実践編(armv7l)
- 【Zynq7】実践1. LinuxにRTCを認識させる【I2Cデバイス】
- 【Zynq7】実践2. 温度センサをPython+Dockerで使う【I2Cデバイス】
- 【Zynq7】実践3. 組込みLinuxでコンテナ導入に苦労した話【Docker Engine編】
- 【Zynq7】実践4. LinuxでSPIを使う【液晶編1】
- 【Zynq7】実践5. ZynqPLのGPIOをLinuxで使う【液晶編2】
- 【Zynq7】実践6. PythonでSPI液晶を使う【液晶編3】
- 【Zynq7】閑話. SPI バス周波数が上がらない問題
2.環境
開発ホストPC | Ubuntu20.04, intel core i5 750 RAM 16G |
ターゲットボード | Digilent Zybo z7-20 Rev.B.2(XC7Z020-1CLG400C, DDR3 1GB) SDカード:micro SDHC 32G |
RootFS | Ubuntu18.04 bionic(armv7l, armhf) http://ports.ubuntu.com |
今回はDockerは使いません。ホストPC上で作業します。コンテナでホストPCのworkフォルダを共有してそこで作業すれば行けそうですが、debootstrapコマンドが途中でコケるようです。またchroot後もdebootstrap –second-stageがうまく動きません。
3.環境構築
必要なパッケージをインストールします。qemuは有名なエミュレータでx86のホストマシンでarmv7のファイルシステムを操作できるようにします。debootstrapはインストールディスクを使わずにディストリビューションを構築するツールです。
$ sudo apt install qemu-user-static debootstrap
4.SDカードの準備
SDカードのパーティションを作成します。構成は
- 第1パーティション:FAT32 サイズ:100MB ラベル:ZYNQ_BOOT
- 第2パーティション:ext4 サイズ:残り領域 ラベル:ROOT_FS
qiitaに詳しい説明をされている記事があったので、そちらを参考にしました。
https://qiita.com/yoshiyasu1111/items/e734eba7a842e3ba422d
5.RootFSの構築
手順の流れは以下の通りにやります。
- ホストPC上の適当なフォルダにRootFSを構築する
- 構築後のRootFSをSDカード第2パーティションROOT_FSに同期する(rsync)
SDカード上で作業するとアクセス速度が遅いので最後に同期したいと思います。
5-1. debootstrapによるUbuntu18.04イメージのダウンロード(第1段階)
workフォルダ上にいるとした場合、適当な作業フォルダを作ります。ダウンロードは時間がかかります(5分ほど)。debootstrapは2段階の手順を踏みます。
$ mkdir rootfs_wk
$ mkdir rootfs_wk/rootfs
$ cd rootfs_wk
$ sudo debootstrap --arch armhf bionic ./rootfs http://ports.ubuntu.com/
5-2. debootstrapによるrootfsのセットアップ(第2段階)
QEMUプログラムをrootfsにコピーします。
$ sudo cp /usr/bin/qemu-arm-static ./rootfs/usr/bin/
chrootコマンドでrootディレクトリを切り替えます。qemuにより、armv7がエミュレートされます。
$ sudo chroot ./rootfs
debootstrap第2段階を実行します。10分程かかります。
root# export distro=bionic
root# export LANG=C
root# /debootstrap/debootstrap --second-stage
“I: Base system installed successfully.”のメッセージが出たら成功です。
5-3. RootFsのセットアップ
ユーザ作成
root# passwd #←suするためのパスワード設定
root# su #←rootユーザに切り替え
root# passwd #←rootパスワード設定
root# apt update
ロケーションの設定(ja_JP.UTF-8など必要あれば)
上下キーでカーソル移動、tabで選択し<ok>にカーソル移動したらEnter
root# dpkg-reconfigure locales
タイムゾーンの設定(Asia/Tokyoなど)
root# dpkg-reconfigure tzdata
ホスト名の変更(好きな名前に変えてください)
root# cat /etc/hostname #←現在の名前
root# echo zyboz7 > /etc/hostname
bootパーティションの自動マウント SDカード第1パーティションを/bootにマウントします。
root# cat <<EOT >/etc/fstab
/dev/mmcblk0p1 /boot auto defaults 0 0
EOT
viの初期設定
root# cd /
root# cat > .vimrc
set encoding=utf-8
set fileencodings=iso-2022-jp,sjis,utf-8
Ctrl+Dで終了
一般ユーザ作成
root# adduser zynq
sudors権限設定(vi起動します)
root# visudo
#"zynq ALL=(ALL:ALL) ALL"をrootの下に追記
有線ネットワーク設定
Ubuntu18からnetplanによる設定になったようです。
root# vi /etc/netplan/50-cloud-init.yaml
network:
ethernets:
eth0:
dhcp4: true
dhcp6: false
optional: true
version: 2
SSHインストール
root# apt install openssh-server
終わったらchrootで切り替えたrootから戻ります。何度かやると抜けます。
root# exit
6.SDカードのRootパーティション同期
ローカルに作成したrootfsをSDカードのROOT_FSパーティションと同期します。
まずSDカードをホストPCにマウントし、場所を確認します。Ubuntu20.04は自動で/media以下にマウントされていました。
$ lsblk
sdf 8:80 1 28.3G 0 disk
├─sdf1 8:81 1 100M 0 part /media/goto/ZYNQ_BOOT
└─sdf2 8:82 1 28.2G 0 part /media/goto/ROOT_FS
同期します。すぐ終わります。
rsyncはすぐ終わるように見えますが、ファイルシステムキャッシュに書き込んでいるだけなので、”sync”コマンドを実行して確実に書き込んでからアンマウントしてください。
(アンマウント時にsyncされると思いますが、終了待たずにうっかり引っこ抜く事故を起こしやすいので)
$ sudo rsync -av ./rootfs/ /media/goto/ROOT_FS/
$ sync
7.bootパーティション準備
第1パーティションはboot関連ファイルを格納します。3ファイルをコピーしてください。
8.起動確認
8-1. ホストPCのシリアルポート準備
自身のユーザがシリアルコンソールに接続するときに初期設定として必要です。
$ sudo gpasswd -a <ユーザ名> dialout
8-2. シリアルコンソール接続
ホストPC側のシリアルターミナルアプリは何を使用しても良いですが、私はターミナルでscreenコマンドを使用しています。このコマンドは
$ screen /dev/ttyUSB1 115200
というように入力すると接続できます。しかし、シリアルポートのデバイスファイル”/dev/ttyUSB1 “はPCの環境によって異なるのでボードの電源を入れないとわかりません。
まずはボードの電源を切った状態でシリアルポート一覧を表示します。
#ボードの電源を切った状態で
$ ls /dev/tty*
... ... ... ...
次にSDカードを入れずにUSBケーブルをボードとホストPCに接続し、電源を入れ、シリアルポート一覧を表示します。
#ボードの電源を入れた後
$ ls /dev/tty*
... /dev/ttyUSB0 /dev/ttyUSB1 ...
私の環境では”/dev/ttyUSB0″、”/dev/ttyUSB1″が新たに表示され、”/dev/ttyUSB1″側が使用するシリアルポートでした。USB0はよくわかりません。(JTAG関連かな?)
8-3. ボード準備
SDカードをzyboz7ボードに挿し、USBケーブルをホストPCと接続します。
ボード上の起動選択ジャンパをSDに切り替えます。
8-4. Linuxの起動
ボードの電源を入れる前にコマンドを先に入力しておきます。
$ screen /dev/ttyUSB1 115200
ボードの電源を入れ、入力したコマンドをEnterします。電源投入直後からメッセージが出力されるので、最初は切れてしまいます。
うまく行けばFSBL、u-boot、Linuxと順に起動し、Ubuntuのログイン画面が表示されます。
...
[ OK ] Started Dispatcher daemon for systemd-networkd.
[ OK ] Reached target Multi-User System.
[ OK ] Reached target Graphical Interface.
Starting Update UTMP about System Runlevel Changes…
[ OK ] Started Update UTMP about System Runlevel Changes.
Ubuntu 18.04 LTS zyboz7 ttyPS0
zyboz7 login: zynq
Password:
Last login: 月 1月 29 00:58:32 JST 2018 on ttyPS0
Welcome to Ubuntu 18.04 LTS (GNU/Linux 5.15.0-zyboz7_custom armv7l)
Documentation: https://help.ubuntu.com
Management: https://landscape.canonical.com
Support: https://ubuntu.com/advantage
zynq@zyboz7:~$
9.最後に
本記事はなひたふ氏の著書「ZYNQで実用的なシステムを構築するための本」を参考に実践した内容です。本記事では一部しか内容を取り上げていません。もっとディープな内容がほしい方は是非買ってみてください。