u-boot/직렬 콘솔을 통해 "ReadyNAS 102"에 Debian Buster를 설치했습니다. 나는 팔로우하고 있다이 튜토리얼. 하지만 대신 다른 링크를 사용하여 현재 Debian 설치 프로그램과 장치 트리 Blob을 다운로드하세요:
- http://ftp.debian.org/debian/dists/buster/main/installer-armhf/current/images/device-tree/armada-370-netgear-rn102.dtb
- http://ftp.debian.org/debian/dists/buster/main/installer-armhf/current/images/netboot/initrd.gz
- http://ftp.debian.org/debian/dists/buster/main/installer-armhf/current/images/netboot/vmlinuz
grub 설치(튜토리얼에 따르면 실패한 것으로 알려져 있음)를 제외하고는 설치가 제대로 작동했습니다. 대신 flash-kernel
패키지를 수동으로 설치/구성해야 합니다.
또한 "update-initramfs"를 성공적으로 실행하기 전에 수동으로 "mtdpart"를 호출하여 생성 uImage
하고 분할 해야 했습니다 .minirootfs
# mtdpart add /dev/mtd0 uImage 0x200000 0x600000
# mtdpart add /dev/mtd0 minirootfs 0x800000 0x1000000
# update-initramfs -u
여태까지는 그런대로 잘됐다. 커널을 부팅했지만 부팅 후 커널 장치 트리에서 시작된 것처럼 보이는 미리 구성된 "mtd 파티션"이 있었습니다.
~# cat /proc/mtd
dev: size erasesize name
mtd0: 00180000 00020000 "u-boot"
mtd1: 00020000 00020000 "u-boot-env"
mtd2: 00600000 00020000 "uImage"
mtd3: 00400000 00020000 "minirootfs"
mtd4: 07400000 00020000 "ubifs"
문제는 생성된 initramfs에 비해 "minirootfs"가 너무 작다는 것입니다(단 4MB).
# update-initramfs -u -k 4.19.0-6-armmp
update-initramfs: Generating /boot/initrd.img-4.19.0-6-armmp
Using DTB: armada-370-netgear-rn102.dtb
Installing /usr/lib/linux-image-4.19.0-6-armmp/armada-370-netgear-rn102.dtb into /boot/dtbs/4.19.0-6-armmp/./armada-370-netgear-rn102.dtb
Taking backup of armada-370-netgear-rn102.dtb.
Installing new armada-370-netgear-rn102.dtb.
Installing /usr/lib/linux-image-4.19.0-6-armmp/armada-370-netgear-rn102.dtb into /boot/dtbs/4.19.0-6-armmp/./armada-370-netgear-rn102.dtb
Taking backup of armada-370-netgear-rn102.dtb.
Installing new armada-370-netgear-rn102.dtb.
flash-kernel: installing version 4.19.0-6-armmp
The initial ramdisk is too large. This is often due to the unnecessary inclusion
of all kernel modules in the image. To fix this set MODULES=dep in one or both
/etc/initramfs-tools/conf.d/driver-policy (if it exists) and
/etc/initramfs-tools/initramfs.conf and then run 'update-initramfs -u -k 4.19.0-6-armmp'
Not enough space for initrd in MTD 'minirootfs' (need 4971360 but is actually 4194304).
run-parts: /etc/initramfs/post-update.d//flash-kernel exited with return code 1
mtdpart는 새 /dev/mtd0에서 /dev/mtd4 장치를 삭제, 편집 또는 다시 생성할 수 없습니다. 또한 커널 매개변수 설정을 시도했습니다 mtdparts
(Buster의 버그로 인해 이 매개변수는 "cmdlinepart.mtdparts"여야 합니다. "mtdparts="도 시도했습니다).
# cat /proc/cmdline
console=ttyS0,115200 cmdlinepart.mtdparts=armada-nand:0x180000@0(u-boot),0x20000@0x180000(u-boot-env),(uImage),0x1000000@0x800000(minirootfs),-(ubi)
mtd 파티션은 커널과 함께 제공되는 *.dtb 파일에 정의된 것 같습니다:
"5개의 고정 파티션"에 관해 "dmesg"에 다음 메시지가 나타납니다.
[ 18.310935] 5 fixed-partitions partitions found on MTD device pxa3xx_nand-0
[ 18.318030] Creating 5 MTD partitions on "pxa3xx_nand-0":
root@ReadyNAS102:~# dmesg | grep 'MTD' -A 3
[ 18.310935] 5 fixed-partitions partitions found on MTD device pxa3xx_nand-0
[ 18.318030] Creating 5 MTD partitions on "pxa3xx_nand-0":
(...some other lines...)
[ 18.443214] 0x000000000000-0x000000180000 : "u-boot"
[ 18.497255] 0x000000180000-0x0000001a0000 : "u-boot-env"
[ 18.543756] 0x000000200000-0x000000800000 : "uImage"
[ 18.601234] 0x000000800000-0x000000c00000 : "minirootfs"
[ 18.661169] 0x000000c00000-0x000008000000 : "ubifs"
dtc 도구를 사용하여 커널과 함께 제공되는 *.dtb 파일(/boot/dtbs/4.19.0-6-armmp/armada-370-netgear-rn102.dts)을 편집해 보았습니다.
# dtc -I dtb -O dts armada-370-netgear-rn102.dtb > armada-370-netgear-rn102.dts
# editing the *.dts file
# dtc -I dts -O dtb armada-370-netgear-rn102.dts > armada-370-netgear-rn102.dtb
*.dts 파일을 다음과 같이 변경했습니다.
nand-controller@d0000 {
compatible = "marvell,armada370-nand-controller";
reg = < 0xd0000 0x54 >;
#address-cells = < 0x01 >;
#size-cells = < 0x00 >;
interrupts = < 0x71 >;
clocks = < 0x0d 0x00 >;
status = "okay";
nand@0 {
reg = < 0x00 >;
label = "pxa3xx_nand-0";
nand-rb = < 0x00 >;
marvell,nand-keep-config;
nand-on-flash-bbt;
nand-ecc-strength = < 0x04 >;
nand-ecc-step-size = < 0x200 >;
partitions {
compatible = "fixed-partitions";
#address-cells = < 0x01 >;
#size-cells = < 0x01 >;
partition@0 {
label = "u-boot";
reg = < 0x00 0x180000 >;
read-only;
};
partition@180000 {
label = "u-boot-env";
reg = < 0x180000 0x20000 >;
read-only;
};
partition@200000 {
label = "uImage";
reg = < 0x200000 0x600000 >;
};
partition@800000 {
label = "minirootfs";
reg = < 0x800000 0x1000000 >;
};
partition@c00000 {
label = "ubifs";
reg = < 0xc00000 0x7400000 >;
};
};
};
};
특히 다음과 같이 "reg = < 0x800000 0x400000 >;"을 "reg = < 0x800000 0x1000000 >;"으로 변경했습니다 partition@800000
.
partition@800000 {
label = "minirootfs";
reg = < 0x800000 0x1000000 >;
};
"ubifs" 파티션 앞에는 충분한 공간이 있었고 어쨌든 나는 그것을 사용하지 않았습니다. 그러나 재부팅 후에도 커널은 여전히 이전 설정에 대해 알려줍니다. 이 문제를 어떻게 해결할 수 있나요?
uboot를 통해 NAND에 "vmlinuz+*.dtb"를 수동으로 설치할 수도 있습니다. 그러나 다음 커널 업데이트가 설치되면 이 현상은 사라집니다.
커널이 "mtdparts" 명령줄 인수를 해석하기를 원합니다.
어떤 아이디어가 있나요?
편집 #1:
저는 이제 initramfs에 "minirootfs" 대신 "ubifs" 파티션을 사용하고 있습니다. 이것은 효과가 있지만 더 깨끗한 솔루션이 있는지 궁금합니다. 물론 해당 파티션의 데이터를 로드/사용하려면 u-boot에서 "bootcmd"도 변경해야 했습니다.
setenv bootcmd 'nand read 0x2000000 0x200000 0x600000; nand read 0x3000000 0xc00000 0x800000; bootm 0x2000000 0x3000000'
saveenv
reset
답변1
이미 시도한 것처럼 dtb를 편집하면 충분합니다.
partition@800000 {
label = "minirootfs";
reg = <0x0800000 0x800000>; /* 8MB */
};
/* Last MB is for the BBT, i.e. not writable */
partition@1000000 {
label = "ubifs";
reg = <0x01000000 0x7000000>; /* 112MB */
};
나는 당신이 커널에 dtb를 추가하는 것을 잊었다고 생각합니다.
mtdinfo는 다음을 보고합니다:
mtd3
Name: minirootfs
Type: nand
Eraseblock size: 131072 bytes, 128.0 KiB
Amount of eraseblocks: 64 (8388608 bytes, 8.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size: 2048 bytes
OOB size: 64 bytes
Character device major/minor: 90:6
Bad blocks are allowed: true
Device is writable: true
이것은 데비안 4.19.0-10 커널을 사용하고 있습니다.