跳转至

自动扩容

RDK X5开机自动扩容

为方便开发者使用,我们在镜像中添加了开机自动扩容的脚本。

创建 auto_resize.sh 脚本:

sudo nano /usr/local/bin/auto_resize.sh 在文件中加入以下内容:

#!/bin/bash

# 用于自动检测并扩容根分区到最大可用空间

# 日志文件
LOG_FILE="/var/log/auto_resize.log"
RESIZE_FLAG="/var/lib/resize_done"

# 记录日志函数
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# 检查是否已经运行过扩容
if [ -f "$RESIZE_FLAG" ]; then
    log "扩容已完成,跳过执行"
    exit 0
fi

log "开始执行自动扩容脚本"

# 获取根分区设备
ROOT_DEVICE=$(findmnt -n -o SOURCE /)
if [ -z "$ROOT_DEVICE" ]; then
    log "错误: 无法找到根分区设备"
    exit 1
fi

log "检测到根分区设备: $ROOT_DEVICE"

# 提取设备名和分区号
if [[ $ROOT_DEVICE =~ /dev/mmcblk[0-9]+p[0-9]+ ]]; then
    # SD卡类型 (mmcblk)
    DISK_DEVICE=$(echo "$ROOT_DEVICE" | sed 's/p[0-9]*$//')
    PARTITION_NUM=$(echo "$ROOT_DEVICE" | grep -o '[0-9]*$')
elif [[ $ROOT_DEVICE =~ /dev/sd[a-z][0-9]+ ]]; then
    # SATA/USB类型 (sda, sdb等)
    DISK_DEVICE=$(echo "$ROOT_DEVICE" | sed 's/[0-9]*$//')
    PARTITION_NUM=$(echo "$ROOT_DEVICE" | grep -o '[0-9]*$')
else
    log "错误: 不支持的设备类型 $ROOT_DEVICE"
    exit 1
fi

log "磁盘设备: $DISK_DEVICE"
log "分区号: $PARTITION_NUM"

# 检查磁盘是否存在
if [ ! -b "$DISK_DEVICE" ]; then
    log "错误: 磁盘设备 $DISK_DEVICE 不存在"
    exit 1
fi

# 获取当前分区信息
CURRENT_END=$(parted "$DISK_DEVICE" unit s print | grep "^ *$PARTITION_NUM " | awk '{print $3}' | sed 's/s$//')
DISK_SIZE=$(parted "$DISK_DEVICE" unit s print | grep "Disk $DISK_DEVICE:" | awk '{print $3}' | sed 's/s$//')

log "当前分区结束扇区: $CURRENT_END"
log "磁盘总扇区数: $DISK_SIZE"

# 计算可用的最后扇区 (预留一些扇区)
AVAILABLE_END=$((DISK_SIZE - 1))

# 检查是否需要扩容
if [ "$CURRENT_END" -ge "$AVAILABLE_END" ]; then
    log "分区已经是最大大小,无需扩容"
    touch "$RESIZE_FLAG"
    exit 0
fi

log "需要扩容: 当前结束扇区 $CURRENT_END -> $AVAILABLE_END"

# 备份分区表
log "备份分区表..."
sfdisk -d "$DISK_DEVICE" > "/tmp/partition_backup_$(date +%Y%m%d_%H%M%S).sfdisk"

# 使用parted扩容分区
log "开始扩容分区 $PARTITION_NUM..."

# 使用parted修复分区表并扩容
parted "$DISK_DEVICE" --script -- resizepart "$PARTITION_NUM" 100% 2>&1 | tee -a "$LOG_FILE"

if [ $? -ne 0 ]; then
    log "错误: 分区扩容失败"
    exit 1
fi

log "分区扩容成功"

# 同步磁盘
sync
sleep 1

# 扩容文件系统
log "开始扩容文件系统..."

# 检测文件系统类型
FS_TYPE=$(blkid -o value -s TYPE "$ROOT_DEVICE")
log "检测到文件系统类型: $FS_TYPE"

case "$FS_TYPE" in
    "ext2"|"ext3"|"ext4")
        log "扩容 ext 文件系统..."
        resize2fs "$ROOT_DEVICE" 2>&1 | tee -a "$LOG_FILE"
        if [ $? -eq 0 ]; then
            log "ext 文件系统扩容成功"
        else
            log "错误: ext 文件系统扩容失败"
            exit 1
        fi
        ;;
    "xfs")
        log "扩容 XFS 文件系统..."
        xfs_growfs / 2>&1 | tee -a "$LOG_FILE"
        if [ $? -eq 0 ]; then
            log "XFS 文件系统扩容成功"
        else
            log "错误: XFS 文件系统扩容失败"
            exit 1
        fi
        ;;
    "btrfs")
        log "扩容 Btrfs 文件系统..."
        btrfs filesystem resize max / 2>&1 | tee -a "$LOG_FILE"
        if [ $? -eq 0 ]; then
            log "Btrfs 文件系统扩容成功"
        else
            log "错误: Btrfs 文件系统扩容失败"
            exit 1
        fi
        ;;
    *)
        log "警告: 不支持的文件系统类型 $FS_TYPE,跳过文件系统扩容"
        ;;
esac

# 创建完成标记文件
touch "$RESIZE_FLAG"
log "扩容脚本执行完成"
ctrl+o 写入 回车确认 ctrl+x 退出

给予脚本执行权限:

sudo chmod +x /usr/local/bin/auto_resize.sh

创建系统启动服务

为了确保脚本在系统启动时自动运行,需要创建一个 systemd 服务,使该脚本在系统启动时执行。 创建 systemd 服务文件:

sudo nano /etc/systemd/system/auto_resize.service
在文件中添加以下内容:
[Unit]
Description=Auto Resize Root Partition
Before=local-fs.target
After=systemd-remount-fs.service
Wants=systemd-remount-fs.service
DefaultDependencies=no

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/auto_resize.sh  
StandardOutput=journal+console
StandardError=journal+console
TimeoutSec=300

[Install]
WantedBy=local-fs.target
这个配置确保脚本在 /dev/mmcblk1p2 分区可用后启动。

sudo systemctl daemon-reload   //重新加载 systemd 配置

sudo systemctl enable auto_resize.service   //启用服务,使其在启动时自动运行

sudo systemctl start auto_resize.service   //启动服务,进行第一次扩容

sudo rm -f /var/lib/resize_done   //如果需要二次打包镜像,请删除标志文件后再进行打包

设置日志

root@ubuntu:~# sudo nano /usr/local/bin/auto_resize.sh
root@ubuntu:~# sudo chmod +x /usr/local/bin/auto_resize.sh
root@ubuntu:~# sudo nano /etc/systemd/system/auto_resize.service
root@ubuntu:~# sudo systemctl daemon-reload
root@ubuntu:~# sudo systemctl enable auto_resize.service
Created symlink /etc/systemd/system/multi-user.target.wants/auto_resize.service  /etc/systemd/system/auto_resize.service.
root@ubuntu:~# sudo systemctl start auto_resize.service
root@ubuntu:~#

图片1