組込みLinux Beaglebone blackでやってみる その8 TFTPとNFSで起動

ここでは、『その7』までで作った、ルートFSに必要なディレクトリや初期化ファイル等を作っていきます。 そのルートFSはuBuntuのディレクトリに置いておいて、BBBがブートした時、nfs(Network File System)経由でマウントします。 ここまででまず初歩の一通り完了です。

起動手順

  1. microSDで起動(S2を押しながら電源ON)
  2. uImageとam3x_boneblack.dtbをTFTPでダウンロードしてKernel起動
  3. Kernelが起動したら、NFSに接続してルートFSをマウントする
  4. 初期化ファイルを実行してネットワーク設定など必要な処理を実施(シェルスクリプト)

各種ファイル群を保存する場所

  • microSD の/BOOT/(第一パーティション)
    • u-boot.img
    • MLO
    • boot.scr
    • u-boot-spl.bin
  • uBuntu /var/lib/tftpboot/ —> TFTPでDDRに転送
    • uImage
    • am335x-boneblack.dtb
  • uBuntu /srv/nfs/bbb/ —-> NFSとしてマウントして使用
    • 『その7』のbusyboxで作ったディレクトリやファイル(bin,sbin,usr, lib)、linuxrc等
    • 『その8』で作るディレクトリやファイル

Root File Systemに必要なディレクトリ追加

~/BBB_Workspace/RFS_Staticに4個のディレクトリ(bin,sbin,usr, lib)とlinuxrcファイルが生成されますが、手動で追加しなければならないディレクトリやファイルがあるので作っておきます。

  • まず/devがないと何もマウント出来ないので、/devを作る。
  • /proc は、仮想ファイルシステムをマウントするディレクトリ。 中は空で構いません。 Linux起動時に自動的にファイルが作られ終了時になくなります。
  • /sys は、/proc同様仮想ファイルシステムだが、Kernelオブジェクトや属性等のsysfs用。 Device Driverと情報のやり取りします。
  • /root は、rootディレクトリをマウントするためのディレクトリです。/root/.ssh/なども必要になってきます。
  • /config は、configfsファイルシステム用。configfsはUserspaceからKernelオブジェクトを管理用です。
  • /etc ユーザーリスト、グループリスト、パスワード等を保存するファイルなどようです。
$ cd ~/BBB_Workspace/RFS_Static
$ sudo mkdir dev proc sys root config etc var

Initに必要なファイル追加

Kernelが起動時にこれらの初期化をmain.cのkernel_init()で実行する。 もし全て0(成功)でなければKernel Panicとなって起動できないので、kernel_init()用の。

/linux-5.10/init/main.c kernel_init()
	if (!try_to_run_init_process("/sbin/init") ||
	    !try_to_run_init_process("/etc/init") ||
	    !try_to_run_init_process("/bin/init") ||
	    !try_to_run_init_process("/bin/sh"))
		return 0;

	panic("No working init found.  Try passing init= option to kernel. "
	      "See Linux Documentation/admin-guide/init.rst for guidance.");

*もし、Kernel panic – not syncing: No working init found. Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.で止まった時は、~/BBB_Workspace/Downloads/linux-5.10/Documentation/admin-guide/init.rstをviで開いて対処。

Debian系(uBuntuもDebian系)でBusyBoxの場合はrcSスクリプト、System Vの場合はinittabスクリプトが/etc/init.d/に必要。(Slackwareの場合はrc.local。start-stop-deamonはdebianやuBuntuのコマンド。)

BusyBoxの場合 *今回はこれ

Busybox init は、最初に/etc/inittabを探します。見つからない場合は、 /etc/init.d/rcS スクリプトを探します。  初期化方式のSysVinitに近いです。 YoctoやBuildrootでビルドする際は、初期値の初期化方式のsystemdが推奨。

ここではrcSを作るので、inittabは作りません。 しかしBuildrootでは自動的にinittabが作られ、狩猟時に消える一時ディレクトリが作られ、マウントされ、その後にrcSも呼び出されています。 確かにこの方が、簡単にマウントすることが出来ますね。

$ cd ~/BBB_Workspace/RFS_Static
$ sudo mkdir /etc/init.d
$ sudo vi rcS    <---- Insert モードで以下をShift+Insで貼り付ける。

rcSはshell scriptで記述なので#!/bin/shで始まる。

/etc/init.d/rcS
#!/bin/sh

# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
echo "Mounting proc"
mount -t proc /proc /proc

for i in /etc/init.d/S??* ;do
     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue

     case "$i" in
	*.sh)
	    # Source shell script for speed.
	    (
		trap - INT QUIT TSTP
		set start
		. $i
	    )
	    ;;
	*)
	    # No sh extension, so fork subprocess.
	    $i start
	    ;;
    esac
done

rcS以外にも/etc/init.d/に以下ファイルを作っておく。

rcK
#!/bin/sh

# Stop all init scripts in /etc/init.d
# executing them in reversed numerical order.
#
for i in $(ls -r /etc/init.d/S??*) ;do

     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue

     case "$i" in
	*.sh)
	    # Source shell script for speed.
	    (
		trap - INT QUIT TSTP
		set stop
		. $i
	    )
	    ;;
	*)
	    # No sh extension, so fork subprocess.
	    $i stop
	    ;;
    esac
done
S01logging
#!/bin/sh
#
# Start logging
#

SYSLOGD_ARGS=-n
KLOGD_ARGS=-n
[ -r /etc/default/logging ] && . /etc/default/logging

start() {
	printf "Starting logging: "
	start-stop-daemon -b -S -q -m -p /var/run/syslogd.pid --exec /sbin/syslogd -- $SYSLOGD_ARGS
	start-stop-daemon -b -S -q -m -p /var/run/klogd.pid --exec /sbin/klogd -- $KLOGD_ARGS
	echo "OK"
}

stop() {
	printf "Stopping logging: "
	start-stop-daemon -K -q -p /var/run/syslogd.pid
	start-stop-daemon -K -q -p /var/run/klogd.pid
	echo "OK"
}

case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  restart|reload)
	stop
	start
	;;
  *)
	echo "Usage: $0 {start|stop|restart}"
	exit 1
esac

exit $?
S02module
#!/bin/sh
#
# load the kernel modules at startup (
#

case "$1" in
  start)
	printf "Loading kernel modules : "
	/sbin/modprobe g_ether
	[ $? = 0 ] && echo "OK" || echo "FAIL"
	;;
  stop)
	printf "Unloading kernel modules : "
	/sbin/rmmod g_ether
	[ $? = 0 ] && echo "OK" || echo "FAIL"
	;;
  restart|reload)
	"$0" stop
	"$0" start
	;;
  *)
	echo "Usage: $0 {start|stop|restart}"
	exit 1
esac

exit $?
S40network
#!/bin/sh
#
# Start the network....
#

# Debian ifupdown needs the /run/network lock directory
mkdir -p /run/network

case "$1" in
  start)
	printf "Starting network: "
	/sbin/ifup -a
	[ $? = 0 ] && echo "OK" || echo "FAIL"
	;;
  stop)
	printf "Stopping network: "
	/sbin/ifdown -a
	[ $? = 0 ] && echo "OK" || echo "FAIL"
	;;
  restart|reload)
	"$0" stop
	"$0" start
	;;
  *)
	echo "Usage: $0 {start|stop|restart}"
	exit 1
esac

exit $?

sshはないのでssh-keygenもないのでS50sshdは実行されません。

S50sshd
#!/bin/sh
#
# sshd        Starts sshd.
#

# Make sure the ssh-keygen progam exists
[ -f /usr/bin/ssh-keygen ] || exit 0

umask 077

start() {
	# Create any missing keys
	/usr/bin/ssh-keygen -A

	printf "Starting sshd: "
	/usr/sbin/sshd
	touch /var/lock/sshd
	echo "OK"
}対処
stop() {
	printf "Stopping sshd: "
	killall sshd
	rm -f /var/lock/sshd
	echo "OK"
}
restart() {
	stop
	start
}

case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  restart|reload)
	restart
	;;
  *)
	echo "Usage: $0 {start|stop|restart}"
	exit 1
esac

exit $?

実行権限を与える

/srv/nfs/bbb/etc/init.d/
sudo chmod 755 *

System Vの場合 *今後の参考用

  • mknod は特殊ファイルを生成する
  • mknod directory/file_name type [major minor]
    • type b Block型特殊ファイル
    • type c Character型特殊ファイル
    • type p pipe
  • major と minor番号は生成するファイルによってきまっている。
  • https://www.kernel.org/doc/html/latest/admin-guide/devices.html
  • /dev/console はKernelがインターラクションに使う場所
  • /dev/null は空ファイルのように振る舞い、command/programの出力を抑制する
  • /dev/zero はメモリ領域を埋めるために使用される
/dev
$ cd ~/BBB_Workspace/RFS_Static
$ sudo mkdir dev
$ cd dev
//3つの特殊ファイルを用意
//busyboxの時にconsoleが残っていたらKernel Panicになる。
$ sudo mknod -m 600 console c 5 1
$ sudo mknod -m 666 null c 1 3
$ sudo mknod -m 666 tty c 5 0
$ sudo mknod -m 666 zero c 1 5
$ sudo mknod ram b 1 0
  • /proc は、仮想ファイルシステムをマウントするディレクトリ。 中は空でいい。 Linux起動時に自動的にファイルが作られ終了時になくなる。
  • /sys は、/proc同様仮想ファイルシステムだが、Kernelオブジェクトや属性等のsysfs用。 Device Driverと情報のやり取りする。
  • /root は、rootディレクトリをマウントするためのディレクトリ
  • /config は、configfsファイルシステム用。configfsはUserspaceからKernelオブジェクトを管理用。
// /proc /sys /root /config を生成
$ mkdir proc sys root config
  • /etcを作成しファイルの中身を書き込む。
  • fstabファイルも生成する。 仮想ファイルシステムをマウントする。
  • hostnameとパスワードも設定する
$ mkdir etc
//inittab scriptはSystem V用。BusyBox用はrcS script。=>/etc/init.d/
$ cat >> etc/inittab
//上記のコマンド実行すると入力モードになるので、下記を打ち込む。 ENTERで行を確定してctrl+Dで終了
null::sysinit:/bin/mount -a
null::sysinit:/bin/hostname -F /etc/hostname
null::respawn:/bin/cttyhack /bin/login root
null::restart:/sbin/reboot
[ctrl-D]

$ cat >> etc/fstab
proc  /proc proc  defaults  0 0
sysfs /sys  sysfs defaults  0 0
[ctrl-D]

$ cat >> etc/hostname
ichiri-BBB
[ctrl-D]

$ cat >> etc/passwd
root::0:0:root:/root:/bin/sh
[ctrl-D]

ブートに必要なファイルをまとめる

  1. ブートには、boot.scr以外に以下の5つのファイルが必要。 MLO, u-boot.img, boot,scrをSDのパーティション1のfat16フォーマットでbootフラグのついた/BOOT/ディレクトリに入れる。 
  2. uImageとam335x-boneblack.dtbはホストPCからtftp転送するので、私の場合、設定しているtftpのルートディレクトリ/var/lib/tftpboot/に入れておく。
  • microSD の/BOOT/(第一パーティション)に入れるファイル
    • u-boot.img —– in ~/BBB_Workspace/Downloads/u-boot-2022.10/
    • MLO —– in ~/BBB_Workspace/Downloads/u-boot-2022.10/
    • boot.scr —- in ~/BBB_Workspace/ —自分でここに入れている。
    • u-boot-spl.bin —– in ~/BBB_Workspace/Downloads/u-boot-2022.10/spl/
  • /var/lib/tftpboot/ に入れるファイル
    • uImage —– in /BBB_Workspace/Downloads/linux/arch/arm/boot
    • am335x-boneblack.dtb —– in ~/BBB_Workspace/Downloads/linux/arch/arm/boot/dts
  • /srv/sfs/bbb/に入れるファイル
    • 上記以外に、ルートファイルシステムが必要。 ルートファイルシステムは別途NFSで転送する。
    • ルートファイルシステムは既に ~/BBB_Workspace/RFS_Staticにbusyboxで生成したディレクトリとファイル全て。(インストールしたKernelモジュールも含む)

nfs用のboot.scrを準備

boot.scrはU-BOOTが開始した時に呼び出されて実行されるバイナリのスクリプト。 まず、U-BOOTコマンドプロンプト形式でテキストエディタでテキストファイルを作成。 拡張子は.cmdでも.txtでも構わない。 BBBのmicroSDから起動用してtftpでuImageとam335x-boneblack.dtbをダウンロードしてNFSでルートFS をマウントするときのboot.scr。

boot_sd_nfs.cmd
echo "**************booting from sd...tftp...nfs... ************"
setenv ipaddr 192.168.27.2
setenv serverip 192.168.27.1
setenv loadaddr 0x82000000
setenv fdtaddr 0x88000000
echo Booting from microSD ...
setenv rootpath /srv/nfs/bbb,nfsvers=3,tcp ip=dhcp,nolock,wsize=1024,rsize=1024 rootwait
setenv autoload no
tftpboot ${loadaddr} uImage
tftpboot ${fdtaddr} am335x-boneblack.dtb
setenv bootargs console=ttyS0,115200n8 root=/dev/nfs rw rootfstype=nfs ip=${ipaddr} nfsroot=${serverip}:${rootpath} nfsrootdebug debug
bootm ${loadaddr} - ${fdtaddr}

以下でboot.scrを生成する。 boot.scrが存在していたら上書きする。

$ mkimage -c none -A arm -T script -d boot_sd_nfs.cmd boot.scr

bootargsの優先順位

  • U-BOOTの予約環境変数のbootargsは、U-BOOTからKernelに値を引き渡します。 Kernel ArgumentsやKernel Command LineやCMDLINEとも呼ばれます。
  • このbootargsはboot.scr内でなく、Device Tree内のchosenでも記述できるのですが、Device Tree内に記述された方が優先されます。 今回のdtsソースにはbootargsの記載はなかったので、上記で設定するbootargsが採用されます。

microSD /BOOT/ に転送

  • microSDをuBuntu PCに挿入し、以下のファイルをmicroSDの/BOOT/第一パーティション(fat16、bootフラグ付き)にコピー。
    • boot.scr
    • ~/BBB_Workspace/Documents/busybox-1.35.0/u-boot.img
    • ~/BBB_Workspace/Documents/busybox-1.35.0/MLO
    • splは入れなくてもOK

Rootfile System nfsサーバー準備 (uBuntu側)

uBuntuのディレクトリをnfsサーバーがルートディレクトリとするディレクトリにする。

  • /srv/nfs/bbbをnfsサーバが使うルートディレクトリとする。
  • busyboxで生成したディレクトリやファイルを全て/srv/nfs/bbb/にコピーする
$ sudo mkdir /srv/nfs
$ cd /srv/nfs 
$ sudo mkdir bbb
$ cd bbb
$ sudo cp -r ~/BBB_Workspace/RFS_Static/* .
  • uBuntuのnfsサーバ設定ファイル/etc/exportsを設定して
  • nfsのディレクトリやアクセスコントロール設定を登録して
  • nfs-kernel-serverを起動
$ sudo vi /etc/exports
# 以下を書き込む
# /etc/exportsファイルは NFSのクライアントに対するアクセスコントロールファイル。 クライアントにサーバーのディレクトリを知らせる。
/srv/nfs/bbb 192.168.27.2(rw,sync,no_root_squash,no_subtree_check)
/srv/nfs/bbb *(rw,async,no_subtree_check,no_root_squash,nohide,insecure) <===これも試してみる

// 以下を実行してnfsサーバー起動する。
$ sudo apt install nfs-kernel-server            //exportfs not foundになったのでインストール
$ sudo exportfs -arv                            // NFS時、全てのディレクトリをエクスポート
$ sudo service nfs-kernel-server restart
$ sudo service nfs-kernel-server --status-all   // 使えるオプション一覧表示 
$ sudo service nfs-kernel-server status         // Statusを見れる
$ rpcinfo -p localhost                          // nfs server のバージョン確認
$ sudo cat /proc/fs/nfsd/versions
$ ps -ef | grep nfs                             //nfs daemonの確認

//uBuntuでなければ上記コマンドも変わる可能性もあるので注意
//以下はFedoraでのrestartコマンド。 xiinxのlinuxはnfs-server.serviceでした。
$ systemctl restart nfs-server.service
// xiinxのlinuxはnfs-server.serviceでは $ sudo exportfs -arv は不要でした。

実行してみます

  1. まずU-BOOT splが立ち上がります。(これはMLOの事です)
  2. TFTPで転送されてきます
  3. Kernelが立ち上がって
  4. NFSがマウントされて
  5. /sbin/initが起動されて
  6. Please press Enter…と表示されたら立ち上がっています。
  7. Enterを押すと、コマンドプロンプトが出てきて、lsやifconfigなど打ち込めます。
  8. しかし、’/etc/network/interfaces’:No such fileと出ているので作っていきます。(S40network スクリプト内のifup -aによって呼び出されている。)NFSまずU-BOOT splが立ち上がります。(これはMLOの事です)
  9. TFTPで転送されてきます
  10. Kernelが立ち上がって
  11. NFSがマウントされて
  12. /sbin/initが起動されて
  13. Please press Enter…と表示されたら立ち上がっています。
  14. Enterを押すと、コマンドプロンプトが出てきて、lsやifconfigなど打ち込めます。
  15. しかし、’/etc/network/interfaces’:No such fileと出ているので作っていきます。(S40network スクリプト内のifup -aによって呼び出されている。)
...前略
[    9.515944] using random host ethernet address
Jan  1 00:20:43 192 user.warn kernel: [    9.507590] using rando[    9.524045] usb0: HOST MAC aa:62:b5:f1:6c:25
m self ethernet address
Jan  1 00:20:43 192 user.warn kernel: [[    9.533560] usb0: MAC 1a:98:df:4c:97:26
    9.515944] using random host ethernet address
Jan  1 00:20:4[    9.542865] using random self ethernet address
3 192 user.info kernel: [    9.524045] usb0: HOST MAC aa:62:b5:f[    9.553330] using random host ethernet address
1:6c:25
Jan  1 00:20:43 192 user.info kernel: [    9.533560] us[    9.563171] g_ether gadget: Ethernet Gadget, version: Memorial Day 2008
b0: MAC 1a:98:df:4c:97:26
Jan  1 00:20:43 192 user.warn kernel:[    9.575318] g_ether gadget: g_ether ready
 [    9.542865] using random self ethernet address
Jan  1 00:20:43 192 user.warn kernel: [    9.553330] using random host ethernet address
Jan  1 00:20:43 192 user.info kernel: [    9.563171] g_ether gadget: Ethernet Gadget, version: Memorial Day 2008
Jan  1 00:20:43 192 user.info kernel: [    9.割り当てられているはず575318] g_ether gadget: g_ether ready
OK
Starting network: ifup: can't open '/etc/network/interfaces': No such file or directory
FAIL

Please press Enter to activate this console. 
Jan  1 00:20:49 192 daemon.info : starting pid 159, tty '': '-/bin/sh'
/ # 

Ethernet IP 設定 /etc/network/interfaces

interfacesファイルを作って再度実行してみます。

$ cd /srv/nfs/bbb/etc/network
$ sudo touch interfaces
$ sudo vi interfaces

# ここからしたを記入する
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.27.2
    netmask 255.255.255.0
    network 192.168.27.0
    gateway 192.168.27.1
#   dns-nameservers 8.8.8.8   #PCなどの時に使うが今回は不要

auto usb0
iface usb0 inet static
    address 192.168.10.2
    netmask 255.255.255.0
    network 192.168.10.0
    gateway 192.168.10.1

以下エラーを対処する

また以下のエラーが出てきたので、空のファイルを作っておきます。

Starting network: run-parts: /etc/network/if-pre-up.d: No such file or directory
ip: RTNETLINK answers: File exists
ifup: can't open '/var/run/ifstate.new': No such file or directory
FAIL
$ sudo touch /srv/nfs/bbb/etc/network/if-pre-up.d
$ cd /srv/nfs/bbb/var
$ sudo mkdir run
$ cd run
$ sudo touch ifstate.new
  • これでBBBをリスタートさせるとifconfigでeth0とusb0両方設定できているのが分かります。
  • ip: RTNETLINK answers: Network is unreachable と出ますが、これはusb0が相手の192.168.10.1を認識出来なかったからで、特に問題ありません。
  • 『その8』はここまで
  • これで、U-BOOTビルド、Linux KernelとKernelモジュールのビルド、BusyBoxを使ってルートFSの作成して、適切な場所にファイルを保存して、boot.scrでブートを制御して正常に立ち上がるところまで出来ました。

Starting Kernelで止まる

  • Starting Kernelで止まって何もメッセージが表示されない場合の対応方法。 Starting Kernelで止まるという事は、既に、U-BOOTからKernelに引き渡されたが、Kernelがデバイスツリーを読み込んで、デバイスとドライバ(Kernel モジュール)を結びつけて起動する途中で問題を起こしていると思います。 これらが終われば、ルートFS をマウントしてしまえば、シェルコマンドが使えるのですが、U-BOOTコマンドもシェルコマンドも使えない状態です。 この状態では、Kernel起動時のシステムログを見に行くしかありません。
  • Kernelは起動時にDDRのメモリに起動ログを入れているので、それを見に行きます。
  • ログが記録されているDDRのメモリアドレスは、~/BBB_Workspace/Downloads/linux/System.map内の 『__log_buf』の横に記載されています。 System.mapにDDRのどのアドレスに何が書かれているかを定義されています。 0x0000002C ~ 0xc0004000 の間は定義されておらず、ここにu-boot.img、uImage、.dtb、intramfs等が入ります。 14万行ほどありました。
  •  以下のようにして確かめてみます。
$ cd ~/BBB_Workspace/Downloads/linux
$ grep __log_buf System.map
c166fc28 b __log_buf    //この様に表示されます。
$ vi System.map         // Sytem.mapを開いて、『__log_buf』を検索します。
// 『__log_buf』はDDRの0xc166fc28から0xc167fc27まで使用出来る事になっています。
c166fc28 b __log_buf
c167fc28 b safe_read_lock
  • __log_bufは0x10000使用出来ますが、実際のログはそこまで入ってないことが多いので、md.l 0xc166fc28 0x500 くらいで見てみましょう。 これは、U-BOOTコマンドのメモリーダンプ(md)で、DDRのメモリーの内容を表示する方法です。
  • DDRの中身は電源を切ると消えてしまうので、Starting Kernelが表示されて、3分ほどすると自動的にU-BOOTからリトライするので、その時U-BOOTコマンドプロンプトに入って mdコマンドで実際に見てみましょう。
  • 以下は、別の時に実行した例なので、__log_bufのアドレスは0xc1932588だったので、以下の様にしました。
  • 結果は、長かったので不要部分は削除して、最後の2行は読みやすいように文字だけ取り出してみました。 すると、system timersを取り込めておらず初期化が出来ていません。 これで止まっていたんですね。 timer@44e31000というのは、アドレス44e31000の/ocp/timerが読めないとなっているので、デバイスツリーに異常があることが分かります。
  • 私は最初、am355x_boneblack.dtbというファイルなら何でも同じと思って、このファイルを何処からかコピーしてきていました。 その為、Starting Kernelで止まってしまったのです。 しかし、このファイルもKernelビルド時に生成されて、そのファイルを使用すれば、Kernelは正常に起動してくれました。
  • この方法はKernel起動が止まった時にデバッグ方法で良いと思ったのでメモしておきます。 StackExchangeに書かれていました。
=> md.l 0xc1932588 0x400
 :      
c1932ef8: 646e6172 625f6d6f 73657479 6c616320  random_bytes cal                 
c1932f08: 2064656c 6d6f7266 61747320 6b5f7472  led from start_k                 
c1932f18: 656e7265 78302b6c 2f383035 65367830  ernel+0x508/0x6e                 
c1932f28: 69772030 63206874 5f676e72 74696e69  0 with crng_init                 
c1932f38: 303d303d 0000000a 3fffe027 635f6974  =0=0....'..?ti_c                 
c1932f48: 675f6b6c 725f7465 615f6765 3a726464  lk_get_reg_addr:                 
c1932f58: 6c706420 706d5f6c 6b635f75 20726f20   dpll_mpu_ck or                  
c1932f68: 65726170 6d20746e 20747375 65766168  parent must have                 
c1932f78: 67657220 215d335b 000a215d 00000000   reg[3]!]!.
 :
missing clk                 
c1933038: 6c727463 646f6e20 202c7365 61656c70  ctrl nodes, plea                 
c1933048: 75206573 74616470 6f792065 64207275  se update your d                 
c1933058: 0a2e7374 00000000 00000000 00000000  ts............
 :
Failed to initialize  '/ocp/timer@44e31000': -2222...=..?dmtimer_systimer_init: unable to detect system timers, update dtb?b?....>..?Failed to initialize '/ocp/timer@4804000000': -22...............

その他 メモ

TFTP転送やNFSが動作しなかったら

  1. uBuntuのipアドレスが設定されているか確認
  2. nfsのディレクトリが登録しているか
  3. nfsを再起動しみて、動作しているか確認

uBuntuを再起動したら必ず設定し直さないといけなく、面倒なので以下のファイルを作って起動しています。

~/ichiri.sh
sudo ifconfig enp4s0 192.168.27.1
sudo exportfs -arv
sudo service nfs-kernel-server restart

No working init foundエラー

いろいろ方法があると思いますが、一つの例と、公式サイトのデバッグ方法も説明しています。 参考になるかもしれません。

USBでEthernet機能を手動で使用

$ sudo modprob g_ether     //lsmod でg_etherが出てこなかったらmodprobでg_etherモジュールを追加できます。
$ sudo ifconfig usb0 192.168.6.2 up netmask 255.255.255.0

module g_ether not foundが出たら、以下の設定にしてKernelにg_etherを組み込む。

// 左は初期値 => USB Gadget Ethernetを使うためには右に変更する。
CONFIG_USB_ETH [=n]        =>[=m]
CONFIG_USB_GADGET [=m]     => or [=y]
CONFIG_USB_ETH_RNDIS [=n]  => [=y]
CONFIG_INET [=y]           => [=y]

uBuntu側のDHCPサーバー設定する場合

$ sudo apt install -y isc-dhcp-server
$ cd /etc/dhcp
$ sudo vi dhcpd.conf
subnet 192.168.2.0 netmask 255.255.255.0 {
    range 192.168.2.1 192.168.2.252;
    option routers 192.168.2.254;
    option domain-name-servers 192.168.1.1;
}
$ sudo systemctl restart dhcpd.service
$ sudo systemctl status isc-dhcp-server
$ ip address  //eth0 にIPアドレスが割り当てられているはず
$ ip route    // default gateway として.254が割り当てられているはず
$ cat /etc/resolv.conf   // DNSサーバー .1が割り当てられているはず
$ cat /var/lib/dhcp/dhcpd.leases

コメント