Linux

【Zynq7】5.RootFSのマウント(Ubuntu18.04)

1.記事一覧

記事は複数回に分けて投稿します。Zynq7020SoCで動作する、PetaLinuxを使わない素のLinuxを構築します。

ZynqMP(arm64版)はこちら

エッジArm Linux構築編(armv7l)

エッジArm Linux実践編(armv7l)

2.環境

開発ホストPCUbuntu20.04, intel core i5 750 RAM 16G
ターゲットボードDigilent Zybo z7-20 Rev.B.2(XC7Z020-1CLG400C, DDR3 1GB)
SDカード:micro SDHC 32G
RootFSUbuntu18.04 bionic(armv7l, armhf)
http://ports.ubuntu.com

今回はDockerは使いません。ホストPC上で作業します。コンテナでホストPCのworkフォルダを共有してそこで作業すれば行けそうですが、debootstrapコマンドが途中でコケるようです。またchroot後もdebootstrap –second-stageがうまく動きません。

3.環境構築

必要なパッケージをインストールします。qemuは有名なエミュレータでx86のホストマシンでarmv7のファイルシステムを操作できるようにします。debootstrapはインストールディスクを使わずにディストリビューションを構築するツールです。

Bash
$ 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の構築

手順の流れは以下の通りにやります。

  1. ホストPC上の適当なフォルダにRootFSを構築する
  2. 構築後のRootFSをSDカード第2パーティションROOT_FSに同期する(rsync)

SDカード上で作業するとアクセス速度が遅いので最後に同期したいと思います。

5-1. debootstrapによるUbuntu18.04イメージのダウンロード(第1段階)

workフォルダ上にいるとした場合、適当な作業フォルダを作ります。ダウンロードは時間がかかります(5分ほど)。debootstrapは2段階の手順を踏みます。

Bash
$ 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にコピーします。

Bash
$ sudo cp /usr/bin/qemu-arm-static ./rootfs/usr/bin/

chrootコマンドでrootディレクトリを切り替えます。qemuにより、armv7がエミュレートされます。

Bash
$ sudo chroot ./rootfs

debootstrap第2段階を実行します。10分程かかります。

Bash
root# export distro=bionic
root# export LANG=C
root# /debootstrap/debootstrap --second-stage

“I: Base system installed successfully.”のメッセージが出たら成功です。

5-3. RootFsのセットアップ

ユーザ作成

Bash
root# passwd #←suするためのパスワード設定
root# su #←rootユーザに切り替え
root# passwd #←rootパスワード設定
root# apt update

ロケーションの設定(ja_JP.UTF-8など必要あれば)
上下キーでカーソル移動、tabで選択し<ok>にカーソル移動したらEnter

Bash
root# dpkg-reconfigure locales 

タイムゾーンの設定(Asia/Tokyoなど)

Bash
root# dpkg-reconfigure tzdata

ホスト名の変更(好きな名前に変えてください)

Bash
root# cat /etc/hostname #←現在の名前
root# echo zyboz7 > /etc/hostname

bootパーティションの自動マウント SDカード第1パーティションを/bootにマウントします。

Bash
root# cat <<EOT >/etc/fstab
/dev/mmcblk0p1 /boot auto defaults 0 0
EOT

viの初期設定

Bash
root# cd /
root# cat > .vimrc
set encoding=utf-8
set fileencodings=iso-2022-jp,sjis,utf-8
Ctrl+Dで終了

一般ユーザ作成

Bash
root# adduser zynq

sudors権限設定(vi起動します)

Bash
root# visudo
#"zynq ALL=(ALL:ALL) ALL"をrootの下に追記

有線ネットワーク設定
Ubuntu18からnetplanによる設定になったようです。

Bash
root# vi /etc/netplan/50-cloud-init.yaml

YAML
network:
  ethernets:
  eth0:
    dhcp4: true
    dhcp6: false
    optional: true
  version: 2

SSHインストール

Bash
root# apt install openssh-server

終わったらchrootで切り替えたrootから戻ります。何度かやると抜けます。

Bash
root# exit

6.SDカードのRootパーティション同期

ローカルに作成したrootfsをSDカードのROOT_FSパーティションと同期します。
まずSDカードをホストPCにマウントし、場所を確認します。Ubuntu20.04は自動で/media以下にマウントされていました。

Bash
$ 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されると思いますが、終了待たずにうっかり引っこ抜く事故を起こしやすいので)

Bash
$ sudo rsync -av ./rootfs/ /media/goto/ROOT_FS/
$ sync

7.bootパーティション準備

第1パーティションはboot関連ファイルを格納します。3ファイルをコピーしてください。

8.起動確認

8-1. ホストPCのシリアルポート準備

自身のユーザがシリアルコンソールに接続するときに初期設定として必要です。

Bash
$ sudo gpasswd -a <ユーザ> dialout

8-2. シリアルコンソール接続

ホストPC側のシリアルターミナルアプリは何を使用しても良いですが、私はターミナルでscreenコマンドを使用しています。このコマンドは

Bash
$ screen /dev/ttyUSB1 115200

というように入力すると接続できます。しかし、シリアルポートのデバイスファイル”/dev/ttyUSB1 “はPCの環境によって異なるのでボードの電源を入れないとわかりません。
まずはボードの電源を切った状態でシリアルポート一覧を表示します。

Bash
#ボードの電源を切った状態で
$ ls /dev/tty*
... ... ... ...

次にSDカードを入れずにUSBケーブルをボードとホストPCに接続し、電源を入れ、シリアルポート一覧を表示します。

Bash
#ボードの電源を入れた後
$ 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のログイン画面が表示されます。

Bash
...
[ 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で実用的なシステムを構築するための本」を参考に実践した内容です。本記事では一部しか内容を取り上げていません。もっとディープな内容がほしい方は是非買ってみてください。

ABOUT ME
sh-goto
組込エンジニア. 最近の遊びはLinuxの低レイヤいじりとXilinxのZynqとFPGAを使った電子工作