如何获取当前已连接(但未格式化/安装)的硬盘阵列并按大小排序(但不含阵列中的大小数据)

如何获取当前已连接(但未格式化/安装)的硬盘阵列并按大小排序(但不含阵列中的大小数据)

我想要一种方法来编写将硬盘驱动器安装到特定安装点的脚本。经过一番浏览,我发现:https://gist.github.com/trentmswanson/9c22bb71182e982bd36f

这是针对 MS Azure 的,并不涵盖 AWS 基础设施中的特定硬盘类型。它在所需的 nvm 中使用了 sdf。我做了这些更改,结果成功了。我有一个包含挂载点的数组:

# Custom Mount Points for first 2 HDDs
typeset -A MountPoint
MountPoint[1]="/FileMakerData"
MountPoint[2]="/FileMakerData/Backups"

并有一行尝试读取“此”硬盘大小并进行适当安装:

# Tests the size of volume to test for the proper disk size
DiskSize=$(sudo fdisk -s ${DISK})

# Calculates the number of GB and resets the variable as that number
let DiskSize=DiskSize/1048576

echo "$DiskSize"
# Uses the disk size to determine disk type. 
# Assumes that the Backup drive will never be less than 50 GB and Data will never start GT 50 GB
if [ "$DiskSize" -lt 50 ]; 
then DiskType="Data"
elif ["$DiskSize" -ge 50 ];
then DiskType="Backup"
fi

然后函数根据该值从数组中获取挂载点。

get_next_mountpoint() {
    DeviceType=${1}
    if ( test "$DeviceType" == "Data" ); then echo "${MountPoint[1]}"
    elif ( test "$DeviceType" == "Backup" ); then echo "${MountPoint[2]}"
    else
        # Echos blank so the script will know to exit loop
        echo ""
    fi
}

脚本还有很多内容。但这个过程的问题是,必须先创建/安装要安装到 /FileMakerData 的 HDD。

当我挂载 /FileMakerData/Backups 然后挂载 /FileMakerData 时,我会在 /FileMakerData 中得到一个标记为“lost+found”的目录。这种情况发生是有道理的,因为我突然改变了目录结构的中间部分。但是,我无法找到一种方法来通过增加大小来列出硬盘驱动器,以便当脚本从文件夹中获得任意顺序时(因为 AWS 将它们向后挂载),我仍然可以以正确的顺序将正确大小的驱动器挂载到正确的文件夹中。

我当前的代码是:

# An set of disks to ignore from partitioning and formatting; Use pipe to seperate (may act as OR in this case)
BLACKLIST="/dev/nvme0"

# Gets a list of disks filters out the listed ones then searches for others
DEVS=($(ls -1 /dev/nvme*|egrep -v "${BLACKLIST}"|egrep "[0-9]n[0-9]$"))

我发现:https://linuxhint.com/list_disks_ubuntu/ 但是它没有告诉我如何在一个简单的数组中获取它们,而且我也不能用这个命令按大小排序。

我试过:

ls -1 /dev/nvme*|egrep -v "${BLACKLIST}"|egrep "[0-9]n[0-9]$" | sort

ls -1 /dev/nvme*|egrep -v "${BLACKLIST}"|egrep "[0-9]n[0-9]$" | sort -r

但(正如预期的那样)它不按大小排序。它按传递的 HDD 名称排序:

/dev/nvme1n1
/dev/nvme2n1 

/dev/nvme2n1
/dev/nvme1n1

分别。这正是我想要的,只是按大小排序,而不是按名称排序。

其他谷歌搜索并没有找到太多有用的帮助来提取大小并按大小对主值进行排序。我正在运行 Ubuntu 18.04 最小安装,因为这是一个 Web 服务器。我可以访问 df 和 fdisk,我正在尝试安装更多软件包,但如果事实证明这样做更容易,我会考虑这样做。

答案1

我不太明白您想做什么(或为什么),但您可以考虑使用lsblk它的--json输出格式说明符,将结果传输到jq您可以实现自定义过滤/排序的地方。

例如:

$ lsblk -b --json | jq -r '
    .blockdevices[] | select(.name == "sda") |
    [ .children[] | select(.mountpoint == null and .name != "sda4") ] | sort_by(.size) | .[].name
'
sda1
sda2

答案2

我想你想要systemd.mount为此。添加x-systemd.requires-mounts-for=到您的fstab条目将创建一个临时安装单元:

# fstab(5):
/dev/loop1 /opt/mnt      ext4 noauto 0 0  
/dev/loop2 /opt/mnt/data ext4 noauto,x-systemd.requires-mounts-for=/opt/mnt 0 0

您可以将其作为 systemd.unit 启动和停止:

systemctl start opt-mnt-data.mount

这将按照特定顺序挂载文件系统。

相关内容