Показать статистику
0 голосов
от (1.7тыс. баллов)

Как получить массив подключенных (но не отформатированных/подключенных) жестких дисков, отсортированных по размеру (но без данных о размерах в массиве)

Мне нужен был способ запрограммировать монтирование жестких дисков в определенную точку монтирования. После некоторого просмотра я нашел: https://gist.github.com/trentmswanson/9c22bb71182e982bd36f

Это было для MS Azure и не охватывало определенные типы жестких дисков в инфраструктуре AWS. Он использовал sdf в нужном nvm. Я внес эти изменения, и результат сработал. У меня есть массив, содержащий точки монтирования:

# 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, должен быть сначала создан/подключен.

Когда я монтирую /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

но (как и ожидалось) это не сортируется по размеру. Он сортируется по переданному имени жесткого диска:

/dev/nvme1n1
/dev/nvme2n1 

а также

/dev/nvme2n1
/dev/nvme1n1

Соответственно. Это именно то, что я хочу, просто отсортировано по размеру, а не по имени.

Другой поиск в Google не дал много полезной помощи для извлечения размера и сортировки основного значения по размеру. Я запускаю минимальную установку Ubuntu 18.04, так как это веб-сервер. У меня есть доступ к df и fdisk, и я пытаюсь установить еще много пакетов, но рассмотрю это, если это окажется значительно проще.

160 просмотров 2 ответов

2 Ответы

0 голосов
от (2.7тыс. баллов)

Я действительно не понимаю, что вы пытаетесь сделать (или почему), но вы могли бы рассмотреть возможность использования 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
0 голосов
от (26.4тыс. баллов)

Я думаю, вам нужен 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

это смонтирует файловую систему в определенном порядке.


...