dpkg -i my-kernel_5.10.9-2lEIW6BD_arm64.deb가 "새 버전을 설치하기 전에 './boot/Image'에 대한 백업 링크를 생성할 수 없습니다. 작업이 허용되지 않습니다..."와 함께 실패합니다.

dpkg -i my-kernel_5.10.9-2lEIW6BD_arm64.deb가 "새 버전을 설치하기 전에 './boot/Image'에 대한 백업 링크를 생성할 수 없습니다. 작업이 허용되지 않습니다..."와 함께 실패합니다.

맞춤형 iMX8M 보드용 커널 패키지를 만들었고 경고나 오류 없이 lintian을 통과했습니다.

패키지 트리의 처음 세 가지 수준은 다음과 같습니다.

/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)

이 작업이 실패할 수 있는 이유는 무엇입니까?

해결책이 있나요?


업데이트: "일반" 데비안 커널 패키지에 무엇이 있는지 확인했습니다. 또한 정상적인 동작을 사용하여 /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

이 작업을 수행하려면 해결해야 할 두 가지 문제가 있습니다.

  1. 공급업체에서 제공한 vfat /boot 대신 ext4 /boot를 생성하도록 디스크 이미지 빌드 시스템을 수정했습니다. 이를 통해 dpkg는 하드 링크뿐만 아니라 심볼릭 링크도 생성할 수 있습니다. 불행하게도 이로 인해 u-boot가 uEnv.txt, 커널 이미지 및 장치 트리 Blob을 로드하지 못하게 됩니다. u-boot 모니터를 사용하여 /boot의 파일 목록을 표시할 수 있었기 때문에 "print env"를 수행하고 컴파일된 파일에 해당 환경에서 일부 "loadfat" 호출이 있음을 발견할 때까지 한두 시간 동안 혼란스러웠습니다.
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}
...
  1. 이 문제를 해결하기 위해 먼저 환경을 수동으로 복구하고 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를 다시 컴파일하십시오.

관련 정보