新建三个分区并永久挂载

1.增加两个光盘

2.刷新scan

3.fdisk /dev/sdb

4.n(新建硬盘),新建主分区,默认主分区

5.选择默认分区号,默认扇区,+5G

6.n(再新建硬盘)新建扩展盘,选择“e”

7.默认分区号2,默认扇区,+10G

8.n(新建硬盘)新建逻辑盘,选择“l”

9.默认分区号5,默认扇区,+5G

10.w,保存退出

11.lsblk查看是否建好

12.cd到挂载文件夹mnt

13.建立挂载文件夹,mkdir sdb1 sdb5

14.cd 到家目录

15.给硬盘设置文件系统

mkfs.xfs /dev/sdb1 格式化sdb1

mkfs.xfs /dev/sdb5 格式化sdb5

16.将sdb1和sdb5挂载到/mnt目录下的备份文件夹

mount /dev/sdb1 /mnt/sdb1

mount /dev/sdb5 /mnt/sdb5

17.lsblk 检查是否挂载

18.blkid 查看磁盘设备信息

19.复制对应的uid到永久挂载的配置文件里

20.vim /etc/fstab进入永久挂载的配置文件里

21.按此格式配置

22.mount -a

<think>我们编写一个脚本,该脚本将执行以下步骤: 1. 创建目录 /data01(如果不存在) 2. 检测未挂载的磁盘(通常为 /dev/sdb, /dev/sdc 等),这里我们假设磁盘没有分区,我们将使用整个磁盘。 3. 对磁盘进行分区(使用parted创建单个主分区) 4. 格式化分区为ext4 5. 将分区永久挂载到/data01目录(通过修改/etc/fstab) 注意:在实际操作中,我们需要谨慎,因为脚本会格式化磁盘。因此,我们只处理没有挂载点且没有分区的磁盘。 步骤: 1. 创建目录:mkdir -p /data01 2. 使用lsblk或blkid来查找未挂载的磁盘。我们可以检查没有文件系统类型且没有挂载点的磁盘。 但是,为了简单起见,我们可以查找没有分区的磁盘(即没有子设备的磁盘)且没有挂载点。 注意:有些磁盘可能已经分区,但未挂载,我们这里只处理整个未分区的磁盘(即没有分区表或者没有分区的磁盘),我们使用整个磁盘创建一个分区。 另一种方法是查找所有系统可用的磁盘(如/dev/sd*),然后排除已经挂载的磁盘和已经有分区的磁盘(即已经有分区表或者已经分区的磁盘)。但是,为了安全,我们只处理没有分区表且未挂载的磁盘。 我们可以使用以下命令列出所有磁盘: lsblk -d -o NAME,MOUNTPOINT,FSTYPE,TYPE 我们只关心类型为disk且没有挂载点、没有文件系统类型的磁盘(注意:未初始化的磁盘没有文件系统类型,但可能有分区表,所以我们要检查分区表是否存在?) 更安全的方法是:使用parted检查磁盘是否有分区表。如果磁盘没有分区表,那么我们可以进行分区操作。 但是,我们也可以直接尝试分区,如果已经有分区表,则跳过?或者,我们只处理没有分区表且没有挂载点的磁盘。 这里我们采用:检查磁盘是否没有分区(通过查看lsblk输出中该磁盘的子设备数量,如果没有子设备,则认为没有分区),且没有挂载点。 具体步骤: - 获取所有磁盘设备(类型为disk)的名称。 - 对于每个磁盘设备,检查其挂载点是否为空(即未挂载),且没有子分区(即lsblk显示该磁盘下面没有part类型的分区)。 但是,我们可以通过lsblk -l 来列出所有块设备,然后检查该磁盘对应的行,如果该磁盘的挂载点为空,且没有分区(即没有分区表或者分区未被挂载),我们可以认为它是未使用的。 然而,更简单的方法是:使用`blkid -o device`列出所有已经格式化的设备(包括分区和磁盘),然后我们检查磁盘设备(如/dev/sdb)是否在blkid的输出中?如果不在,说明该磁盘未被格式化,也没有分区表?但是,blkid也会读取分区表吗?实际上,blkid会读取分区的文件系统信息,如果磁盘没有分区表,blkid不会输出该磁盘的分区(因为没有分区),但是磁盘本身可能没有文件系统,所以blkid不会输出该磁盘设备(除非整个磁盘被格式化了,但通常不会)。 因此,我们这样处理: - 使用`lsblk -n -o NAME -l -d` 列出所有磁盘设备(不包括分区)。 - 然后,对于每个磁盘设备(如sdb),检查它是否没有挂载点(使用`findmnt /dev/sdb`或检查`/proc/mounts`),且检查它是否有分区(通过`lsblk -n /dev/sdb | grep -c 'part'`,如果大于0,说明有分区,跳过)。 - 同时,我们还要检查该磁盘是否已经被格式化了(即整个磁盘有文件系统)?这种情况很少,但为了安全,我们通过blkid检查该磁盘设备是否有文件系统。 但是,我们也可以这样:只处理没有分区且没有文件系统签名的磁盘。 然而,为了简化,我们假设磁盘是全新的,没有任何分区表。我们使用parted来检查磁盘是否有分区表。 使用命令:`parted /dev/sdb print | grep -i 'partition table'`,如果输出中包含'msdos'或'gpt',说明有分区表。 但是,我们也可以尝试创建分区,如果已经存在分区表,那么我们会收到错误。不过,在脚本中我们选择先检查。 我们选择以下方法: 1. 列出所有磁盘(类型为disk,且不在blkid中,且没有挂载点)。 2. 使用parted检查磁盘是否有分区表。如果没有分区表,我们就创建分区。 但是,还有一种情况:磁盘有分区表,但没有分区?这种情况很少,但我们也应该跳过。 因此,我们只处理以下条件的磁盘: - 类型为disk(通过lsblk判断) - 没有挂载点 - 没有分区(通过lsblk查看该磁盘下没有part类型的子设备) - 没有文件系统(通过blkid检查该磁盘设备没有输出) 或者,我们也可以处理有分区表但未分区的磁盘?但这种情况比较复杂,我们只处理整个未分区的磁盘(即没有分区表,也没有文件系统)。 实际上,我们也可以处理整个磁盘已经被格式化为文件系统的情况(即整个磁盘没有分区,直接格式化了),但这种情况我们也要跳过,因为已经有文件系统了,可以直接挂载?但是,我们这里希望创建一个分区,所以这种情况我们不处理。 因此,我们只处理以下磁盘: - 没有挂载点 - 没有分区(即没有分区表或者分区表是空的?) - 没有文件系统 但是,我们如何检查没有文件系统?使用blkid /dev/sdb,如果没有输出,说明没有文件系统。 步骤总结: for disk in $(lsblk -d -n -o NAME); do if [ -z "$(findmnt -n -o SOURCE /dev/$disk)" ] && [ -z "$(blkid /dev/$disk)" ] && [ ! -b /dev/${disk}1 ]; then # 这个磁盘没有挂载,没有文件系统,也没有分区(即没有分区1,这里假设分区号为1) # 但是,这样检查分区不全面,因为可能有多个分区。所以更好的方法是检查该磁盘是否有分区表?或者检查该磁盘的分区数量? # 使用:`lsblk -n /dev/$disk | grep -c 'part'`,如果为0,说明没有分区 # 所以修改为: if [ $(lsblk -n -o TYPE /dev/$disk | grep -c 'part') -eq 0 ]; then # 然后我们进行分区操作 fi fi done 但是,上面的lsblk检查分区的命令不对,因为lsblk /dev/sdb会显示该磁盘和它的分区(如果有)。我们可以用: lsblk -n -l /dev/$disk | awk '{print $6}' | grep -c 'part' 这样,如果输出大于0,说明有分区。 实际上,我们可以这样: lsblk -n /dev/$disk | grep -c ' disk' # 这样不行 更简单的方法:直接检查该磁盘的分区设备是否存在(如/dev/sdb1),但可能分区号不止1。所以,我们使用parted来检查分区表是否存在。 我们使用:`parted /dev/$disk print | grep -i 'partition table' | awk '{print $3}'`,如果输出为"unknown",说明没有分区表。 因此,我们这样: for disk in $(lsblk -d -n -o NAME); do if [ -z "$(findmnt -n -o SOURCE /dev/$disk)" ] && [ -z "$(blkid /dev/$disk)" ]; then # 检查分区表 pt=$(parted -s /dev/$disk print | grep -i 'partition table' | awk '{print $3}') if [ "$pt" == "unknown" ]; then # 没有分区表,我们可以分区 fi fi done 但是,如果磁盘已经有分区表(比如msdos或gpt),但是还没有分区?这种情况我们也要处理吗?我们这里只处理没有分区表的磁盘。 或者,我们也可以处理有分区表但没有分区的情况?但是,我们这里要求整个磁盘只分一个区,所以如果已经有分区表,但还没有分区,我们可以创建一个分区?但是这样有风险,因为可能用户已经创建了分区只是没有格式化?所以,我们只处理没有分区表的磁盘。 因此,我们采用上述方法。 3. 分区:使用parted创建gpt或msdos分区表(这里我们使用gpt,因为新磁盘),然后创建一个分区占用整个磁盘。 命令:`parted -s /dev/$disk mklabel gpt mkpart primary 0% 100%` 4. 然后,格式化新分区:`mkfs.ext4 /dev/${disk}1` 5. 挂载分区:先创建挂载点(如果尚未创建),然后挂载。但是,我们要求永久挂载,所以需要修改/etc/fstab。 首先,获取分区的UUID:`blkid -s UUID -o value /dev/${disk}1` 然后,将UUID和挂载点添加到/etc/fstab:`echo "UUID=<uuid> /data01 ext4 defaults 0 0" >> /etc/fstab` 注意:这里我们挂载到/data01,所以之前要确保/data01存在。 6. 最后,执行`mount -a`来挂载所有fstab中的设备。 但是,我们还需要考虑一个情况:可能有多块磁盘?但是,我们的脚本只处理一个磁盘吗?还是多个?我们这里假设只处理一个未挂载的磁盘,因为题目要求是“自动检测未挂载的磁盘”,可能是多个,但我们的挂载点只有一个/data01,所以只能挂载一个磁盘。因此,我们只处理第一个符合条件的磁盘。 或者,我们也可以挂载多个磁盘,但每个磁盘需要不同的挂载点,比如/data01, /data02等。但是题目要求是挂载到/data01,所以只能处理一个磁盘。 因此,我们在找到第一个符合条件的磁盘后,就进行分区、格式化、挂载,然后退出。 但是,如果有多块磁盘,我们可能希望都挂载?但题目要求是挂载到/data01,所以只能挂载一个磁盘。因此,我们只处理第一个符合条件的磁盘。 如果希望挂载多个磁盘到不同的目录,那么需要修改脚本,但题目要求是挂载到/data01。 所以,我们只处理第一个符合条件的磁盘。 脚本内容如下(注意:需要root权限): ```bash #!/bin/bash # 创建目录 mkdir -p /data01 # 查找未挂载且未分区的磁盘 target_disk="" for disk in $(lsblk -d -n -o NAME); do # 检查磁盘是否挂载 if findmnt "/dev/$disk" >/dev/null; then echo "Disk /dev/$disk is mounted, skip." continue fi # 检查磁盘是否有文件系统(可能是整个磁盘被格式化了) if blkid "/dev/$disk" >/dev/null; then echo "Disk /dev/$disk has a filesystem, skip." continue fi # 检查分区表类型 pt=$(parted -s "/dev/$disk" print 2>/dev/null | grep -i 'partition table' | awk '{print $3}') if [ "$pt" == "unknown" ]; then target_disk="/dev/$disk" break else echo "Disk /dev/$disk has a partition table ($pt), skip." fi done if [ -z "$target_disk" ]; then echo "No available disk found." exit 1 fi echo "Found available disk: $target_disk" # 分区 echo "Partitioning $target_disk..." parted -s "$target_disk" mklabel gpt parted -s -a optimal "$target_disk" mkpart primary 0% 100% # 等待分区设备出现 partprobe "$target_disk" sleep 2 # 获取分区设备名,通常是磁盘名加1,如sdb1 partition="${target_disk}1" if [ ! -e "$partition" ]; then # 有时可能是nvme磁盘,分区名会是类似nvme0n1p1 # 我们重新获取分区设备名:使用lsblk列出该磁盘的分区 partition_name=$(lsblk -n -o NAME "$target_disk" | grep -m1 'part' | awk '{print $1}') if [ -z "$partition_name" ]; then echo "Failed to create partition on $target_disk." exit 1 fi partition="/dev/$partition_name" fi # 格式化 echo "Formatting $partition to ext4..." mkfs.ext4 -F "$partition" # 获取UUID uuid=$(blkid -s UUID -o value "$partition") # 添加到fstab echo "Adding $partition to /etc/fstab with UUID=$uuid" echo "UUID=$uuid /data01 ext4 defaults 0 0" >> /etc/fstab # 挂载 mount -a echo "Done. $partition has been mounted to /data01" ``` 注意: 1. 我们使用了`parted -s`来避免交互。 2. 分区后,我们使用`partprobe`来通知系统分区表变化,然后等待2秒让分区设备出现。 3. 分区设备名通常是在磁盘名后面加1,例如/dev/sdb1。但是,对于NVMe磁盘,分区名可能是/dev/nvme0n1p1。所以,我们使用lsblk来获取分区名。 4. 在格式化时,我们使用`-F`强制格式化,避免交互。 5. 在修改fstab之前,我们确保获取了分区的UUID,使用UUID挂载更可靠。 但是,这个脚本有一些限制: - 只处理第一个符合条件的磁盘。 - 假设磁盘设备名在/dev/下,且通过lsblk列出。 - 需要root权限。 使用这个脚本时,请确保没有重要数据在磁盘上,因为格式化会清除所有数据。 另外,如果系统中没有符合条件的磁盘,脚本会退出。 最后,我们执行脚本即可。 注意:在真实环境中,最好先测试脚本,避免误操作。 现在,我们按照要求,给出脚本解释。 §§相关问题§§: 1. 如何修改脚本以支持多个磁盘的挂载(每个磁盘挂载到不同的目录,例如/data01, /data02等)? 2. 如果磁盘已经有一个分区表但未格式化,如何修改脚本来处理这种情况? 3. 如何避免在脚本中重复挂载同一个磁盘? 4. 在分区和格式化过程中,如何增加错误处理以确保每一步都成功?</think>以下是一个自动初始化磁盘永久挂载的Bash脚本,它将执行以下操作: 1. 创建`/data01`目录 2. 检测未挂载的磁盘 3. 初始化磁盘(GPT分区表) 4. 创建单个分区格式化为ext4 5. 永久挂载到`/data01` ```bash #!/bin/bash # 自动初始化磁盘挂载脚本 # 1. 创建目录 mkdir -p /data01 # 2. 检测未挂载的磁盘 find_unmounted_disk() { # 获取所有磁盘设备 disks=$(lsblk -d -n -o NAME | grep -E '^[sv]d[a-z]$|^nvme[0-9]n[0-9]$') for disk in $disks; do dev="/dev/$disk" # 检查是否已有分区 if [ $(lsblk -n $dev | grep -c 'part') -eq 0 ]; then # 检查是否已挂载 if ! findmnt $dev >/dev/null; then # 检查是否已有文件系统 if ! blkid $dev >/dev/null; then echo $dev return 0 fi fi fi done return 1 } # 3. 初始化磁盘 target_disk=$(find_unmounted_disk) if [ -z "$target_disk" ]; then echo "未找到可用磁盘" exit 1 fi echo "找到可用磁盘: $target_disk" # 4. 创建分区 echo "正在创建分区..." { echo g # 创建GPT分区表 echo n # 新建分区 echo # 默认分区号 echo # 默认起始扇区 echo # 默认结束扇区 echo w # 写入更改 } | fdisk $target_disk >/dev/null 2>&1 # 获取分区路径(适配NVMe和非NVMe设备) if [[ $target_disk =~ "nvme" ]]; then partition="${target_disk}p1" else partition="${target_disk}1" fi # 等待分区设备出现 partprobe $target_disk sleep 2 # 5. 格式化为ext4 echo "正在格式化分区..." mkfs.ext4 -F $partition >/dev/null 2>&1 # 6. 永久挂载 # 获取UUID uuid=$(blkid -s UUID -o value $partition) # 添加到fstab echo "UUID=$uuid /data01 ext4 defaults 0 0" >> /etc/fstab # 挂载分区 mount -a echo "操作完成:" echo "磁盘: $target_disk" echo "分区: $partition" echo "挂载点: /data01" echo "UUID: $uuid" ``` ### 脚本解释: 1. **创建目录**: ```bash mkdir -p /data01 ``` `-p`参数确保目录不存在时创建,存在时不报错 2. **检测未挂载磁盘**: - 使用`lsblk`列出所有物理磁盘(排除分区) - 检查三个条件: - 无现有分区(`grep -c 'part'`) - 当前未挂载(`findmnt`) - 无文件系统(`blkid`) 3. **分区创建**: ```bash echo g | fdisk $disk # 创建GPT分区表 echo n | fdisk $disk # 新建分区 ``` 使用管道自动应答fdisk的交互提示 4. **分区命名规则**: - NVMe磁盘:`/dev/nvme0n1p1` - SATA磁盘:`/dev/sdb1` 脚本自动处理这两种情况 5. **文件系统格式化**: ```bash mkfs.ext4 -F $partition ``` `-F`强制格式化,避免交互提示 6. **永久挂载**: - 使用UUID而非设备路径(更可靠) ```bash echo "UUID=$uuid /data01 ext4 defaults 0 0" >> /etc/fstab ``` - `mount -a`立即挂载所有fstab配置 ### 使用说明: 1. 保存为`auto-mount.sh` 2. 添加执行权限:`chmod +x auto-mount.sh` 3. **以root身份运行**:`sudo ./auto-mount.sh` 4. 验证:`df -h /data01` ### 注意事项: - 脚本会格式化目标磁盘的所有数据 - 仅处理未分区、未挂载的原始磁盘 - 优先选择第一个符合条件的磁盘 - 使用GPT分区表(支持>2TB磁盘) - 通过UUID挂载(设备名可能变化)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值