Raspberry Pi Zero 单板配置手记(四)调整 TF 卡分区大小的不同方式

2023-11-12

RPi Zero 调整 TF 卡分区大小的不同方式

本文章为系列文章《Raspberry Pi Zero 单板配置手记》的第四篇,上一篇为《Raspberry Pi Zero 单板配置手记(三)使用 NetworkManager 管理网络连接》
因个人需求,只对单板的树莓派 (不含显示器、摄像头等外设,此 Zero 版本也不含无线模块) 及各种基本系统配置进行叙述。

前言

树莓派使用基于 TF 卡作为默认存储设备,但实际其分区方式和普通磁盘并无多大区别。实际使用中,也会遇到需要重新调整分区大小的情况。本文来大致介绍一下树莓派中三种调整分区大小的方式。


调整分区大小的三种方式

  1. raspi-config
    利用 raspi-config 中的扩容功能来调整根分区大小,这算是树莓派上最“本土”的方式了。不过其只能扩展根分区,使用其后的所有连续空白空间,不能缩减分区大小,也不能手动指定目标值。这种方式操作简便,故而在写入系统镜像后,可用此方法扩展根分区。

    使用方法

    $ sudo raspi-config  # 执行命令
    

    选择“Advanced Options”(高级选项)
    在这里插入图片描述 选择“Expand Filesystem”(扩展文件系统)
    在这里插入图片描述 然后若如下的提示,则代表调整成功,确定后重启即可
    在这里插入图片描述

  2. resize2fs
    玩 linux 的朋友应该都知道这个工具,此工具可调整 ext2、ext3、ext4 文件系统的大小,注意是文件系统的大小。

    我想我应该简单介绍以下文件系统与分区之间的关系。分区,这个动作是将磁盘中一片连续的存储空间,划分到一个区域内,这个区域的名称也叫分区。文件系统则一般建立在分区之上,由系统对应的模块,对分区内的部分或全部空间,使用一套标准的方法进行管理。

    一般来说,文件系统大小和分区大小是保持一致的,毕竟没有被文件系统管理的空间,一般不可使用。但文件系统也支持只占据分区的部分空间。 这也是 resize2fs 的基础。

    分区就像一个“蜗牛壳”,文件系统是蜗牛壳里蜗牛的身体。身体最大也不能超过壳的限制,再想扩大则要增加壳的大小;缩小也类似,身体缩小了,壳还占据较大的空间,想要腾出剩余的空间,就要减小壳的大小,壳最小也不能比身体还小。

    resize2fs 调整的是文件系统(蜗牛身体)的大小,而分区(蜗牛壳)的大小需要我们自己调整,方法就是删掉旧分区,再重建新的分区,而且重建时不能清除旧分区签名 (signature),亦不能格式化文件系统,还要时刻保证此时的分区大小大于或等于文件系统大小。否则旧的文件系统数据将会丢失。

    好了,该谈实践了。我们需要关闭树莓派,并用读卡器将 TF 卡连接到电脑,找到对应的设备路径。在本例中假设为 /dev/sdb

    $ sudo fdisk -l /dev/sdb
    Disk /dev/sdb: 16 GiB, 17179869184 bytes, 33554432 sectors
    Units: sectors of 1 * 512 = 512 bytes
    ..
    
    Device       Boot   Start      End  Sectors Size Id Type
    /dev/sdb1            2048  2099199  2097152   1G  c W95 FAT32 (LBA)
    /dev/sdb2         2099200 33554431 31455232  15G 83 Linux
    

    可以从输出信息中看到 /dev/sdb 有两个分区,一个 1G 一个 15G,总共 TF 卡有 16G 空间。一个扇区的大小是 512 字节。我们现在演示一下,对 /dev/sdb2 调整大小,记住 sdb2 的起始扇区 2099200

    缩小分区

    默认的文件系统大小与分区大小是一致的,想要缩小分区,先调整文件系统大小,再重建分区。

    # 调整文件系统大小前,需强制执行文件系统检查
    $ sudo e2fsck -f /dev/sdb2
    e2fsck 1.44.1 (24-Mar-2018)
    ..
    rootfs: 11/983040 files (0.0% non-contiguous), 88340/3931904 blocks
    

    resize2fs 缩小文件系统大小,可以指定特定大小,也可以使其缩小到不导致数据损失的最小大小。这里我们演示后者

    # 调整分区大小到指定的大小 size,支持 s(扇区数)、K、M、G 后缀,无后缀默认单位为 4K 区块大小
    # sudo resize2fs /dev/sdb2 -p size
    # 调整文件系统到不导致文件数据损失的最小大小(-M),并输出进度(-p)
    # 这个可能要消耗一定时间
    $ sudo resize2fs /dev/sdb2 -M -p
    resize2fs 1.44.1 (24-Mar-2018)
    ..
    The filesystem on /dev/sdb2 is now 30825 (4k) blocks long.
    

    最后输出的信息中 30825 (4k) blocks4k 为一个块的大小,30825 为区块数目,故实际得到的文件系统大小为 30825 * 4096 = 126259200 字节,按照之前 fdisk 输出信息,一个扇区的大小是 512 字节,则这个文件系统所占扇区数为 126259200 / 512 = 246600,记住这个值。

    # 使用 fdisk 命令编辑分区表
    $ sudo fdisk /dev/sdb
    

    接下来用 l 命令查看分区表信息,用 d 命令删除第二个分区,再用 n 命令新建第二分区,新建的第二分区起始扇区必须和原来的起始扇区相同,本例中是 2099200,指定大小或终止扇区时,计算起始扇区+扇区数-1,即 2099200+246600-1=2345799,输入计算出来的值 2345799。(之所以不用 +246600 的方法,是因为 fdisk 对扇区数的处理似乎有问题,+246600 得到的可能是 246601 个扇区,还是直接计算结束扇区更保准。)

    此时会提示

    Created a new partition 2 of type 'Linux' and of size 120.4 MiB.
    Partition #2 contains a ext4 signature.
    Do you want to remove the signature? [Y]es/[N]o:
    

    此时一定要输入 n,否则原有分区标志会被破坏。
    然后输入 w 保存分区表并退出 fdisk 即可。

    扩大分区

    扩大分区的顺序与缩小分区恰好相反,先重建分区,再调整文件系统大小。之前我们将分区大小缩小到一百多 MB,现在我们将其扩展到 5G。

    $ sudo fdisk /dev/sdb
    

    接下来用 l 命令查看分区表信息,用 d 命令删除第二个分区,再用 n 命令新建第二分区,新建的第二分区起始扇区还是必须和原来的起始扇区相同,指定大小时,输入 +5G。提示是否覆盖分区标志时,选 n。最后 w 保存并退出。

    然后调整文件系统大小

    # 执行文件系统检查
    $ sudo e2fsck /dev/sdb2 -f
    # 不指定大小,使其自动调整到与分区一致的大小
    $ sudo resize2fs /dev/sdb2 -p
    
  3. 手动重建分区
    准确说这不是一个标准的方法,仅仅是备份分区上所有文件,然后删除分区,并以新大小重建,重新格式化,然后将分区内的文件再写回去。这同样会破坏引导扇区内容。然而,对于在 TF 卡上的树莓派的 root 分区来说,这不失为一个好方法,速度较 resize2fs 更快,且对 TF 卡寿命影响较小。

    对 TF 卡上的分区扩容还好说,而减小分区大小时,用 resize2fs 会带来大量磁盘写入操作,直接在 TF 卡等闪存设备中执行频繁写入操作速度总是较慢的(至少,我的电脑如此),还会影响介质寿命。直接复制文件则是顺序读写,相较来说要好上很多。

    # 挂载 root 分区
    $ mkdir mnt_root bak_root
    $ sudo mount /dev/sdb2 -o ro mnt_root
    # 备份所有文件并保留时间戳、权限等属性
    $ sudo cp -r -P --preserve=all mnt_root -T bak_root
    # 卸载分区
    $ sudo umount mnt_root
    # 使用 fdisk 删除分区并以新大小重建,此时应清除旧的分区大小标志
    $ sudo fdisk /dev/sdb
    # fdisk 命令内容省略
    # ...
    # 创建新文件系统(格式化)
    $ sudo mkfs.ext4 /dev/sdb2 -L rootfs
    # 挂载新分区
    $ sudo mount /dev/sdb2 mnt_root
    # 将备份的文件复制回去
    $ sudo cp -r -P --preserve=all bak_root -T mnt_root
    # 同步磁盘,卸载分区
    $ sync; sudo umount mnt_root
    # 删除临时文件夹
    $ sudo rm -r mnt_root bak_root; sync
    

收尾

实际上,除了上述列出来的三种方式以外,还可以利用各种现成的工具来快速调整分区大小,具体哪种最好最实用,还是看个人习惯和实际情况而定。

虽然这几篇文章在说树莓派,可同样也能应用于其他 linux 系统,这就考验各位读者的随机应变和举一反三的能力了。

接下来是本系列文章的第四篇《Raspberry Pi Zero 单板配置手记(五)基于 overlayfs 的“差分存储”方案》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Raspberry Pi Zero 单板配置手记(四)调整 TF 卡分区大小的不同方式 的相关文章

  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 如何从类似于 eclipse 的命令行创建可运行的 jar 文件

    我知道 eclipse 会生成一个可运行的 jar 文件 其中提取并包含在该 jar 文件中的所有库 jar 文件 从命令提示符手动创建 jar 文件时如何执行类似的操作 我需要将所有 lib jar 解压到类文件夹中吗 目前我正在使用 j
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • 如何用X11复制到剪贴板?

    使用 OS X 上的框架 我可以使用以下命令将 PNG 复制到粘贴板 在 C 中 显然我可以将 NSPasteboard 与 Cocoa 一起使用 include
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • InstaPy:“错误,无法确定 64 位 Linux 的正确文件名”

    有人知道如何解决或解决这个问题吗 来自控制台的堆栈跟踪 执行后报告错误 InstaPy Version 0 6 9 Workspace in use home zanettra InstaPy Error unable to determi
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 如何在Python中独立于语言安装(linux)获取用户桌面路径

    我找到了 如何找到用户桌面的路径 的几个问题和答案 但在我看来它们都已失效 至少我找到的那些 原因是 如果用户安装的 Linux 不是英语 他或她的桌面很可能位于除 Desktop 例如 对于瑞典语 我相信它是在 Skrivbord 谁知道
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • diff 文件仅比较每行的前 n 个字符

    我有2个文件 我们将它们称为 md5s1 txt 和 md5s2 txt 两者都包含a的输出 find type f print0 xargs 0 md5sum sort gt md5s txt 不同目录下的命令 许多文件被重命名 但内容保
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • 想跳槽涨薪的必看!2021年你与字节跳动只差这份笔记,大厂内部资料

    说白了 哪一个行业不是吃青春饭呢 无论哪个行业 大部分的从业人员都是在拿青春赌明天 而且很残忍的一个事实是 没有人的工作是不可取代的 如果你辞职 老板极力挽留 那就说明 你是那帮取代你的候选人当中最便宜的 市场在逐渐成熟 程序员的前景确实灰
  • java获取当前路径的方法

    参考网址 https www cnblogs com franson 2016 p 5728280 html 面临问题 需要在linux系统中run jar文件 运行过程包括文件IO 由于txt文件在windows系统中和在linux中路径
  • 0-1背包问题由二维数组转换为一维数组的理解

    对于0 1背包问题的话 可以使用一维数组来表示 我们要知道每一行的数据其实是依赖于上一行的数据 并不依赖于本行的数据 所以无论正序或者逆序更新一行的数据都不会需要本行的数据 但是为什么用一维数组更新时就要用逆序呢 其实是因为用一维数组更新时
  • imx8烧写Linux系统,RT-Linux在IMX8上的使用

    By Toradex胡珊逢 Real time Linux 是指在普通 Linux 内核打上 PREEMPT RT补丁后使内核满足实时要求 下面我们将使用 Apalis iMX8QM 介绍如何开启 Linux 5 4 的实时功能 首先需要下
  • 200 行代码实现一个简单的区块链

    java 区块链开发与交流群 613121183 有兴趣的也可以加下哈 提供了不少区块链资料 以后有资料可以相会共享 区块链的基础概念很简单 一个分布式数据库 存储一个不断加长的 list list 中包含着许多有序的记录 然而 在通常情况
  • 数据仓库模型设计V2.0

    一 数仓建模的意义 数据模型就是数据组织和存储方法 它强调从业务 数据存取和使用角度合理存储数据 只有将数据有序的组织和存储起来之后 数据才能得到高性能 低成本 高效率 高质量的使用 高性能 良好的数据模型能够帮助我们快速查询所需要的数据
  • 什么是vps

    在上网冲浪的时候看到网友在说一个我不认识的词汇 vps 于是在此记录下 文章目录 一 介绍 1 概念 2 特性用途 二 VPS又称为机场 三 VPS的使用 1 如何获取VPS 2 VPS品牌 总结 一 介绍 1 概念 VPS Virtual
  • 物联网平台设备运维监控报警介绍——实践类

    物联网平台监控报警简介 物联网平台除了基础的设备接入上云以及物模型建模管理外 还提供了面向运维场景的监控报警功能 帮助客户了解业务的运行情况 进行相关的运维操作 本文重点介绍相关的监控可视化及规则报警通知功能 包括 自定义的可视化监控大盘
  • 时间序列预测——LSTM模型(附代码实现)

    目录 模型原理 模型实现 导入所需要的库 设置随机数种子 导入数据集 打印前五行数据进行查看 数据处理 归一化处理 查看归一化处理后的数据 将时间序列转换为监督学习问题 打印数据前五行 划分训练集和测试集 查看划分后的数据维度 搭建LSTM
  • 通过环境变量修改java版本不生效

    通过环境变量修改java版本不生效 环境变量指向的是Java1 8版本 但是在终端下查看Java version版本是10 0 2 本机依次安装了 jdk1 8 jdk1 6 和 jdk1 7 三个版本的 jdk 由于maven打包andr
  • 基于PaddleGAN项目人脸表情动作迁移学习(二)单人表情迁移

    学习目标 学习基于PaddleGAN实现的动作迁移模型 First order motion model First order motion model原理 First order motion model的任务是image animat
  • STM32——I2C通信理论基础(1)(学习笔记)

    STM32 I2C通信理论基础 硬件层 协议层 1 I2C基本读写过程 2 I2C通信的起始和停止信号 3 数据的有效性 4 响应 前言 我们在学习stm32的时候 要想学得更好 i2c协议的学习是必不可少的 现在很多的硬件 传感器等都是用
  • Vite2.0常见配置

    一 创建 1 创建 npm init vite latest my vue app template vue ts 查看 create vite 以获取每个模板的更多细节 vanilla vanilla ts vue vue ts reac
  • Win10-部署java环境教程

    一提到部署环境 不得不提到java环境 现如今java遍地走 python多如狗的世界里 如果不能在本地搭建一套java环境 都不好意思说自己是搞软件的 这里呢 给大家来分享一下 如何在一个新的机器上部署java环境 首先 java环境的配
  • FPGA零基础学习之Vivado-锁相环使用教程

    FPGA零基础学习之Vivado 锁相环使用教程 本系列将带来FPGA的系统性学习 从最基本的数字电路基础开始 最详细操作步骤 最直白的言语描述 手把手的 傻瓜式 讲解 让电子 信息 通信类专业学生 初入职场小白及打算进阶提升的职业开发者都
  • mybaties总结

    1 需要导入四个坐标 分别是mybatits junit log4j mysql connection java 2 连接数据库信息 配置mapper的位置 3 映射文件namespace对应的是接口全名 id是接口里面的方法名 resul
  • BUCK电路原理及PCB布局与布线注意事项

    1 BUCK架构 Buck架构 当开关闭合的时候 当开关断开的时候 根据伏秒平衡定理可得 Vin Vout DT Vout 1 D T gt Vin Vout D lt 1 在实际DCDC应用中 当Q1闭合的时候 在图1 a中 红线示出了当
  • Java面试——缓存

    一 什么是缓存 1 缓存就是数据交换的缓冲区 称作 Cache 当某一硬件要读取数据时 会首先从缓存汇总查询数据 有则直接执行 不存在时从内存中获取 由于缓存的数据比内存快的多 所以缓存的作用就是帮助硬件更快的运行 2 缓存往往使用的是RA
  • MMRotate:旋转框检测实现过程

    MMRotate 旋转框检测实现过程 MMRotate地址 https github com open mmlab mmrotate 文档地址 https mmrotate readthedocs io en latest 一 环境搭建 1
  • Raspberry Pi Zero 单板配置手记(四)调整 TF 卡分区大小的不同方式

    RPi Zero 调整 TF 卡分区大小的不同方式 本文章为系列文章 Raspberry Pi Zero 单板配置手记 的第四篇 上一篇为 Raspberry Pi Zero 单板配置手记 三 使用 NetworkManager 管理网络连