首页
关于
Search
1
HD9901-RK3399海纳思刷机包
75 阅读
2
easy-itv安装
22 阅读
3
在 Armbian 上自动下载和更新 ZIP 文件(带版本检查)
21 阅读
4
DIY HD9901(RK3399) Hinas刷机后,优化--250902
20 阅读
5
修改并编译Linux系统步骤详解:以Hinas为例
18 阅读
默认分类
Linux
Windows
幼小学作业
登录
Search
lishx
累计撰写
28
篇文章
累计收到
3
条评论
首页
栏目
默认分类
Linux
Windows
幼小学作业
页面
关于
搜索到
28
篇与
的结果
2025-08-29
X86 ubuntu设置合上盖子不休眠
在 Ubuntu 中设置合上笔记本盖子不休眠,可以通过修改电源管理设置实现。以下是具体步骤:打开设置:点击屏幕右上角的系统菜单,选择“设置”或“系统设置”。进入电源设置:在设置窗口中,找到“电源”或“电源管理”选项。修改合盖行为:找到“合上盖子时的行为”或类似选项(可能在“电源”或“节能”部分)。将“合上盖子”设置为“无操作”或“Do nothing”。在“交流电源”和“电池供电”两种模式下,分别检查和设置。使用命令行(可选):如果图形界面没有效果或需要更精确控制,可以编辑配置文件:打开终端,编辑 /etc/systemd/logind.conf 文件:sudo nano /etc/systemd/logind.conf找到以下行(如果没有,可以添加):HandleLidSwitch=ignore HandleLidSwitchExternalPower=ignore HandleLidSwitchDocked=ignoreHandleLidSwitch:控制电池供电时合盖行为。HandleLidSwitchExternalPower:控制接通电源时合盖行为。HandleLidSwitchDocked:控制外接显示器时的合盖行为。将值设置为 ignore 表示合盖不休眠。保存文件后,运行以下命令使更改生效:sudo systemctl restart systemd-logind验证设置:合上盖子,检查系统是否休眠。如果不休眠,设置成功。注意:如果使用的是 GNOME 桌面环境,可能需要安装 dconf-editor 来进一步调整:sudo apt install dconf-editor然后打开 dconf-editor,导航到 /org/gnome/settings-daemon/plugins/power/,将 lid-close-ac-action 和 lid-close-battery-action 设置为 nothing。某些笔记本型号可能需要额外的内核参数或固件更新,确保系统是最新的:sudo apt update && sudo apt upgrade如果仍有问题,可以检查硬件兼容性或在 X 上搜索相关帖子以获取社区帮助。需要我帮你搜索具体的 X 帖子或进一步调试吗?
2025年08月29日
8 阅读
0 评论
0 点赞
2025-08-29
扩展空间脚本优化记录
我帮你修改脚本,将 DISK="/dev/mmcblk0" 和 ROOT_PARTITION="${DISK}p5" 替换为通过 findmnt -no SOURCE / 动态获取根分区设备路径,同时保持其他功能不变。以下是完整的修改后脚本代码:#!/bin/bash # 日志文件 LOG_FILE="/var/log/expand_root_and_swapfile.log" exec > >(tee -a "$LOG_FILE") 2>&1 echo "===== 根分区扩展与交换文件创建脚本开始执行: $(date) =====" # 检查是否以 root 用户运行 if [ "$(id -u)" != "0" ]; then echo "错误:此脚本需要以 root 权限运行,请使用 sudo 或切换到 root 用户。" exit 1 fi # 检查必要工具是否安装(扩展分区和文件系统所需的工具) if ! command -v parted >/dev/null 2>&1; then echo "错误:parted 未安装,请先安装 parted(例如:apt install parted)。" exit 1 fi if ! command -v resize2fs >/dev/null 2>&1; then echo "错误:resize2fs 未安装,请先安装 e2fsprogs(例如:apt install e2fsprogs)。" exit 1 fi if ! command -v expect >/dev/null 2>&1; then echo "错误:expect 未安装,请先安装 expect(例如:apt install expect)。" exit 1 fi if ! command -v partprobe >/dev/null 2>&1; then echo "错误:partprobe 未安装,请先安装 parted(例如:apt install parted)。" exit 1 fi if ! command -v fsck >/dev/null 2>&1; then echo "错误:fsck 未安装,请先安装 e2fsprogs(例如:apt install e2fsprogs)。" exit 1 fi # 定义交换文件和大小 SWAP_FILE="/swapfile" SWAP_SIZE_MB=512 # 通过 findmnt 获取根分区设备路径 ROOT_PARTITION=$(findmnt -no SOURCE /) if [ -z "$ROOT_PARTITION" ]; then echo "错误:无法通过 findmnt 获取根分区设备路径,请检查系统配置。" exit 1 fi # 从根分区路径推导磁盘设备路径(例如 /dev/mmcblk0p5 -> /dev/mmcblk0) DISK=$(echo "$ROOT_PARTITION" | sed -r 's/p[0-9]+$//') if [ -z "$DISK" ]; then echo "错误:无法从根分区路径 $ROOT_PARTITION 推导磁盘设备路径。" exit 1 fi # 检查磁盘是否存在 if [ ! -b "$DISK" ]; then echo "错误:磁盘 $DISK 不存在,请检查设备名称。" exit 1 fi # 检查根分区是否存在 if [ ! -b "$ROOT_PARTITION" ]; then echo "错误:根分区 $ROOT_PARTITION 不存在,请检查分区编号。" exit 1 fi # 检查根分区是否挂载 MOUNT_POINT=$(mount | grep "$ROOT_PARTITION" | awk '{print $3}') if [ -z "$MOUNT_POINT" ]; then echo "错误:根分区 $ROOT_PARTITION 未挂载,请确保分区已挂载。" exit 1 fi echo "根分区 $ROOT_PARTITION 已挂载到 $MOUNT_POINT,可以在线扩展。" # 显示分区表和可用空间 echo "正在检查磁盘 $DISK 的分区布局..." parted -s "$DISK" unit MB print free # 验证根分区是否为最后一个分区且后面有可用空间 FREE_SPACE=$(parted -s "$DISK" unit MB print free | grep -A1 "Number.*Start.*End.*Size" | tail -n 1 | grep "Free Space") if [ -z "$FREE_SPACE" ]; then echo "错误:根分区 $ROOT_PARTITION 后面没有可用空间,无法扩展。" exit 1 fi # 使用 expect 自动运行 parted,模拟手动步骤:print free -> Fix -> resizepart [分区号] 100% -> quit PARTITION_NUMBER=$(echo "$ROOT_PARTITION" | grep -o '[0-9]\+$') if [ -z "$PARTITION_NUMBER" ]; then echo "错误:无法从根分区路径 $ROOT_PARTITION 提取分区号。" exit 1 fi echo "正在运行 parted,自动输入 'Fix' 并调整根分区大小..." /usr/bin/expect <<EOF set timeout 30 spawn parted $DISK expect "(parted)" { send "print free\r" expect { "Fix/Ignore?" { send "Fix\r" expect "(parted)" { send "resizepart $PARTITION_NUMBER 100%\r" expect "(parted)" { send "quit\r" } } } "(parted)" { send "resizepart $PARTITION_NUMBER 100%\r" expect "(parted)" { send "quit\r" } } timeout { send_user "错误:parted 交互超时\n" exit 1 } } } expect eof EOF if [ $? -ne 0 ]; then echo "错误:parted 执行失败,请检查日志 $LOG_FILE。" exit 1 fi # 通知内核更新分区表 echo "正在通知内核更新分区表..." partprobe "$DISK" || { echo "错误:partprobe 失败,尝试使用 blockdev 同步..." blockdev --rereadpt "$DISK" || { echo "错误:分区表同步失败,请检查日志 $LOG_FILE。" exit 1 } } # 显示调整后的分区表 echo "根分区调整完成,以下是新的分区布局:" parted -s "$DISK" unit MB print free # 检查文件系统一致性(非破坏性检查) echo "正在检查文件系统一致性(非破坏性)..." fsck -n "$ROOT_PARTITION" || { echo "警告:文件系统检查发现问题,建议手动运行 'e2fsck -f $ROOT_PARTITION' 修复(需卸载或重启到单用户模式)。" echo "继续尝试在线扩展文件系统..." } # 执行文件系统扩展 echo "正在扩展根分区文件系统..." resize2fs "$ROOT_PARTITION" || { echo "错误:文件系统扩展失败,请检查日志 $LOG_FILE。" echo "可能需要手动运行 'e2fsck -f $ROOT_PARTITION' 和 'resize2fs $ROOT_PARTITION'。" exit 1 } # 显示扩展后的文件系统信息 echo "根分区文件系统扩展完成!以下是新的文件系统信息:" df -h | grep "$ROOT_PARTITION" # 检查交换文件相关工具和空间 echo "正在检查交换文件创建所需的工具和空间..." if ! command -v mkswap >/dev/null 2>&1; then echo "错误:mkswap 未安装,请先安装 util-linux(例如:apt install util-linux)。" exit 1 fi # 检查扩展后根文件系统可用空间是否足够创建 512MB 交换文件 FREE_SPACE_MB=$(df --block-size=1M "$MOUNT_POINT" | tail -n 1 | awk '{print $4}') if [ -z "$FREE_SPACE_MB" ]; then echo "错误:无法获取扩展后根文件系统可用空间,请检查 df 命令输出。" exit 1 fi if [ "$FREE_SPACE_MB" -lt "$SWAP_SIZE_MB" ]; then echo "错误:扩展后根文件系统可用空间 ($FREE_SPACE_MB MB) 小于所需的交换文件大小 ($SWAP_SIZE_MB MB)。" exit 1 fi echo "扩展后根文件系统可用空间为 $FREE_SPACE_MB MB,足以创建 $SWAP_SIZE_MB MB 交换文件。" # 创建交换文件 echo "正在创建 $SWAP_SIZE_MB MB 交换文件 ($SWAP_FILE)..." if [ -f "$SWAP_FILE" ]; then echo "交换文件 $SWAP_FILE 已存在,跳过创建。" else dd if=/dev/zero of="$SWAP_FILE" bs=1M count="$SWAP_SIZE_MB" status=progress || { echo "错误:创建交换文件失败,请检查日志 $LOG_FILE。" exit 1 } chmod 600 "$SWAP_FILE" || { echo "错误:设置交换文件权限失败,请检查日志 $LOG_FILE。" exit 1 } mkswap "$SWAP_FILE" || { echo "错误:格式化交换文件失败,请检查日志 $LOG_FILE。" exit 1 } fi # 启用交换文件 echo "正在启用交换文件..." swapon "$SWAP_FILE" || { echo "错误:启用交换文件失败,请检查日志 $LOG_FILE。" exit 1 } # 添加交换文件到 fstab echo "正在将交换文件添加到 /etc/fstab..." if ! grep -q "$SWAP_FILE" /etc/fstab; then echo "$SWAP_FILE none swap sw 0 0" >> /etc/fstab echo "交换文件已添加到 /etc/fstab。" else echo "交换文件已在 /etc/fstab 中,无需重复添加。" fi # 显示交换空间状态 echo "交换文件创建并启用完成!以下是交换空间信息:" swapon --show # 禁用脚本以防止下次启动重复执行 systemctl disable auto-expand-root.service echo "脚本已完成并禁用自动执行,避免重复运行。" echo "===== 根分区扩展与交换文件创建脚本执行完成: $(date) ====="修改说明动态获取根分区:使用 ROOT_PARTITION=$(findmnt -no SOURCE /) 获取根分区的设备路径(如 /dev/mmcblk0p5)。添加了错误检查,确保 findmnt 能正确返回根分区路径。推导磁盘设备路径:从根分区路径(如 /dev/mmcblk0p5)通过 sed -r 's/p[0-9]+$//' 提取磁盘设备路径(如 /dev/mmcblk0)。添加了错误检查,确保能正确提取磁盘路径。动态获取分区号:在 parted 的 resizepart 命令中,使用 PARTITION_NUMBER=$(echo "$ROOT_PARTITION" | grep -o '[0-9]\+$') 提取分区号(如 5),以动态调整根分区。添加了错误检查,确保能正确提取分区号。其他部分保持不变:保留了原脚本的所有功能,包括日志记录、分区扩展、文件系统扩展、交换文件创建等。错误提示和日志输出中的设备路径已更新为动态获取的 $ROOT_PARTITION 和 $DISK。注意事项脚本假设根分区是最后一个分区且后面有可用空间。如果实际情况不同,可能需要进一步调整逻辑。确保 findmnt 命令可用(通常包含在 util-linux 包中)。如果根分区路径格式非标准(如不是 /dev/mmcblk0pX 形式),sed 提取磁盘路径的逻辑可能需要调整。原脚本:#!/bin/bash # 日志文件 LOG_FILE="/var/log/expand_root_and_swapfile.log" exec > >(tee -a "$LOG_FILE") 2>&1 echo "===== 根分区扩展与交换文件创建脚本开始执行: $(date) =====" # 检查是否以 root 用户运行 if [ "$(id -u)" != "0" ]; then echo "错误:此脚本需要以 root 权限运行,请使用 sudo 或切换到 root 用户。" exit 1 fi # 检查必要工具是否安装(扩展分区和文件系统所需的工具) if ! command -v parted >/dev/null 2>&1; then echo "错误:parted 未安装,请先安装 parted(例如:apt install parted)。" exit 1 fi if ! command -v resize2fs >/dev/null 2>&1; then echo "错误:resize2fs 未安装,请先安装 e2fsprogs(例如:apt install e2fsprogs)。" exit 1 fi if ! command -v expect >/dev/null 2>&1; then echo "错误:expect 未安装,请先安装 expect(例如:apt install expect)。" exit 1 fi if ! command -v partprobe >/dev/null 2>&1; then echo "错误:partprobe 未安装,请先安装 parted(例如:apt install parted)。" exit 1 fi if ! command -v fsck >/dev/null 2>&1; then echo "错误:fsck 未安装,请先安装 e2fsprogs(例如:apt install e2fsprogs)。" exit 1 fi # 定义目标磁盘、分区和交换文件 DISK="/dev/mmcblk0" ROOT_PARTITION="${DISK}p5" SWAP_FILE="/swapfile" SWAP_SIZE_MB=512 # 检查磁盘是否存在 if [ ! -b "$DISK" ]; then echo "错误:磁盘 $DISK 不存在,请检查设备名称。" exit 1 fi # 检查根分区是否存在 if [ ! -b "$ROOT_PARTITION" ]; then echo "错误:根分区 $ROOT_PARTITION 不存在,请检查分区编号。" exit 1 fi # 检查根分区是否挂载 MOUNT_POINT=$(mount | grep "$ROOT_PARTITION" | awk '{print $3}') if [ -z "$MOUNT_POINT" ]; then echo "错误:根分区 $ROOT_PARTITION 未挂载,请确保分区已挂载。" exit 1 fi echo "根分区 $ROOT_PARTITION 已挂载到 $MOUNT_POINT,可以在线扩展。" # 显示分区表和可用空间 echo "正在检查磁盘 $DISK 的分区布局..." parted -s "$DISK" unit MB print free # 验证根分区是否为最后一个分区且后面有可用空间 FREE_SPACE=$(parted -s "$DISK" unit MB print free | grep -A1 "Number.*Start.*End.*Size" | tail -n 1 | grep "Free Space") if [ -z "$FREE_SPACE" ]; then echo "错误:根分区 $ROOT_PARTITION 后面没有可用空间,无法扩展。" exit 1 fi # 使用 expect 自动运行 parted,模拟手动步骤:print free -> Fix -> resizepart 5 100% -> quit echo "正在运行 parted,自动输入 'Fix' 并调整根分区大小..." /usr/bin/expect <<EOF set timeout 30 spawn parted $DISK expect "(parted)" { send "print free\r" expect { "Fix/Ignore?" { send "Fix\r" expect "(parted)" { send "resizepart 5 100%\r" expect "(parted)" { send "quit\r" } } } "(parted)" { send "resizepart 5 100%\r" expect "(parted)" { send "quit\r" } } timeout { send_user "错误:parted 交互超时\n" exit 1 } } } expect eof EOF if [ $? -ne 0 ]; then echo "错误:parted 执行失败,请检查日志 $LOG_FILE。" exit 1 fi # 通知内核更新分区表 echo "正在通知内核更新分区表..." partprobe "$DISK" || { echo "错误:partprobe 失败,尝试使用 blockdev 同步..." blockdev --rereadpt "$DISK" || { echo "错误:分区表同步失败,请检查日志 $LOG_FILE。" exit 1 } } # 显示调整后的分区表 echo "根分区调整完成,以下是新的分区布局:" parted -s "$DISK" unit MB print free # 检查文件系统一致性(非破坏性检查) echo "正在检查文件系统一致性(非破坏性)..." fsck -n "$ROOT_PARTITION" || { echo "警告:文件系统检查发现问题,建议手动运行 'e2fsck -f /dev/mmcblk0p5' 修复(需卸载或重启到单用户模式)。" echo "继续尝试在线扩展文件系统..." } # 执行文件系统扩展 echo "正在扩展根分区文件系统..." resize2fs "$ROOT_PARTITION" || { echo "错误:文件系统扩展失败,请检查日志 $LOG_FILE。" echo "可能需要手动运行 'e2fsck -f /dev/mmcblk0p5' 和 'resize2fs /dev/mmcblk0p5'。" exit 1 } # 显示扩展后的文件系统信息 echo "根分区文件系统扩展完成!以下是新的文件系统信息:" df -h | grep "$ROOT_PARTITION" # 检查交换文件相关工具和空间 echo "正在检查交换文件创建所需的工具和空间..." if ! command -v mkswap >/dev/null 2>&1; then echo "错误:mkswap 未安装,请先安装 util-linux(例如:apt install util-linux)。" exit 1 fi # 检查扩展后根文件系统可用空间是否足够创建 512MB 交换文件 FREE_SPACE_MB=$(df --block-size=1M "$MOUNT_POINT" | tail -n 1 | awk '{print $4}') if [ -z "$FREE_SPACE_MB" ]; then echo "错误:无法获取扩展后根文件系统可用空间,请检查 df 命令输出。" exit 1 fi if [ "$FREE_SPACE_MB" -lt "$SWAP_SIZE_MB" ]; then echo "错误:扩展后根文件系统可用空间 ($FREE_SPACE_MB MB) 小于所需的交换文件大小 ($SWAP_SIZE_MB MB)。" exit 1 fi echo "扩展后根文件系统可用空间为 $FREE_SPACE_MB MB,足以创建 $SWAP_SIZE_MB MB 交换文件。" # 创建交换文件 echo "正在创建 $SWAP_SIZE_MB MB 交换文件 ($SWAP_FILE)..." if [ -f "$SWAP_FILE" ]; then echo "交换文件 $SWAP_FILE 已存在,跳过创建。" else dd if=/dev/zero of="$SWAP_FILE" bs=1M count="$SWAP_SIZE_MB" status=progress || { echo "错误:创建交换文件失败,请检查日志 $LOG_FILE。" exit 1 } chmod 600 "$SWAP_FILE" || { echo "错误:设置交换文件权限失败,请检查日志 $LOG_FILE。" exit 1 } mkswap "$SWAP_FILE" || { echo "错误:格式化交换文件失败,请检查日志 $LOG_FILE。" exit 1 } fi # 启用交换文件 echo "正在启用交换文件..." swapon "$SWAP_FILE" || { echo "错误:启用交换文件失败,请检查日志 $LOG_FILE。" exit 1 } # 添加交换文件到 fstab echo "正在将交换文件添加到 /etc/fstab..." if ! grep -q "$SWAP_FILE" /etc/fstab; then echo "$SWAP_FILE none swap sw 0 0" >> /etc/fstab echo "交换文件已添加到 /etc/fstab。" else echo "交换文件已在 /etc/fstab 中,无需重复添加。" fi # 显示交换空间状态 echo "交换文件创建并启用完成!以下是交换空间信息:" swapon --show # 禁用脚本以防止下次启动重复执行 systemctl disable auto-expand-root.service echo "脚本已完成并禁用自动执行,避免重复运行。" echo "===== 根分区扩展与交换文件创建脚本执行完成: $(date) =====" 其中DISK="/dev/mmcblk0" ROOT_PARTITION="${DISK}p5"是固定的,能不能改成通过findmnt -no SOURCE /来获取,其它功能不变,输出完整脚本代码,中文回答
2025年08月29日
5 阅读
0 评论
0 点赞
2025-08-29
linux无损扩展根分区空间
要无损扩展 /dev/mmcblk2p5 分区(根分区 /)的空间,请按以下步骤操作:步骤 1:确认磁盘布局从 lsblk 输出可知:磁盘总大小:14.6G当前根分区 /dev/mmcblk2p5 大小:1.8G剩余未分配空间:约 12.7G(位于根分区之后)步骤 2:安装必要工具# 安装分区扩展工具(如未安装) apt update && apt install -y cloud-utils gdisk步骤 3:扩展分区使用 growpart 工具扩展分区到磁盘末尾:growpart /dev/mmcblk2 5步骤 4:调整文件系统大小直接扩展 ext4 文件系统以利用新增空间(无需卸载分区):resize2fs /dev/mmcblk2p5步骤 5:验证结果df -h /输出应显示根分区空间已扩展(例如从 1.8G 增加到接近 14G)。注意事项数据安全:虽然操作是无损的,但建议提前备份关键数据。电源稳定:操作过程中确保设备不断电。分区表类型:此方法适用于 GPT 或 MSDOS 分区表。嵌入式设备:如果设备使用自定义镜像,可能需要额外调整(如 fstab 或引导配置)。原理说明growpart:通过调整分区结束位置扩展分区(无需重启)。resize2fs:在线扩展 ext4 文件系统到分区新大小。如果遇到问题,可提供 /var/log/syslog 日志进一步排查。
2025年08月29日
7 阅读
0 评论
0 点赞
2025-08-29
空间不足时,解包修改后重新打包镜像
您提到在编译和修改 rootfs 分区时可能会遇到空间不足的问题。直接挂载镜像文件进行操作时,分区的大小是固定的,无法动态扩展。为了解决这个问题,您可以按照以下步骤在更大的空间中进行编译和修改,然后再将修改后的内容打包回镜像文件:1. 挂载镜像文件运行以下命令挂载镜像文件:# 创建挂载点目录 sudo mkdir -p /mnt/hd9901 # 使用 losetup 挂载镜像文件 sudo losetup -fP hd9901.img # 查找 loop 设备名(如 /dev/loop0) sudo losetup -a # 挂载分区(以 rootfs 分区为例) sudo mount /dev/loop0p5 /mnt/hd99012. 将 rootfs 分区的内容复制到临时目录运行以下命令将 rootfs 分区的内容复制到宿主机的临时目录中:# 创建临时目录 sudo mkdir -p /tmp/rootfs_temp # 使用 rsync 复制内容 sudo rsync -a /mnt/hd9901/ /tmp/rootfs_temp/3. 使用 chroot 环境进行编译和修改在临时目录中设置 chroot 环境,以便在类似目标系统的环境中进行编译和修改:# 示例:在 chroot 环境中安装软件包 sudo chroot /tmp/rootfs_temp mount -t proc proc /proc mount -t sysfs sys /sys mount -t devtmpfs dev /dev mount -t devpts pts /dev/pts # 在 chroot 环境中执行命令(如安装编译工具) apt update apt install -y build-essential # 退出 chroot 环境 exit4. 卸载镜像文件完成修改后,运行以下命令卸载镜像:sudo umount /mnt/hd9901 sudo losetup -d /dev/loop05. 重新打包镜像文件使用 mksquashfs 或 tar 命令将修改后的内容重新打包成镜像文件:# 确保镜像文件大小与原文件一致 dd if=/dev/zero of=hd9901_new.img bs=1M count=1944 # 使用 losetup 重新挂载新镜像文件 sudo losetup -fP hd9901_new.img # 查找新的 loop 设备名(如 /dev/loop1) sudo losetup -a # 将原镜像的分区表复制到新镜像 sudo gdisk /dev/loop0在 gdisk 交互界面中,输入 r 进入恢复菜单,然后选择 d 恢复分区表,最后选择 w 写入并退出。6. 验证镜像文件使用 gdisk 或 fdisk 验证新镜像的分区表和内容:sudo gdisk -l hd9901_new.img注意事项数据备份:在重新打包前,确保已备份重要数据。镜像大小:确保新镜像文件大小与原文件一致,以避免数据丢失。分区表:在重新打包时,确保正确复制原镜像的分区表。如果问题仍未解决,请提供以下信息以便进一步诊断:lsblk fdisk -l hd9901.img根据您的描述,您已经完成了对 /dev/loop0p5(即 rootfs 分区)的修改,并希望将修改后的内容重新打包回镜像文件。以下是详细的后续操作步骤:1. 挂载新镜像文件1.1 创建与原镜像文件大小相同的新镜像文件# 确保新镜像文件大小与原文件一致(例如 1944MB) dd if=/dev/zero of=hd9901_new.img bs=1M count=19441.2 使用 losetup 挂载新镜像文件sudo losetup -fP hd9901_new.img1.3 查找新的 loop 设备名sudo losetup -a假设新镜像文件的 loop 设备名为 /dev/loop1。2. 复制分区表2.1 使用 gdisk 复制原镜像的分区表sudo gdisk /dev/loop0在 gdisk 交互界面中:输入 r 进入恢复菜单。选择 d 恢复分区表。选择 w 写入并退出。2.2 将分区表写入新镜像文件sudo gdisk /dev/loop1在 gdisk 交互界面中:输入 r 进入恢复菜单。选择 d 恢复分区表。选择 w 写入并退出。3. 挂载新镜像的 rootfs 分区3.1 查找新镜像的 rootfs 分区设备名sudo losetup -a假设新镜像的 rootfs 分区设备名为 /dev/loop1p5。3.2 挂载新镜像的 rootfs 分区sudo mkdir -p /mnt/hd9901_new sudo mount /dev/loop1p5 /mnt/hd9901_new4. 将修改后的内容复制回新镜像的 rootfs 分区4.1 使用 rsync 同步内容sudo rsync -a /tmp/rootfs_temp/ /mnt/hd9901_new/5. 卸载镜像文件5.1 卸载新镜像的 rootfs 分区sudo umount /mnt/hd9901_new5.2 解除 loop 设备与新镜像文件的关联sudo losetup -d /dev/loop16. 验证新镜像文件6.1 检查分区表sudo gdisk -l hd9901_new.img6.2 检查 rootfs 分区内容# 重新挂载新镜像文件 sudo losetup -fP hd9901_new.img sudo mount /dev/loop1p5 /mnt/hd9901_new # 列出分区内容 ls /mnt/hd9901_new # 卸载新镜像文件 sudo umount /mnt/hd9901_new sudo losetup -d /dev/loop1注意事项数据备份:在重新打包前,确保已备份重要数据。镜像大小:确保新镜像文件大小与原文件一致,以避免数据丢失。分区表:在重新打包时,确保正确复制原镜像的分区表。如果问题仍未解决,请提供以下信息以便进一步诊断:lsblk fdisk -l hd9901_new.img
2025年08月29日
5 阅读
0 评论
0 点赞
2025-08-29
以读写模式按分区挂载镜像进行更改
示例镜像如下:root@x230:/mnt# sudo losetup --find --show hd9901_debian.img /dev/loop21 root@x230:/mnt# sudo kpartx -av /dev/loop21 add map loop21p1 (252:0): 0 8000 linear 7:21 64 add map loop21p2 (252:1): 0 8192 linear 7:21 16384 add map loop21p3 (252:2): 0 8192 linear 7:21 24576 add map loop21p4 (252:3): 0 229376 linear 7:21 32768 add map loop21p5 (252:4): 0 3669983 linear 7:21 262144要将镜像文件及其分区挂载为可读写模式,请按以下步骤操作:创建挂载点目录sudo mkdir -p /mnt/{loader1,loader2,trust,boot,rootfs}设置循环设备并映射分区# 附加镜像到循环设备 sudo losetup --find --show hd9901_debian.img # 输出示例:/dev/loop21 # 映射GPT分区到/dev/mapper sudo kpartx -av /dev/loop21 # 输出示例: # add map loop21p1 (254:0): 0 8000 linear /dev/loop21 64 # add map loop21p2 (254:1): 0 8192 linear /dev/loop21 16384 # ...(其他分区映射)挂载各分区# loader1分区(3.9 MiB) sudo mount -o rw /dev/mapper/loop21p1 /mnt/loader1 # loader2分区(4.0 MiB) sudo mount -o rw /dev/mapper/loop21p2 /mnt/loader2 # trust分区(4.0 MiB) sudo mount -o rw /dev/mapper/loop21p3 /mnt/trust # boot分区(112.0 MiB) sudo mount -o rw /dev/mapper/loop21p4 /mnt/boot # rootfs分区(1.7 GiB) sudo mount -o rw /dev/mapper/loop21p5 /mnt/rootfs验证挂载df -Th | grep /mnt # 应显示所有已挂载分区及其文件系统类型卸载步骤(操作完成后):# 卸载所有分区 sudo umount /mnt/{loader1,loader2,trust,boot,rootfs} # 移除分区映射 sudo kpartx -dv /dev/loop21 # 释放循环设备 sudo losetup -d /dev/loop21注意事项:确保使用sudo或root权限执行所有操作修改文件后建议执行sync命令同步数据如果镜像文件来自不可信来源,挂载前建议先进行文件系统检查:sudo fsck /dev/mapper/loop21p5 # 对rootfs分区进行检查要保持持久化修改,需确保镜像文件未被压缩或挂载为只读高级技巧:创建可写快照:qemu-img create -f qcow2 -b hd9901_debian.img debian_writable.qcow2之后可直接挂载debian_writable.qcow2进行写操作直接修改镜像内容(无需挂载):sudo modprobe nbd max_part=16 sudo qemu-nbd --connect=/dev/nbd0 hd9901_debian.img # 现在可以直接操作/dev/nbd0p1-p5分区
2025年08月29日
6 阅读
0 评论
0 点赞
1
...
3
4
5
6