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
    }

 

目录
相关文章
|
2月前
Transparent Data Encryption Data Dynamic and Data Dictionary Views You can query a set of dynamic and data dictionary views to find more information about Transparent Data Encryption (TDE) data.
Transparent Data Encryption Data Dynamic and Data Dictionary Views You can query a set of dynamic and data dictionary views to find more information about Transparent Data Encryption (TDE) data.
11 2
|
10月前
|
Ubuntu
Ubuntu 1604报错cannot create temp file for here-document: No space left on device,拓展sda容量解决之
Ubuntu 1604报错cannot create temp file for here-document: No space left on device,拓展sda容量解决之
167 0
|
5月前
|
存储 Serverless 文件存储
No space left on device
No space left on device
65 1
ROOT_DIR=os.path.abspath(os.path.join(p, '..', 'data/raw/'))代码含义
这行代码的作用是设置一个名为 ROOT_DIR 的变量,其值为指向项目根目录下的"data/raw/"目录的绝对路径。下面是对每个部分的详细解释: os.path.abspath():这个函数返回参数路径的绝对路径,也就是完整路径,包括盘符或根目录和所有子目录。 os.path.join(p, '..', 'data/raw/'):这个函数使用操作系统特定的路径分隔符将参数连接起来,并返回一个新的路径。这里,它连接了当前工作目录(也就是代码所在的目录)的父目录("..") 和"data/raw/",生成了一个相对路径。 p:这是一个之前定义过的变量,代表了当前工作目录的路径。 ROOT_DI
|
Docker 容器
no space left on device解决方法
no space left on device解决方法
The Soft Link between IM Level Storage Location and WM level Storage Type?(2)
The Soft Link between IM Level Storage Location and WM level Storage Type?(2)
The Soft Link between IM Level Storage Location and WM level Storage Type?(2)
The Soft Link between IM Level Storage Location and WM level Storage Type?(1)
The Soft Link between IM Level Storage Location and WM level Storage Type?(1)
The Soft Link between IM Level Storage Location and WM level Storage Type?(1)
|
存储 知识图谱
SAP WM中阶Storage Type的Capacity Check – Check According to Maximum Weight
SAP WM中阶Storage Type的Capacity Check – Check According to Maximum Weight
SAP WM中阶Storage Type的Capacity Check – Check According to Maximum Weight
SAP WM中阶Storage Type的Capacity Check – Check based on maximum quantity per bin in storage type.
SAP WM中阶Storage Type的Capacity Check – Check based on maximum quantity per bin in storage type.
SAP WM中阶Storage Type的Capacity Check – Check based on maximum quantity per bin in storage type.