Назад | Перейти на главную страницу

Управление несколькими устройствами LUKS

В моем файловом сервере linux четыре диска USB-3 с шифрованием LUKS. Немного запутанно монтировать их все: хотя они могут получить те же буквы дисков, что и в прошлый раз, могут и не получить, что приводит к некоторым пробам и ошибкам.

Чтобы установить их, я обычно говорю что-то вроде этого (обычно для каждого из c, d, e и f):

sudo cryptsetup open --type luks /dev/sdc d1
sudo mount /dev/mapper/d1 /d1

(Обратите внимание, что сценарий угрозы здесь заключается в том, что кто-то крадет мое оборудование. Цель состоит в том, чтобы при отключении питания я снова его включил. Допустимо, что файловый сервер не обслуживает файлы в мое отсутствие.)

Я вижу UUID в /dev/disk/by-uuid/, хотя это не UUID LUKS. Я подозреваю, что они стабильны.

Я также вижу информацию о USB-порте в /dev/disk/by-path/ (не очень хорошо, зависит от того, где он подключен) и WWID в /dev/disk/by-id/. В обоих случаях я мог бы создать короткий сценарий (для запуска вручную), который сканирует знакомые имена и использует sed , чтобы вытащить номер диска, а затем выполнить две строки выше, чтобы открыть и смонтировать том.

Но, возможно, у этой проблемы есть лучшее решение. Какие-либо предложения?

Я бы настроил / и т.д. / crypttab и используйте UUID, например

usb1     UUID=d665864f-08e1-49ed-9adc-c608deadbeef

который настроит / dev / mapper / usb1 с соответствующего диска. Затем вы можете использовать записи fstab и т. Д. Для монтирования файлов. Во время загрузки система запрашивает парольную фразу для разблокировки диска, никаких дополнительных сценариев не требуется.

В итоге я написал короткий сценарий bash монтировать по UUID.

Ссылка выше покажет текущее состояние (которое может включать мертвые), поэтому вот как оно выглядит сегодня:

#!/bin/bash

# Mount all LUKS partitions that I know about that are connected to
# this machine but not already mounted.

luks_mount() {
    # This is the UUID we can see before luksOpen.
    uuid="$1"
    # Where to mount it.  Should be at the root of the root file
    # system with no trailing slash.  That is, /foo, not /foo/,
    # /foo/bar or simply foo.
    mount_point="$2"
    if [ ! -d $mount_point ]; then
        echo "$mount_point does not exist or is not a directory."
        return
    fi
    root_id=$(stat -c '%D %m' /)
    mount_id=$(stat -c '%D %m' "$mount_point")
    if [ "$root_id" != "$mount_id" ]; then
        echo "$mount_point is already mounted (is not part of the root filesystem)."
        echo "$root_id != $mount_id"
        return
    fi
    if [ ! -e /dev/disk/by-uuid/$uuid ]; then
        echo "LUKS volume for $mount_point not available."
        return
    fi
    drive_letter=$(stat /dev/disk/by-uuid/$uuid -c '%N' | \
                       sed -e 's/^.*sd//;' | \
                       tr -d "'")
    device=/dev/sd$drive_letter;
    mapping=$(echo $mount_point | tr -d /);
    echo "Mounting $mount_point:"
    sudo cryptsetup open --type luks $device $mapping;
    sudo mount /dev/mapper/$mapping /$mapping;
}

luks_mount 4d4bc0a0-e67a-4f9b-8c70-05cfdbf9282c /jma-4t
luks_mount 4b824f8c-94d4-4655-8e56-67ead167ed4c /jma-3t
luks_mount 5d6777f0-f475-451e-bad8-3cdf6e80f7c5 /sb-4t
luks_mount 4ea3852f-8cdd-4ed9-898e-d86a851e0a9c /sb-3t