Linux批量非交互式磁盘分区

Top

分区工具-----parted

# 注意:parted命令不会修改/etc/fstab文件;创建完分区后,需手动修改/etc/fstab文件

选项及含义

选项 含义
-l【--list】 列出所有设别的分区信息
-i 【--interactive】 在必要时,提示用户
-s【--script】 避免和用户交互;即关闭交互式
-j【--json】 json 格式输出

子选项命令

检查 MINOR                            # 对文件系统进行一个简单的检查 
cp [FROM-DEVICE] FROM-MINOR TO-MINOR # 将文件系统复制到另一个分区 
help [COMMAND]                       # 打印通用求助信息,或关于 COMMAND 的信息 
mklabel,mktable LABEL-TYPE            # 创建新的磁盘分区表 
mkfs MINOR 文件系统类型                 # 在 MINOR 创建类型为“文件系统类型”的文件系统 
mkpart 分区类型 [文件系统类型] 起始点 终止点    # 创建一个分区 
move MINOR 起始点 终止点               # 移动编号为 MINOR 的分区 
name MINOR 名称                       # 将编号为 MINOR 的分区命名为“名称” 
print [devices|free|list|all|]   # 显示分区表;包括可用设备、可用空间、所有找到的分区或特定的划分
print [MINOR]                        # 打印分区表,或者分区 
unit UNIT                           # 设置显示默认单位
quit                                 # 退出程序 
rescue 起始点 终止点                   # 挽救临近“起始点”、“终止点”的遗失的分区 
resize MINOR 起始点 终止点             # 改变位于编号为 MINOR 的分区中文件系统的大小 
rm MINOR                             # 删除编号为 MINOR 的分区 
select 设备                           # 选择要编辑的设备 
set MINOR 标志 状态                    # 改变编号为 MINOR 的分区的标志
disk_set DISK_TYPE DISK_STATUS                 # 更改分区类型和状态

# UNIT -- 打印信息可用的单位 
				s:扇区(n个字节,取决于扇区大小,通常为512)
				B:字节
				KiB:千字节(1024字节)
				MiB:兆字节(1048576字节)
				GiB:gibibyte(1073741824字节)
				TiB:tebibyte(1099511627776字节)
				kB:千字节(1000字节)
				MB:兆字节(1000000字节)
				GB:千兆字节(1000000000字节)
				TB:兆字节(1000000000000字节)
				%:设备的百分比(0到100之间)
				cyl:柱面(与BIOS CHS几何相关)
				chs:柱面,磁头,扇区寻址(与BIOS CHS几何相关)
				compact:这是一个特殊的单位,默认输入为兆字节,并且选择一个单位,以紧凑的可读格式表示输出
# LABEL-TYPE -- 可用的磁盘分区表标识; (其中 msdoc 即 MBR 分区,MBR 磁盘不能大于 2 TB,否则将会强制只使用 2 TB)
          "aix", "amiga", "bsd", "dvh", "gpt", "loop", "mac", "msdos", "pc98", "sun"
# PART-TYPE -- 创建分区时可用的分区类型
          "primary", "extended", "logical"
# FS-TYPE -- 创建分区时可用的文件系统类型
          "btrfs", "ext2", "ext3", "ext4", "fat16", "fat32", "hfs", "hfs+", "linux-swap", "ntfs", "reiserfs", "xfs"
# DISK_TYPE --  disk_set 更改分区时可用的分区类型

           "boot", "root", "swap", "hidden", "raid", "lvm", "lba", "legacy_boot", "palo"

# DISK_STATUS --  disk_set 更改分区时可用的分区类型
             "on", "off"
# q, qu, qui, quit:退出交互式parted;只有在Parted退出后,Linux内核才能知道Parted对磁盘所做的更改

命令示例

非交互式创建分区

# 以下创建分区的方式都是等价的,为 ext4 分区, 或之后再使用 mkfs 命令创建文件系统 
parted /dev/sdb mkpart primary 1 50 
parted -s -- /dev/sdb mkpart shiwei  ext4  50  100
echo "mkpart data ext4 1 50M" | parted /dev/sdb
# 同时创建 3 个分区, 前两个为 ext4 类型, 第 3 个未知
parted /dev/sdb mkpart ext4  1 50 mkpart ext4  50 100 mkpart ext4  100 150
# NVME 6.4T 创建两个分区,各50%空间;
parted -s -- /dev/nvme6n1 mklabel gpt mkpart ext4 0 50% mkpart ext4 51% 100%

非交互式删除分区

parted /dev/sdb rm 1           # 指定分区编号
parted /dev/sdb rm 2 rm 3 rm 5 # 同时删除多个分区 
# 批量删除 127 个分区,但挺慢 , 一秒一个 
for ddd in `seq 1 127`; do parted /dev/sdb rm ${ddd}; done

打印分区表

parted /dev/sdb p   # parted /dev/sdb print 

修改分区名称

parted /dev/sdb name 1 shiwei  # 需注意指定的为原分区的编号

修改分区大小

# 注意修改分区大小只可缩容 或者是 扩容时利用闲置 柱面, 最后一个参数为柱面号 
parted /dev/sdb resizepart 1 800  # 设置 第一个 分区结束柱面为 800 

参考网址

Linux磁盘分区--GPT分区

磁盘分区工具------ fdisk

sd代表的是SCSI,SATA接口硬盘
hd代表IDE接口的硬盘
sda和hda最后面的a都代表的是第一块硬盘
sda1和hda1则代表的是该硬盘的第一分区

选项和含义

选线 含义
-l 查看系统分区详细信息

命令flags标记及功能

标记命令 含义
m 输出帮助信息
a 设置启动分区
b 编辑分区标签
d【delete】 删除一个分区
l【list】 列出分区类型
n【new】 创建新的分区
p【print】 打印分区表
w【write】 保存分区表
q【quit】 退出不保存设置
t 改变分区 ID
u 改变显示的单位
o 创建一个新的空白的 Dos 分区表
v 检查验证分区表

命令示例

展示硬盘详细信息

fdisk -l 
# 单独展示某一个盘详细分区信息
fdisk -l  /dev/sda 

非交互式打印分区表

fdisk /dev/sdc << EOF 
p
q
EOF 
# 第二种方式将命令写入文件
cat commands | fdisk /dev/sdc 

非交互式创建 GPT 格式分区

# 先要创建 GPT 格式分区表, 会自动删除老的分区表,
printf "g\n p\n w\n" | fdisk /dev/sdb
printf "n\n \n \n +100M\n n\n \n \n +100M\n n\n \n \n +100M\n p\n w\n" | fdisk /dev/sdb
# 迅速创建 128 个分区
for ddd in `seq 1 128`;do  printf "n\n \n \n +100M\n  p\n w\n" | fdisk /dev/sdb ; done

非交互式删除分区

# 注意在每个命令的后面都要添加一个换行符,且之间不能有多余的字符,例如:空格等, 命令之间用空格隔开
echo -e  "d\n 3\n d\n 2\n d\n  w\n p\n q" | fdisk /dev/sdb  
printf "d\n 2\n  p\n w\n" | fdisk /dev/sdb
# 迅速删除 127 个分区
for ddd in `seq 1 128`; do  printf "d\n${ddd}\nw\n" | fdisk /dev/sdb ; done
# 第二种方式
echo > fdisk ; for ddd in `seq 1 128`; do  printf "d\n${ddd}\n" ; if [ $ddd -eq 128 ]; then printf "w\n"; fi; done >> fdisk ; wait; cat fdisk | fdisk /dev/sdb ;

迅速挂载 128个分区

# 分区
for ddd in `seq 1 128`;do  printf "n\n \n \n +100M\n  p\n w\n" | fdisk /dev/sdb ; done
# 创建文件系统
for ddd in `seq 1 128`; do mkfs -t ext4 /dev/sdb${ddd}; done
# 挂载
for ddd in `seq 1 128`; do mount -o rw,noatime,nodiratime,nobarrier /dev/sdb${ddd} /data/${ddd}; done
# 配置开机自动挂载
for ddd in `seq 1 128`; do echo -e "/dev/sdb${ddd}\t/data/${ddd}\text4\trw,noatime,nodiratime,nobarrier\t0\t0" >> /etc/fstab ;  done

磁盘格式化工具 --- mkfs

# 格式化 ext4
mkfs.ext4  <Partition>
# 格式化 btrfs
mkfs.btrfs  <Partition>

# 临时挂载
mount <Partition>  <Point>
# 永久挂载
修改  /etc/fstab 文件
# 查看分区
lsblk, fdisk , parted

# 自动输入 'y' , 格式化 
yes | mkfs.ext4  <Partition>

自动化脚本

# 要求
1.满配置待测试部件于对应的引入机型上,并确保软件版本信息准确
2.分别在所有槽位的待测试部件上创建两个物理分区(对于os盘,创建两个逻辑分区),每个分区占待测试ssD的50%空间大小(对于os盘,每个逻辑分区大小不低于10G)
3.针对所有槽位的待测试部件,在步骤2中创建的第1个分区上创建一个EXT4的文件系统,并分别挂载到一个指定的目录下。
4.针对所有槽位的待测试部件,在步骤 3 中创建的目录下,分别写入一个 100G 的文件( OS盘写入1G的文件 ),并利用 md5sum 指令为计算该文件MD5码,并将产生的MD5码输出到一个文件中;
分区, 挂载, 自动写文件 --- 自动化脚本
#!/bin/bash 


# 获取实时时间
gdate () {
    echo $(date +%Y.%m.%d.%H.%M.%S)
}

kkrint () {
    if [ "${1}" = '#' ]; then
        printf "\n\n\n1:[$(gdate)]\033[34m\t\t\t\t${2}\033[0m\n\n\n\n" >> disk_all_log
    elif [ "${1}" = "##" ]; then
        printf "\n\n2:[$(gdate)]\t\t\033[32m${2}\033[0m\n\n\n" >> disk_all_log
    elif [ "${1}" = "###" ]; then
        printf "\n3:[$(gdate)]\t\033[32m${2}\033[0m\n\n" >> disk_all_log
    elif [ "${1}" = "error" ]; then
        printf "\033[31me:[$(gdate)]Error: ${2}\033[0m\n" >> disk_all_log
    else
        printf "\033[35mi:[$(gdate)]:\033[0m ${1}\n" >> disk_all_log
    fi
}

declare -A jishu_part_file_arr


# 给每个盘的第一个分区挂载并写一个大的10G文件
disk_mkpart_write (){
:<<!
para 1: before or after
!
  if [[ "${1}" == "before" ]]; then
    os_disk=$(lsblk |grep -i 'boot' -B 1 |grep disk |awk '{print $1}')
    no_os_disk_li=$(echo $disk_symbol_li | sed "s/${os_disk}//g")
    no_os_disk_dev_li=$(echo $no_os_disk_li | awk '{ii=1;while(ii<=NF){printf("%s%s ","/dev/",$ii); ii++;}}')
    
    # 卸载所有挂载目录
    for ii in $(lsblk  $no_os_disk_dev_li -o "MOUNTPOINTS" -n  | xargs); do umount ${ii}; done
    # 格式化所有待测盘
    for ii in  $no_os_disk_dev_li; do parted -s -- ${ii} mklabel gpt; done

    # 设置挂载点所在目录
    mount_dir_prefix="/home"
    # 1. 创建分区
    for ddi in ${no_os_disk_dev_li}
    do
      parted -s -- ${ddi} mklabel gpt mkpart ext4 0 50% mkpart ext4 51% 100%
      kkrint "Create two partition of ${ddi}"
    done
    # 获取所有的分区完整路径
    no_os_disk_part_li_jishu=$(lsblk ${no_os_disk_dev_li} -p -l -n  -x "NAME" | grep part | sed 'N;P' -n | awk '{print $1}' | xargs)
    no_os_disk_part_li_oushu=$(lsblk ${no_os_disk_dev_li} -p -l -n  -x "NAME" | grep part | sed 'n;p' -n | awk '{print $1}' | xargs)
    # 2. 创建文件系统
    echo -e "\n开始给每个待测盘第一个分区创建 Ext4 文件系统, 请稍等片刻......\n"
    for ppi in ${no_os_disk_part_li_jishu} ${no_os_disk_part_li_oushu}
    do
      yes | mkfs.ext4 ${ppi}
      kkrint "Creating a Ext4 File System: ${ppi}"
    done
    # 3. 挂载
    echo -e "\n开始给每个待测盘第一个分区挂载, 请稍等片刻......\n"
    for mmi in ${no_os_disk_part_li_jishu}
    do
      mount_point_dir="${mount_dir_prefix}/${mmi##*/}"
      mkdir ${mount_point_dir} -p
      mount ${mmi} ${mount_point_dir}
      kkrint "mount ${mmi} ${mount_point_dir}"
    done
    wait ; sleep 1
    # 4. 写大文件
    echo -e "\n开始给每个待测盘第一个分区写一个 10G 大文件, 请稍等片刻......\n"
    for ffi in ${no_os_disk_part_li_jishu}
    do
      mount_point_dir="${mount_dir_prefix}/${ffi##*/}"
      fallocate -l 10G "${mount_point_dir}/bigfile_10G"
      jishu_part_file_arr["${ffi##*/}"]="${mount_point_dir}/bigfile_10G"
      kkrint "Make 10G files of ${mount_point_dir}/bigfile_10G"
    done
    wait ; sleep 1
    # 5. md5 计算
    echo -e "\n开始计算 MD5 值, 请稍等片刻......\n"
    for fs_name in "${jishu_part_file_arr[@]}"
    do
      echo "md5sum ${fs_name}"
      md5sum ${fs_name}
      echo
      kkrint "Calculating MD5 values of ${fs_name}"
    done > md5sum_record_${1}
  fi
}

disk_symbol_li=$(lsblk -n -d -o 'NAME' | xargs)

disk_mkpart_write "before"

echo "获取所有奇数盘: ${no_os_disk_part_li_jishu[@]}"

echo "获取所有偶数盘: ${no_os_disk_part_li_oushu[@]}"

echo "所创建的所有大文件为: ${jishu_part_file_arr[@]}"
posted @ 2023-11-24 00:34  梭梭666  阅读(259)  评论(0编辑  收藏  举报
返回顶部