AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 751846
Accepted
Tango
Tango
Asked: 2023-07-19 13:55:25 +0800 CST2023-07-19 13:55:25 +0800 CST 2023-07-19 13:55:25 +0800 CST

使用 sfdisk 将分区表从较大的设备复制到较小的设备

  • 772

我正在测试一个用于 Raspberry Pi 系统的 Python 脚本,用于重新格式化和复制分区信息和分区数据。为了从第一个设备(通常是 USB 记忆棒)获取信息,我使用:

sfdisk -d /dev/sda >sda_data.txt

然后,要将同一个表复制到目标驱动器,我使用:

sfdisk /dev/sdb <sda_data.txt

总体而言,它按预期工作,但是如果我在较小的磁盘上使用它怎么办?例如,假设 sda1 是 msdos 格式的引导分区,而 sda2 是填充驱动器其余部分的 extfs 分区。假设 /dev/sda2 上的总数据(启动命令和数据除外)约为 10GB,而 /dev/sda 为 64GB。

我的数据足够小,当我将文件从 64GB 设备复制到较小的 32GB 设备时,较小的设备上的 /dev/sdb 将有足够的空间来将所有数据存储在较小的设备上。因此,如果 sda 是 64GB,sdb 是 32GB,我仍然可以将 sda 上的所有数据复制到 sdb。

问题或问题出在较小的sdb的分区上。

当我从 sda 读取分区信息时,它包括分区大小,并且第二个分区 sda2 将比新分区 sdb2 大很多。当我在 sdb 上使用 sda_data.txt 中的信息转储时,我的经验是 sfdisk 允许 sdb 上较小的设备大小,并且不会尝试创建太大的分区 - 它会在 sdb2 上创建一个自动转到末尾的分区较小的设备。

这是我的经验。这是标准行为吗?sfdisk 是否总是将最后一个分区的大小调整为较小的设备?换句话说,我可以依靠 sfdisk 在较小的设备上创建较小的分区吗?(这是假设在 sdb 结束后没有分区启动,并且完全超出该设备上的空间。出于本次讨论的目的,我们可以假设最后一个分区可能需要减少,但它仍然会能够适合 sdb - 它只是不是全尺寸的。)

sfdisk
  • 1 1 个回答
  • 33 Views

1 个回答

  • Voted
  1. Best Answer
    Paul Pazderski
    2023-07-25T17:34:32+08:002023-07-25T17:34:32+08:00

    dump 选项更适合精确复制给定的分区。

    我无法告诉您在分区与设备大小不匹配的情况下使用 sfdisk 的可靠性如何。

    但是您可以轻松地从头开始或基于转储创建更宽松的 sfdisk 脚本。

    例如,如果我从 sfdisk 获得以下转储

    label: gpt
    label-id: 01234567-89AB-CDEF-0123-456789ABCDEF
    device: /dev/sda
    unit: sectors
    first-lba: 34
    last-lba: 7814037134
    sector-size: 512
    
    /dev/sda1 : start=          34, size=       32734, type=E3C9E316-0B5C-4DB8-817D-F92DF00215AE, uuid=01234567-89AB-CDEF-0123-456789ABCDEF, name="Microsoft reserved partition"
    /dev/sda2 : start=       32768, size=   629145600, type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, uuid=01234567-89AB-CDEF-0123-456789ABCDEF, name="something"
    /dev/sda3 : start=   629178368, size=  1300070400, type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, uuid=01234567-89AB-CDEF-0123-456789ABCDEF, name="something else"
    /dev/sda4 : start=  1996365824, size=  5817669632, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=01234567-89AB-CDEF-0123-456789ABCDEF, name="root"
    

    您可以通过删除设备路径、起始扇区和大小参数之一来创建更灵活的分区。

    label: gpt
    
    size=       32734, type=E3C9E316-0B5C-4DB8-817D-F92DF00215AE, name="Microsoft reserved partition"
    size=   629145600, type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, name="something"
    size=  1300070400, type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, name="something else"
    type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, name="root"
    

    这将创建四个分区,其中 sfdisk 将自动计算首选起始位置,扩展最后一个分区以填充剩余空间(因为它没有所需的大小)并为分区创建新的 UUID。如果您希望分区具有与以前相同的 UUID,只需保留uuid转储中的参数即可。

    手册页中的相关部分:

    推荐的方法是根本不指定起始偏移量,并以 MiB、GiB(左右)为单位指定分区大小。在这种情况下,sfdisk 将所有分区与块设备 I/O 限制对齐(或者当 I/O 限制太小时,则与兆字节边界对齐以保持磁盘布局可移植)。

    size的默认值表示“尽可能多”;即,直到下一个分区或设备末尾。

    一般来说,手工编写 sfdisk 脚本是可行的。对于您的 boot + root 设置(注意:分区将获得什么文件系统对于 sfdisk 来说并不重要),您应该使用简单的东西,例如:

    label: gpt
    
    size=5GiB, type=linux, name="boot", bootable
    type=linux, name="root"
    
    • 1

相关问题

  • 为什么partx无法读取某些磁盘的分区表

  • sfdisk - “此磁盘当前正在使用” - 但似乎没有任何东西在使用它?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve