2016-12-29 5 views
0

Я написал сценарий, который требует прочитать несколько записей в /etc/fstab. Я протестировал скрипт, вручную добавив некоторые записи в /etc/fstab, а затем восстановил файл до его исходного содержимого, а также вручную. Теперь я хотел бы автоматизировать эти тесты и запустить их как отдельный скрипт. Однако я не чувствую себя комфортно с изменением /etc/fstab. Я думал создать резервную копию /etc/fstab, а затем изменить ее и, наконец, восстановить исходный файл после завершения тестов. Я бы предпочел, чтобы временно изменить местоположение fstab.Изменить местоположение/etc/fstab

Есть ли способ изменить расположение fstab, скажем, /usr/local/etc/fstab так что, когда mount -a запускается из сценария только записи в /usr/local/etc/fstab обрабатываются?

UPDATE:

Я использовал bishop's solution установкой LIBMOUNT_FSTAB=/usr/local/etc/fstab. Я несколько раз просматривал справочную страницу mount, но я никогда не замечал эту переменную. Я не уверен, что эта переменная всегда была там, и я просто забыл об этом или был добавлен в какой-то момент. Я использую mount from util-linux 2.27.1 и по крайней мере в этой версии LIBMOUNT_FSTAB доступен и задокументирован на man-странице. Он находится в разделе ENVIRONMENT в конце. Это сделает мои автоматические тесты более безопасными в будущем.

UPDATE2:

Так было некоторое обсуждение, является ли соответствующий вопрос программирования или нет, я решил написать небольшой скрипт, который демонстрирует использование LIBMOUNT_FSTAB.

#!/bin/bash 

libmount=libmount_fstab 
tmpdir="/tmp/test_${libmount}_folder" # temporary test folder 
mntdir="$tmpdir/test_${libmount}_mountfolder" # mount folder for loop device 
img="$tmpdir/loop.img" # dummy image for loop device 
faketab="$tmpdir/alternate_fstab" # temporary, alternative fstab 

# get first free loop device 
loopdev=$(losetup -f) 

# verify there is a free loop device 
if [[ -z "$loopdev" ]];then 
    echo "Error: No free loop device" >&2 
    exit 1 
fi 

# check that loop device is not managed by default /etc/fstab 
if grep "^$loopdev" /etc/fstab ;then 
    echo "Error: $loopdev already managed by /etc/fstab" >&2 
    exit 1 
fi 

# make temp folders 
mkdir -p "$tmpdir" 
mkdir -p "$mntdir" 

# create temporary, alternative fstab 
echo "$loopdev $mntdir ext2 errors=remount-ro 0 1" > "$faketab" 

# create dummy image for loop device 
dd if=/dev/zero of="$img" bs=1M count=5 &>/dev/null 

# setup loop device with dummy image 
losetup "$loopdev" "$img" &>/dev/null 

# format loop device so it can be mounted 
mke2fs "$loopdev" &>/dev/null 

# alter location for fstab 
export LIBMOUNT_FSTAB="$faketab" 

# mount loop device by using alternative fstab 
mount "$loopdev" &>/dev/null 

# verify loop device was successfully mounted 
if mount | grep "^$loopdev" &>/dev/null;then 
    echo "Successfully used alternative fstab: $faketab" 
else 
    echo "Failed to use alternative fstab: $faketab" 
fi 

# clean up 
umount "$loopdev" &>/dev/null 
losetup -d "$loopdev" 
rm -rf "$tmpdir" 

exit 0 

Мой сценарий в основном управляет внешними устройствами, которые не прилагаются большую часть времени. Я использую loop-устройства для имитации внешних устройств для проверки функциональности моего скрипта. Это экономит много времени, так как мне не нужно прикреплять/повторно подключать несколько физических устройств. Я думаю, что это доказывает, что возможность использовать альтернативу fstab является очень полезной функцией и позволяет создавать сценарии безопасного сценария при каждом разборе/изменении fstab. Фактически, я решил частично переписать свой сценарий, чтобы он мог также использовать альтернативу fstab. Поскольку большинство внешних устройств почти никогда не привязаны к системе, их соответствующие записи просто загромождают /etc/fstab.

+0

SO для вопросов программирования. Unix.SE лучше было бы задать вопросы о настройке Unix. – Barmar

+1

Это звучит как сделать это обратным для меня. Сделайте свой сценарий для определения местоположения из переменной среды (с помощью '/ etc/fstab', если он не установлен). –

+0

AFAIK, нет возможности сказать 'mount' использовать альтернативное местоположение для' fstab'. – Barmar

ответ

3

Рефакторинг вашего кода, который изменяет содержимое fstab в одну функцию, а затем проверяет, что функция правильно изменяет файлы фиктивного fstab, которые вы ему предоставляете. Тогда вы можете с уверенностью использовать эту функцию в составе вашего конвейера mount.

function change_fstab { 
    local fstab_path=${1:?Supply a path to the fstab file} 
    # ... etc 
} 

change_fstab /etc/fstab && mount ... 

В качестве альтернативы, установите LIBMOUNT_FSTAB в the libmount docs:

LIBMOUNT_FSTAB=/path/to/fake/fstab mount ... 
+0

Я ничего не вижу на man-странице mount (8), в которой говорится, что она использует эту переменную среды. Ты это пробовал? – Barmar

+1

@Barmar Я использовал исходный код. mount.c использует libmount, а libmount использует его. Пробег может отличаться от GNU/Linux. Кстати, справочная страница Centos, в разделе «ENVIRONMENT»: LIBMOUNT_FSTAB = переопределяет местоположение файла fstab по умолчанию. – bishop

+0

Возможно, это зависит от дистрибутива. Я на Debian 7 и не вижу этого на странице man. Но 'ldd/bin/mount' показывает это с помощью' libmount', поэтому он может работать. – Barmar

Смежные вопросы