raspi-config Expand root partition to fill SD card 原理

简介: /********************************************************************************** * raspi-config Expand root partition to fill SD card 原理 * 说明: * 想知道树莓派是如何完成SD卡扩展的,记录相关文档。
/**********************************************************************************
 *          raspi-config Expand root partition to fill SD card 原理
 * 说明:
 *     想知道树莓派是如何完成SD卡扩展的,记录相关文档。
 *                              
 *                                              2017-2-20 深圳 南山平山村 曾剑锋
 ********************************************************************************/

一、参考文档:
    1. Raspbian: how to resize the root partition to fill SD card
        https://coderwall.com/p/mhj8jw/raspbian-how-to-resize-the-root-partition-to-fill-sd-card
    2. raspi-config
        https://github.com/asb/raspi-config/blob/master/raspi-config

二、raspi-config主要源代码有关SD卡扩展函数分析:

    do_expand_rootfs() {
      # -h : FILE exists and is a symbolic link (same as -L)
      if ! [ -h /dev/root ]; then
        whiptail --msgbox "/dev/root does not exist or is not a symlink. Don't know how to expand" 20 60 2
        return 0
      fi
    
      # readlink用来找出符号链接所指向的位置。 
      ROOT_PART=$(readlink /dev/root)
      # 从变量$string的开头, 删除最短匹配$substring的子串
      PART_NUM=${ROOT_PART#mmcblk0p}
      if [ "$PART_NUM" = "$ROOT_PART" ]; then
        whiptail --msgbox "/dev/root is not an SD card. Don't know how to expand" 20 60 2
        return 0
      fi
    
      # NOTE: the NOOBS partition layout confuses parted. For now, let's only 
      # agree to work with a sufficiently simple partition layout
      if [ "$PART_NUM" -ne 2 ]; then
        whiptail --msgbox "Your partition layout is not currently supported by this tool. You are probably using NOOBS, in which case your root filesystem is already expanded anyway." 20 60 2
        return 0
      fi

      # 再次确认分区表和设备节点提取的数值是否一致
      # 
      # shell script:
      #   root@aplex:/home/zengjf/hacking# parted /dev/sdb -ms unit s p 
      #   BYT;
      #   /dev/sdb:1953525168s:scsi:512:4096:gpt:ATA ST1000LM035-1RK1:;
      #   1:2048s:943720448s:943718401s:ntfs:Basic data partition:msftdata;
      #   2:943722496s:1953523711s:1009801216s:ntfs:Basic data partition:msftdata;
      LAST_PART_NUM=$(parted /dev/mmcblk0 -ms unit s p | tail -n 1 | cut -f 1 -d:)
      if [ "$LAST_PART_NUM" != "$PART_NUM" ]; then
        whiptail --msgbox "/dev/root is not the last partition. Don't know how to expand" 20 60 2
        return 0
      fi
    
      # Get the starting offset of the root partition
      # 获取文件系统分区起始位置
      PART_START=$(parted /dev/mmcblk0 -ms unit s p | grep "^${PART_NUM}" | cut -f 2 -d:)
      [ "$PART_START" ] || return 1
      # Return value will likely be error for fdisk as it fails to reload the
      # partition table because the root fs is mounted
      fdisk /dev/mmcblk0 <<EOF
    p
    d
    $PART_NUM
    n
    p
    $PART_NUM
    $PART_START
    p
    w
    EOF
      ASK_TO_REBOOT=1
    
      # now set up an init.d script,这里的&&是命令运行正常的与,和后面的程序一起组成命令运行链
    cat <<\EOF > /etc/init.d/resize2fs_once &&
    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides:          resize2fs_once
    # Required-Start:
    # Required-Stop:
    # Default-Start: 2 3 4 5 S
    # Default-Stop:
    # Short-Description: Resize the root filesystem to fill partition
    # Description:
    ### END INIT INFO
    . /lib/lsb/init-functions
    case "$1" in
      start)
        log_daemon_msg "Starting resize2fs_once" &&
        resize2fs /dev/root &&                       # 真正调整大小的地方
        rm /etc/init.d/resize2fs_once &&             # 删除文件,表明该文件只能被运行一次
        update-rc.d resize2fs_once remove &&
        log_end_msg $?
        ;;
      *)
        echo "Usage: $0 start" >&2
        exit 3
        ;;
    esac
    EOF
      chmod +x /etc/init.d/resize2fs_once &&         # 给出下次运行的权限
      update-rc.d resize2fs_once defaults &&         # 默认运行
      if [ "$INTERACTIVE" = True ]; then
        whiptail --msgbox "Root partition has been resized.\nThe filesystem will be enlarged upon the next reboot" 20 60 2
      fi
    }

 

目录
相关文章
|
网络协议 Java 测试技术
配置中心原理和选型:Disconf、Apollo、Spring Cloud Config 和 Nacos
学完注册中心,再看配置中心这块,感觉简单很多,因为很多知识原理是相辅相成的
6089 0
配置中心原理和选型:Disconf、Apollo、Spring Cloud Config 和 Nacos
|
消息中间件 前端开发 Java
Spring Cloud Config 原理简介和实现(四)
Spring Cloud Config 原理简介和实现
212 0
Spring Cloud Config 原理简介和实现(四)
|
前端开发 Java Maven
Spring Cloud Config 原理简介和实现(三)
Spring Cloud Config 原理简介和实现
181 0
Spring Cloud Config 原理简介和实现(三)
|
存储 安全 前端开发
Spring Cloud Config 原理简介和实现(二)
Spring Cloud Config 原理简介和实现
199 0
Spring Cloud Config 原理简介和实现(二)
|
存储 Java 开发工具
Spring Cloud Config 原理简介和实现(一)
Spring Cloud Config 原理简介和实现
554 0
Spring Cloud Config 原理简介和实现(一)
|
存储 缓存 监控
分布式配置中心原理解析!SpringCloud Config 实现分布式配置的整体解决方案
本文重点讲解了分布式配置中心的设计原理,着重讲解了分布式配置中心框架SpringCloud Config框架的基本配置和使用方式。基本介绍了分布式配置中心的基础组件,包括Web管理系统,存放分布式配置文件的服务器,ConfigServer,ConfigClient组件。最后介绍了SpringCloud Config框架自动刷新的基本配置方式。
543 0
分布式配置中心原理解析!SpringCloud Config 实现分布式配置的整体解决方案
|
3月前
|
算法 安全 Java
微服务(四)-config配置中心的配置加解密
微服务(四)-config配置中心的配置加解密
|
2月前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
164 0
|
3月前
|
JavaScript
Vue3基础(19)___vite.config.js中配置路径别名
本文介绍了如何在Vue 3的Vite配置文件`vite.config.js`中设置路径别名,以及如何在页面中使用这些别名导入模块。
115 0
Vue3基础(19)___vite.config.js中配置路径别名