カスタムiMX8Mボード用のカーネルパッケージを作成し、警告やエラーなしでlintianを通過しました。
パッケージツリーの最初の3つのレベルは次のとおりです。
/tmp/my-kernel_5.10.9-2lEIW6BD_arm64
|-- DEBIAN
| |-- control
| `-- preinst
|-- boot
| |-- Image
| `-- dtbs
| `-- imx8mq-smarc.dtb
|-- lib
| `-- modules
`-- usr
`-- share
`-- doc
preinstは/ bootがインストールされていることを確認します。
fadedbee@box ~ $ sudo cat /tmp/my-kernel_5.10.9-2lEIW6BD_arm64/DEBIAN/preinst
#!/bin/bash
set -e
if grep -qs '/dev/mmcblk1p1 /boot' /proc/mounts; then
echo "/boot is mounted."
else
echo "/boot is not yet mounted, mounting..."
mount /dev/mmcblk1p1 /boot
fi
exit 0
まだインストールされていない場合は、/bootをインストールし、dpkgを使用してすべてのファイルを所定の場所に配置します。
現在は失敗します。
root@arm:~# dpkg -i /tmp/my-kernel_5.10.9-2lEIW6BD_arm64.deb
(Reading database ... 45956 files and directories currently installed.)
Preparing to unpack .../my-kernel_5.10.9-2lEIW6BD_arm64.deb ...
/boot is not yet mounted, mounting...
Unpacking my-kernel (5.10.9) ...
dpkg: error processing archive /tmp/my-kernel_5.10.9-2lEIW6BD_arm64.deb (--install):
unable to make backup link of './boot/Image' before installing new version: Operation not permitted
Errors were encountered while processing:
/tmp/my-kernel_5.10.9-2lEIW6BD_arm64.deb
/boot/Image に対する権限は期待どおりです。
root@arm:~# ls -lsa /boot/Image
28680 -rwxr-xr-x 1 root root 29366784 Mar 25 11:48 /boot/Image
/boot パーティションは vfat で、R/W をマウントします。
root@arm:~# mount | grep boot
/dev/mmcblk1p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
これが失敗する可能性があるのはなぜですか?
解決策はありますか?
アップデート:「一般」Debianカーネルパッケージに何があるかを確認しました。また、通常の動作を使用して/bootにカーネルイメージをインストールします。
root@debian:/tmp/tmp# tree -L 3
.
├── boot
│ ├── config-6.1.0-18-amd64
│ ├── System.map-6.1.0-18-amd64
│ └── vmlinuz-6.1.0-18-amd64
├── lib
│ └── modules
│ └── 6.1.0-18-amd64
└── usr
└── share
├── bug
├── doc
└── lintian
10 directories, 3 files
答え1
これを行うには、解決する必要がある2つの問題があります。
- ベンダーから提供されたvfat /bootの代わりにext4 /bootを作成するようにディスクイメージビルドシステムを変更しました。これにより、dpkgはハードリンクだけでなくシンボリックリンクも生成できます。残念ながら、これにより、u-bootがuEnv.txt、カーネルイメージ、およびデバイスツリーBLOBをロードできなくなります。 u-bootモニターを使用して/bootのファイルのリストを表示することができたので、「print env」を実行し、コンパイルされたファイルにその環境でいくつかの「loadfat」呼び出しがあることが見つかるまで1〜2時間混乱しました。 。
u-boot$ ext4ls mmc 1:1
<DIR> 1024 .
<DIR> 1024 ..
<DIR> 12288 lost+found
<DIR> 1024 dtbs
29366784 Image
1163 uEnv.txt
u-boot$ printenv
...
loadaddr=0x40480000
loadbootenv=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} uEnv.txt
loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};
loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} /dtbs/${fdt_file}
loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}
...
- この問題を解決するために、まず環境を手動で修復し、ext4から起動できることを確認しました。その後、正しいソースファイルを見つけ、u-bootのsmarcimx8mq.hを編集しました。
fadedbee@box ~/my_build/src/uboot $ git diff
diff --git a/include/configs/smarcimx8mq.h b/include/configs/smarcimx8mq.h
index 7eb93677cd..43ce2636eb 100644
--- a/include/configs/smarcimx8mq.h
+++ b/include/configs/smarcimx8mq.h
@@ -101,8 +101,8 @@
"mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
"usbroot=/dev/sda2 rootwait ro\0" \
"mmcrootfstype=ext4 rootwait\0" \
- "loadbootenv=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} uEnv.txt\0" \
+ "loadbootenv=ext4load mmc ${mmcdev}:${mmcpart} ${loadaddr} uEnv.txt\0" \
"loadusbbootenv=fatload usb 0:1 ${loadaddr} uEnv.txt\0" \
"mmcautodetect=yes\0" \
"importbootenv=echo Importing environment from mmc (uEnv.txt)...; " \
"env import -t $loadaddr $filesize\0" \
@@ -112,13 +112,13 @@
"rootfstype=${mmcrootfstype} root=${mmcroot}\0 " \
"usbargs=setenv bootargs ${jh_clk} console=${console} ${optargs} " \
"rootfsusbtype=${usbrootfstype} root=${usbroot}\0 " \
- "loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
+ "loadbootscript=ext4load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
"bootscript=echo Running bootscript from mmc ...; " \
"source\0" \
- "loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
+ "loadimage=ext4load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
"loadm4bin=load mmc ${mmcdev}:${mmcpart} ${m4_addr_tmp} ${m4_bin}\0" \
"loadusbimage=fatload usb 0:1 ${loadaddr} ${image}\0" \
- "loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} /dtbs/${fdt_file}\0" \
+ "loadfdt=ext4load mmc ${mmcdev}:${mmcpart} ${fdt_addr} /dtbs/${fdt_file}\0" \
"loadusbfdt=fatload usb 0:1 ${fdt_addr} /dtbs/${fdt_file}\0" \
"cpm4mem=cp.b ${m4_addr_tmp} ${m4_addr} 20000\0" \
"mmcboot=echo Booting from mmc ...; " \
そしてu-bootを再コンパイルします。