#!/bin/bash
# 脚本名称: create_ext2_image_fixed.sh
# 功能: 将指定文件夹内容复制到ext2镜像文件
# 使用方法: sudo ./create_ext2_image_fixed.sh
# 输出: 在当前目录生成 ex2_image.img
# ==================== 配置部分 ====================
SOURCE_DIR="/home/huawei/to_ex2" # 源目录路径
OUTPUT_IMAGE="ex2_image.img" # 输出的镜像文件名
MOUNT_POINT="/tmp/ext2_mount_$$" # 临时挂载点(使用PID保证唯一)
# ==================== 颜色定义 ====================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色
# ==================== 修改后的日志函数 ====================
log_info() {
echo -e "${GREEN}[INFO]${NC} $1" >&2
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1" >&2
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1" >&2
}
log_debug() {
echo -e "${BLUE}[DEBUG]${NC} $1" >&2
}
# ==================== 清理函数 ====================
cleanup() {
if mountpoint -q "$MOUNT_POINT" 2>/dev/null; then
log_info "清理: 卸载挂载点..."
umount "$MOUNT_POINT" 2>/dev/null
fi
if [ -d "$MOUNT_POINT" ]; then
rmdir "$MOUNT_POINT" 2>/dev/null
fi
}
trap cleanup EXIT
# ==================== 检查函数 ====================
check_requirements() {
log_info "检查环境和依赖..."
if [ "$EUID" -ne 0 ]; then
log_error "需要root权限运行此脚本(用于挂载文件系统)"
log_info "请使用: sudo $0"
exit 1
fi
for tool in dd mkfs.ext2 mount cp umount; do
if ! command -v $tool &> /dev/null; then
log_error "缺少必要工具: $tool"
log_info "请安装: apt-get install e2fsprogs mount coreutils"
exit 1
fi
done
if [ ! -d "$SOURCE_DIR" ]; then
log_error "源目录不存在: $SOURCE_DIR"
exit 1
fi
if [ -z "$(ls -A "$SOURCE_DIR" 2>/dev/null)" ]; then
log_warn "源目录为空: $SOURCE_DIR"
fi
}
# ==================== 计算镜像大小 ====================
calculate_size() {
log_info "计算所需镜像大小..."
local dir_size=$(du -sb "$SOURCE_DIR" 2>/dev/null | cut -f1)
local dir_size_mb=$((dir_size / 1024 / 1024))
local image_size_mb=$((dir_size_mb * 14 / 10 + 16))
if [ $image_size_mb -lt 32 ]; then
image_size_mb=32
fi
log_debug "目录大小: ${dir_size_mb} MB"
log_info "将创建镜像: ${image_size_mb} MB"
echo $image_size_mb
}
# ==================== 创建镜像 ====================
create_image() {
local size_mb=$1
log_info "创建镜像文件: $OUTPUT_IMAGE (${size_mb} MB)..."
if ! dd if=/dev/zero of="$OUTPUT_IMAGE" bs=1M count="$size_mb" status=progress 2>&1; then
log_error "创建镜像文件失败"
return 1
fi
log_info "格式化为ext2文件系统..."
if ! mkfs.ext2 -F "$OUTPUT_IMAGE" &>/dev/null; then
log_error "格式化ext2失败"
return 1
fi
return 0
}
# ==================== 复制文件 ====================
copy_files() {
log_info "创建挂载点: $MOUNT_POINT"
mkdir -p "$MOUNT_POINT" || {
log_error "创建挂载点失败"
return 1
}
log_info "挂载镜像..."
if ! mount -o loop "$OUTPUT_IMAGE" "$MOUNT_POINT"; then
log_error "挂载镜像失败"
return 1
fi
log_info "复制文件到镜像..."
if ! cp -a "$SOURCE_DIR"/* "$MOUNT_POINT/"; then
log_error "复制文件失败"
return 1
fi
log_info "同步数据到磁盘..."
sync
log_info "卸载镜像..."
if ! umount "$MOUNT_POINT"; then
log_warn "卸载镜像可能失败,请手动检查"
fi
return 0
}
# ==================== 验证镜像 ====================
verify_image() {
log_info "验证生成的镜像..."
if [ ! -f "$OUTPUT_IMAGE" ]; then
log_error "镜像文件未生成"
return 1
fi
local final_size=$(ls -lh "$OUTPUT_IMAGE" | awk '{print $5}')
log_info "✓ 镜像创建成功: $OUTPUT_IMAGE (大小: $final_size)"
log_info "文件系统详细信息:"
dumpe2fs -h "$OUTPUT_IMAGE" 2>/dev/null | grep -E "Inode count|Block count|Free blocks|Block size" | head -4
return 0
}
# ==================== 主函数 ====================
main() {
echo "========================================"
echo " ext2 镜像创建工具"
echo "========================================"
echo "源目录: $SOURCE_DIR"
echo "输出文件: $OUTPUT_IMAGE"
echo "========================================"
echo ""
check_requirements
local image_size=$(calculate_size)
if create_image "$image_size"; then
if copy_files; then
verify_image
log_info "操作完成!"
echo ""
echo "镜像文件已生成: $(pwd)/$OUTPUT_IMAGE"
else
log_error "文件复制失败"
exit 1
fi
else
log_error "镜像创建失败"
exit 1
fi
}
main "$@"