使用parted进行可编写脚本的分区

使用parted进行可编写脚本的分区

这是我设备的原始分区表

Number  Start   End     Size    File system  Name        Flags
19      210MB   4370MB  4161MB  ext4         SYSTEM
20      4370MB  4633MB  262MB   ext4         CACHE
21      4633MB  4638MB  5243MB  ext4         HIDDEN

我尝试缩小系统和缓存分区的大小,并删除隐藏分区以创建供应商分区。我按照分开的命令去做

parted /dev/block/mmcblk0 
rm 19
rm 20
rm 21
mkpart SYSTEM ext4 210MiB 4000MiB 
mkpart CACHE ext4 4000MiB 4200MiB
mkpart VENDOR ext4 4200MiB 4638MiB
name 19 SYSTEM 
name 20 CACHE
name 21 VENDOR

我正在尝试使这个可编写脚本,可以通过恢复来刷新

#!/bin/bash
echo Applying resize operation
cd /sbin/
chmod u+x /parted
parted --script /dev/block/mmcblk0 \
    rm 19 \
    rm 20 \
    rm 21 \
    mkpart SYSTEM ext2 210MiB 4000MiB \
    mkpart CACHE ext2 4000MiB 4200MiB \
    mkpart VENDOR ext2 4200MiB 4638MiB \
    name 19 SYSTEM \
    name 20 CACHE \
    name 21 VENDOR \

但是当我闪烁时,我在日志中收到错误

minzip: Extracted file "/sbin/parted"
minzip: Extracted file "/sbin/script.sh"
about to run program [/sbin/script.sh] with 1 args
run_program: execv failed: No such file or directory
run_program: child exited with status 1

答案1

/bin/bash您的恢复环境中存在吗?事实上,您看到的消息指的是minziprun_program表明恢复环境可能是相当严格的精简:它可能有一个不同的、更紧凑的外壳,例如dash而不是bash.

看起来您的实际脚本也添加parted到系统中:

minzip: Extracted file "/sbin/parted"

但是您是否确保所需的所有库parted也都存在?您可以使用该ldd命令查看可执行文件(或另一个库)所依赖的库列表。例如,以下是 x86_64 版本的parted.您的实际列表可能会有所不同,具体取决于编译时选择的选项parted、您的系统架构以及您正在使用的 Linux 发行版的路径名约定。

$ ldd /sbin/parted 
    linux-vdso.so.1 (0x00007ffff609a000)
    libparted.so.2 => /lib/x86_64-linux-gnu/libparted.so.2 (0x00007f9d17be2000)
    libreadline.so.7 => /lib/x86_64-linux-gnu/libreadline.so.7 (0x00007f9d17995000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f9d1776b000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9d173cc000)
    libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f9d171c7000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9d16fc3000)
    libdevmapper.so.1.02.1 => /lib/x86_64-linux-gnu/libdevmapper.so.1.02.1 (0x00007f9d16d6f000)
    libblkid.so.1 => /lib/x86_64-linux-gnu/libblkid.so.1 (0x00007f9d16b29000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9d18048000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f9d16921000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9d166f9000)
    libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f9d1822e000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9d164dc000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9d161d8000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9d15f65000)

这里,linux-vdso.so.1是内核本身提供的虚拟共享对象。但其余的都是必须存在的库,否则parted无法成功加载执行。

如果您的环境尚未安装parted,则很可能也尚未安装libparted.so.*。缺少该库将导致命令失败parted

错误信息

run_program: execv failed: No such file or directory

可能是想告诉您命令文件本身,或它所依赖的库之一,不可用。正确的 shell 可能会显示更详细的错误消息,但这里的消息似乎来自run_program,我认为这是首先尝试启动脚本的东西。

相关内容