amouiche / qnap_mtd_resize_for_bullseye

Script for resizing MTD partitions on a QNAP device in order to be able to upgrade from buster to bullseye
GNU General Public License v2.0
51 stars 11 forks source link

TS-212 compatibility issues #2

Closed jefdriesen closed 2 years ago

jefdriesen commented 2 years ago

For my TS-212, the script first fails with:

# ./qnap_mtd_resize.py --dry-run
[Check of the QNAP model and see if supported]
kirkwood-qnap: machine: QNAP TS219 family
DTB file: kirkwood-ts219-6281.dtb
Checking: /sbin/flashcp -V
Checking: /sbin/flash_erase --version
Checking: /usr/bin/fw_setenv -v
Compiled with U-Boot 2019.01+dfsg-7
Checking: /usr/bin/fw_printenv -v
Compiled with U-Boot 2019.01+dfsg-7

[find on which MTD device partitions are currently mounted]
   spi0.0

[Dump current U-boot config']
Current U-boot bootcmd:
    cp.l 0xf8200000 0x800000 0x080000;cp.l 0xf8400000 0xa00000 0x240000;bootm 0x800000
Current U-boot bootargs:
    console=ttyS0,115200 root=/dev/ram initrd=0xa00000,0x900000 ramdisk=34816

[Prepare new 'bootcmd']
"'cp.l 0xf8200000 0x800000 0x80000' not found in 'cp.l 0xf8200000 0x800000 0x080000;cp.l 0xf8400000 0xa00000 0x240000;bootm 0x800000'"
Don't know how to patch 'bootcmd' for this model. Please report this log.

After adding the extra leading zero in 0x080000, the resizing fails:

# ./qnap_mtd_resize.py --dry-run

[Check of the QNAP model and see if supported]
kirkwood-qnap: machine: QNAP TS219 family
DTB file: kirkwood-ts219-6281.dtb
Checking: /sbin/flashcp -V
Checking: /sbin/flash_erase --version
Checking: /usr/bin/fw_setenv -v
Compiled with U-Boot 2019.01+dfsg-7
Checking: /usr/bin/fw_printenv -v
Compiled with U-Boot 2019.01+dfsg-7

[find on which MTD device partitions are currently mounted]
   spi0.0

[Dump current U-boot config']
Current U-boot bootcmd:
    cp.l 0xf8200000 0x800000 0x080000;cp.l 0xf8400000 0xa00000 0x240000;bootm 0x800000
Current U-boot bootargs:
    console=ttyS0,115200 root=/dev/ram initrd=0xa00000,0x900000 ramdisk=34816

[Prepare new 'bootcmd']
   Old: cp.l 0xf8200000 0x800000 0x080000;cp.l 0xf8400000 0xa00000 0x240000;bootm 0x800000
   New: cp.l 0xf8100000 0x800000 0xc0000;cp.l 0xf8400000 0xb00000 0x300000;bootm 0x800000

[Prepare new 'bootargs']
   Old: console=ttyS0,115200 root=/dev/ram initrd=0xa00000,0x900000 ramdisk=34816
   New: console=ttyS0,115200 root=/dev/ram initrd=0xb00000,0xc00000 ramdisk=34816 cmdlinepart.mtdparts="spi0.0:512k@0(uboot)ro,3M@0x100000(Kernel),12M@0x400000(RootFS1),2M@0x200000(Kernel_legacy),256k@0x80000(U-Boot Config),256k@0xc0000(NAS Config)" mtdparts="spi0.0:512k@0(uboot)ro,3M@0x100000(Kernel),12M@0x400000(RootFS1),2M@0x200000(Kernel_legacy),256k@0x80000(U-Boot Config),256k@0xc0000(NAS Config)"

[Prepare fw_setenv script (/tmp/fw_setenv.script)]

[Dump current 'NAS config' and 'Kernel' images]
+ cat /dev/mtd5
[Resize 'NAS config' dump from 1280KB to 256KB.]
+ /usr/sbin/modprobe loop
+ /usr/sbin/losetup /dev/loop0 /tmp/mtd_nas_config.dump
+ /usr/sbin/e2fsck -p -v /dev/loop0
/dev/loop0: clean, 17/128 files, 51/1024 blocks
+ /usr/sbin/e2fsck -p -v /dev/loop0
/dev/loop0: clean, 17/128 files, 51/1024 blocks
+ /usr/sbin/resize2fs /dev/loop0 128
resize2fs 1.44.5 (15-Dec-2018)
Please run 'e2fsck -f /dev/loop0' first.

+ echo resize2fs failed. 'NAS config' resize not possible automatically
resize2fs failed. 'NAS config' resize not possible automatically
+ /usr/sbin/losetup -d /dev/loop0
+ exit 1
Traceback (most recent call last):
  File "./qnap_mtd_resize.py", line 331, in <module>
    subprocess.check_call(cmd, shell=True)
  File "/usr/lib/python3.7/subprocess.py", line 347, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '
    set -e
    set -x
    /usr/sbin/modprobe loop

    /usr/sbin/losetup /dev/loop0 /tmp/mtd_nas_config.dump

    # run e2fsck twice. the First may return an error status even if FS is corrected
    /usr/sbin/e2fsck -p -v /dev/loop0 || true
    if ! /usr/sbin/e2fsck -p -v /dev/loop0; then
        echo "e2fsck failed. 'NAS config' resize not possible automatically"
        /usr/sbin/losetup -d /dev/loop0
        exit 1
    fi

    if ! /usr/sbin/resize2fs /dev/loop0 128; then
        echo "resize2fs failed. 'NAS config' resize not possible automatically"
        /usr/sbin/losetup -d /dev/loop0
        exit 1
    fi
    /usr/sbin/losetup -d /dev/loop0
    ' returned non-zero exit status 1.

Adding the -f option to e2fsck makes the dry-run succeed:

# ./qnap_mtd_resize.py --dry-run

[Check of the QNAP model and see if supported]
kirkwood-qnap: machine: QNAP TS219 family
DTB file: kirkwood-ts219-6281.dtb
Checking: /sbin/flashcp -V
Checking: /sbin/flash_erase --version
Checking: /usr/bin/fw_setenv -v
Compiled with U-Boot 2019.01+dfsg-7
Checking: /usr/bin/fw_printenv -v
Compiled with U-Boot 2019.01+dfsg-7

[find on which MTD device partitions are currently mounted]
   spi0.0

[Dump current U-boot config']
Current U-boot bootcmd:
    cp.l 0xf8200000 0x800000 0x080000;cp.l 0xf8400000 0xa00000 0x240000;bootm 0x800000
Current U-boot bootargs:
    console=ttyS0,115200 root=/dev/ram initrd=0xa00000,0x900000 ramdisk=34816

[Prepare new 'bootcmd']
   Old: cp.l 0xf8200000 0x800000 0x080000;cp.l 0xf8400000 0xa00000 0x240000;bootm 0x800000
   New: cp.l 0xf8100000 0x800000 0xc0000;cp.l 0xf8400000 0xb00000 0x300000;bootm 0x800000

[Prepare new 'bootargs']
   Old: console=ttyS0,115200 root=/dev/ram initrd=0xa00000,0x900000 ramdisk=34816
   New: console=ttyS0,115200 root=/dev/ram initrd=0xb00000,0xc00000 ramdisk=34816 cmdlinepart.mtdparts="spi0.0:512k@0(uboot)ro,3M@0x100000(Kernel),12M@0x400000(RootFS1),2M@0x200000(Kernel_legacy),256k@0x80000(U-Boot Config),256k@0xc0000(NAS Config)" mtdparts="spi0.0:512k@0(uboot)ro,3M@0x100000(Kernel),12M@0x400000(RootFS1),2M@0x200000(Kernel_legacy),256k@0x80000(U-Boot Config),256k@0xc0000(NAS Config)"

[Prepare fw_setenv script (/tmp/fw_setenv.script)]

[Dump current 'NAS config' and 'Kernel' images]
+ cat /dev/mtd5
[Resize 'NAS config' dump from 1280KB to 256KB.]
+ /usr/sbin/modprobe loop
+ /usr/sbin/losetup /dev/loop0 /tmp/mtd_nas_config.dump
+ /usr/sbin/e2fsck -f -p -v /dev/loop0

          17 inodes used (13.28%, out of 128)
           0 non-contiguous files (0.0%)
           0 non-contiguous directories (0.0%)
             # of inodes with ind/dind/tind blocks: 0/0/0
          51 blocks used (4.98%, out of 1024)
           0 bad blocks
           0 large files

           6 regular files
           2 directories
           0 character device files
           0 block device files
           0 fifos
           0 links
           0 symbolic links (0 fast symbolic links)
           0 sockets
------------
           8 files
+ /usr/sbin/e2fsck -f -p -v /dev/loop0

          17 inodes used (13.28%, out of 128)
           0 non-contiguous files (0.0%)
           0 non-contiguous directories (0.0%)
             # of inodes with ind/dind/tind blocks: 0/0/0
          51 blocks used (4.98%, out of 1024)
           0 bad blocks
           0 large files

           6 regular files
           2 directories
           0 character device files
           0 block device files
           0 fifos
           0 links
           0 symbolic links (0 fast symbolic links)
           0 sockets
------------
           8 files
+ /usr/sbin/resize2fs /dev/loop0 128
resize2fs 1.44.5 (15-Dec-2018)
Resizing the filesystem on /dev/loop0 to 128 (1k) blocks.
The filesystem on /dev/loop0 is now 128 (1k) blocks long.

+ /usr/sbin/losetup -d /dev/loop0

[Concatenate first 256K of 'NAS config' with first 1MB of Kernel > /tmp/mtd_nas_config.new]

[Prepare second 1MB of kernel tail > /tmp/mtd_kernel.tail]
------------------------------------------------------------
    !!!! Warning !!!!

    Everything is fine up to now.
    Next steps will write the flash and may be subject to failures.

    It is highly recommended to perform a MTD backup and save the files
    somewhere (USB device, PC)

        cat /dev/mtd0 > /tmp/mtd0.uboot.backup
        cat /dev/mtd1 > /tmp/mtd1.kernel.backup
        cat /dev/mtd2 > /tmp/mtd2.rootfs1.backup
        cat /dev/mtd3 > /tmp/mtd3.rootfs2.backup
        cat /dev/mtd4 > /tmp/mtd4.uboot-config.backup
        cat /dev/mtd5 > /tmp/mtd5.nas-config.backup
        /usr/bin/fw_printenv -c /tmp/fw_env.config  > /tmp/uboot_config.backup.txt
        cd /tmp
        tar cvzf mtd_backup.tgz mtd?.*.backup uboot_config.backup.txt

        # now use scp / sftp to push/pull mtd_backup.tgz on another PC.

    Be sure you will not cut the power until the end of operations.
    In case of failure, you way need to recover with a Serial Console 
    to run U-boot commands

        https://www.cyrius.com/debian/kirkwood/qnap/ts-219/serial/

Continue and flash the new partitions ? (y/N)
Note: You are using --dry-run option. No flash operations will be performed if you answer 'y'.
y

[Flash 'NAS config' partition content (ie 'NAS config' + head of Kernel) (still a 'safe' op)]
(Dry run)
+ /sbin/flashcp -v /tmp/mtd_nas_config.new /dev/mtd5

[Change U-boot config with new values)]
(Dry run)
+ /usr/bin/fw_setenv -c /tmp/fw_env.config -s /tmp/fw_setenv.script

[Flash tail of the kernel in old 'Kernel' Partition]
(Dry run)
+ /sbin/flashcp -v /tmp/mtd_kernel.tail /dev/mtd1
------------------------------------------------------------

    SUCCESS. You can reboot now.

    Notes: 
    - Don't perform kernel or system update before the next reboot... 
      so don't wait too long.
    - Consider compressing initrd with 'xz' to optimize the size with:

        echo "COMPRESS=xz" > /etc/initramfs-tools/conf.d/compress