如何编写自动初始化磁盘脚本

wen 实用脚本 1

本文目录导读:

如何编写自动初始化磁盘脚本

  1. Linux环境脚本
  2. Windows环境脚本 (PowerShell)
  3. 高级功能脚本
  4. 使用说明
  5. 安全注意事项

Linux环境脚本

基础磁盘初始化脚本

#!/bin/bash
# 自动初始化新磁盘脚本
DISK="/dev/sdb"  # 修改为实际磁盘设备
# 检查磁盘是否存在
if [ ! -b "$DISK" ]; then
    echo "错误: 磁盘 $DISK 不存在"
    exit 1
fi
# 创建分区表 (GPT格式)
echo "正在创建GPT分区表..."
parted -s $DISK mklabel gpt
# 创建单个分区占据整个磁盘
echo "创建分区..."
parted -s $DISK mkpart primary 0% 100%
# 格式化分区为ext4
echo "格式化分区为ext4..."
mkfs.ext4 -F ${DISK}1
# 创建挂载点
MOUNT_POINT="/mnt/data"
mkdir -p $MOUNT_POINT
# 挂载分区
mount ${DISK}1 $MOUNT_POINT
# 获取UUID
UUID=$(blkid -s UUID -o value ${DISK}1)
# 添加到fstab(自动挂载)
echo "UUID=$UUID $MOUNT_POINT ext4 defaults 0 2" >> /etc/fstab
# 验证
echo "磁盘初始化完成!"
df -h | grep $MOUNT_POINT

多磁盘批量初始化脚本

#!/bin/bash
# 批量初始化多个磁盘
DISKS=("/dev/sdb" "/dev/sdc" "/dev/sdd")
MOUNT_BASE="/mnt"
for i in "${!DISKS[@]}"; do
    DISK="${DISKS[$i]}"
    MOUNT_POINT="${MOUNT_BASE}/disk$((i+1))"
    echo "正在初始化 $DISK..."
    # 创建分区表
    parted -s $DISK mklabel gpt
    # 创建分区
    parted -s $DISK mkpart primary 0% 100%
    # 格式化
    mkfs.ext4 -F ${DISK}1
    # 创建挂载点
    mkdir -p $MOUNT_POINT
    # 挂载
    mount ${DISK}1 $MOUNT_POINT
    # 添加到fstab
    UUID=$(blkid -s UUID -o value ${DISK}1)
    echo "UUID=$UUID $MOUNT_POINT ext4 defaults 0 2" >> /etc/fstab
    echo "$DISK 初始化完成 -> $MOUNT_POINT"
done
echo "所有磁盘初始化完成!"

Windows环境脚本 (PowerShell)

初始化新磁盘脚本

# 初始化磁盘脚本
Param(
    [Parameter(Mandatory=$false)]
    [int[]]$DiskNumbers = $null
)
# 获取所有未初始化的磁盘
$disks = Get-Disk | Where-Object { $_.PartitionStyle -eq 'RAW' }
if ($DiskNumbers) {
    $disks = $disks | Where-Object { $_.Number -in $DiskNumbers }
}
if (-not $disks) {
    Write-Host "未找到未初始化的磁盘" -ForegroundColor Yellow
    exit
}
foreach ($disk in $disks) {
    Write-Host "处理磁盘 $($disk.Number)..." -ForegroundColor Green
    try {
        # 初始化磁盘为GPT
        Initialize-Disk -Number $disk.Number -PartitionStyle GPT -Confirm:$false
        # 创建分区并分配所有空间
        $partition = New-Partition -DiskNumber $disk.Number -UseMaximumSize -AssignDriveLetter
        # 格式化为NTFS
        Format-Volume -DriveLetter $partition.DriveLetter -FileSystem NTFS -NewFileSystemLabel "Data_$($disk.Number)" -Confirm:$false
        Write-Host "磁盘 $($disk.Number) 初始化完成,分配盘符: $($partition.DriveLetter):" -ForegroundColor Green
    }
    catch {
        Write-Host "磁盘 $($disk.Number) 初始化失败: $_" -ForegroundColor Red
    }
}
Write-Host "所有磁盘处理完成!" -ForegroundColor Green

自动发现并初始化脚本

# 自动发现并初始化所有新磁盘
Write-Host "正在扫描新磁盘..." -ForegroundColor Cyan
# 获取未初始化磁盘
$newDisks = Get-Disk | Where-Object { 
    $_.PartitionStyle -eq 'RAW' -and $_.OperationalStatus -eq 'Online' 
}
if ($newDisks.Count -eq 0) {
    Write-Host "未发现新磁盘" -ForegroundColor Yellow
    exit
}
Write-Host "发现 $($newDisks.Count) 个新磁盘:" -ForegroundColor Green
foreach ($disk in $newDisks) {
    Write-Host "  磁盘 $($disk.Number): $($disk.FriendlyName) - $([math]::Round($disk.Size/1GB, 2)) GB"
}
# 确认初始化
$confirm = Read-Host "是否初始化所有新磁盘? (Y/N)"
if ($confirm -ne 'Y' -and $confirm -ne 'y') {
    Write-Host "操作已取消" -ForegroundColor Yellow
    exit
}
# 执行初始化
foreach ($disk in $newDisks) {
    Write-Host "初始化磁盘 $($disk.Number)..." -ForegroundColor Yellow
    try {
        Initialize-Disk -Number $disk.Number -PartitionStyle GPT -Confirm:$false
        $partition = New-Partition -DiskNumber $disk.Number -UseMaximumSize -AssignDriveLetter
        Format-Volume -DriveLetter $partition.DriveLetter -FileSystem NTFS -NewFileSystemLabel "Data" -Confirm:$false
        Write-Host "  磁盘 $($disk.Number) -> 盘符 $($partition.DriveLetter):" -ForegroundColor Green
    }
    catch {
        Write-Host "  磁盘 $($disk.Number) 初始化失败: $_" -ForegroundColor Red
    }
}
Write-Host "初始化完成!" -ForegroundColor Green

高级功能脚本

带参数和错误处理的Linux脚本

#!/bin/bash
# 高级磁盘初始化脚本
usage() {
    echo "用法: $0 [-d 设备] [-f 文件系统] [-m 挂载点]"
    echo "  -d  磁盘设备 (如 /dev/sdb)"
    echo "  -f  文件系统 (ext4, xfs, btrfs) 默认: ext4"
    echo "  -m  挂载点 (如 /data) 默认: /mnt/data"
    echo "  -l  标签名称"
    echo "  -h  显示帮助"
    exit 1
}
# 默认值
FILESYSTEM="ext4"
MOUNT_POINT="/mnt/data"
LABEL=""
# 解析参数
while getopts "d:f:m:l:h" opt; do
    case $opt in
        d) DISK="$OPTARG" ;;
        f) FILESYSTEM="$OPTARG" ;;
        m) MOUNT_POINT="$OPTARG" ;;
        l) LABEL="$OPTARG" ;;
        h) usage ;;
        *) usage ;;
    esac
done
# 验证参数
if [ -z "$DISK" ]; then
    echo "错误: 必须指定磁盘设备"
    usage
fi
if [ ! -b "$DISK" ]; then
    echo "错误: $DISK 不是有效的块设备"
    exit 1
fi
# 检查磁盘是否已挂载
if mount | grep -q "$DISK"; then
    echo "错误: $DISK 已挂载,请先卸载"
    exit 1
fi
# 执行初始化
echo "正在初始化 $DISK..."
# 创建分区
parted -s $DISK mklabel gpt
parted -s $DISK mkpart primary 0% 100%
# 格式化
PARTITION="${DISK}1"
case $FILESYSTEM in
    ext4)
        mkfs.ext4 -F $PARTITION ${LABEL:+-L $LABEL}
        ;;
    xfs)
        mkfs.xfs -f $PARTITION ${LABEL:+-L $LABEL}
        ;;
    btrfs)
        mkfs.btrfs -f $PARTITION ${LABEL:+-L $LABEL}
        ;;
    *)
        echo "不支持的文件系统: $FILESYSTEM"
        exit 1
        ;;
esac
# 挂载
mkdir -p $MOUNT_POINT
mount $PARTITION $MOUNT_POINT
# 获取UUID并添加到fstab
UUID=$(blkid -s UUID -o value $PARTITION)
if [ -n "$UUID" ]; then
    echo "UUID=$UUID $MOUNT_POINT $FILESYSTEM defaults 0 2" >> /etc/fstab
    echo "已添加到 /etc/fstab"
fi
echo "磁盘初始化成功!"
df -h | grep $MOUNT_POINT

Windows Server批量初始化脚本

# Server批量初始化脚本
param(
    [string]$FileSystem = "NTFS",
    [string]$LabelPrefix = "Data"
)
$logFile = "disk_init_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
function Write-Log {
    param([string]$Message)
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "$timestamp - $Message" | Out-File -FilePath $logFile -Append
    Write-Host "$timestamp - $Message"
}
Write-Log "开始磁盘初始化脚本"
# 获取所有未初始化磁盘
$uninitializedDisks = Get-Disk | Where-Object { $_.PartitionStyle -eq 'RAW' }
if ($uninitializedDisks.Count -eq 0) {
    Write-Log "未发现未初始化的磁盘"
    exit
}
Write-Log "发现 $($uninitializedDisks.Count) 个未初始化磁盘"
foreach ($disk in $uninitializedDisks) {
    Write-Log "处理磁盘 $($disk.Number) ($($disk.FriendlyName))"
    try {
        # 初始化
        Initialize-Disk -Number $disk.Number -PartitionStyle GPT -Confirm:$false
        Write-Log "  初始化完成"
        # 创建分区
        $partition = New-Partition -DiskNumber $disk.Number -UseMaximumSize -AssignDriveLetter
        Write-Log "  创建分区完成,盘符: $($partition.DriveLetter)"
        # 格式化
        $volume = Format-Volume -DriveLetter $partition.DriveLetter -FileSystem $FileSystem -NewFileSystemLabel "${LabelPrefix}_$($disk.Number)" -Confirm:$false
        Write-Log "  格式化完成: ${LabelPrefix}_$($disk.Number)"
    }
    catch {
        Write-Log "  错误: $_"
    }
}
Write-Log "所有磁盘初始化完成!"

使用说明

Linux脚本使用:

# 给予执行权限
chmod +x init_disk.sh
# 运行基础脚本
sudo ./init_disk.sh
# 运行高级脚本
sudo ./advanced_init.sh -d /dev/sdb -f xfs -m /data -l mydisk

Windows脚本使用:

# 以管理员身份运行PowerShell
# 运行基础脚本
.\init_disk.ps1
# 指定磁盘号
.\init_disk.ps1 -DiskNumbers 1,2,3
# 自动发现脚本
.\auto_init.ps1

安全注意事项

  1. 数据备份:这些脚本会清空磁盘上所有数据
  2. 确认磁盘:确保选择了正确的磁盘设备
  3. 测试环境:先在测试环境验证脚本
  4. 权限要求:需要root/管理员权限
  5. 生产环境:建议添加双重确认机制

这些脚本提供了自动初始化的基础框架,可以根据实际需求进行调整和扩展。

抱歉,评论功能暂时关闭!