2016-12-29 10 views
0

私は/etc/fstabのいくつかのエントリを読む必要があるスクリプトを書いています。私は手動で/etc/fstabにいくつかのエントリを追加してスクリプトをテストした後、手動で元の内容にファイルを復元しました。今私はこれらのテストを自動化し、それらを別々のスクリプトとして実行したいと思います。しかし、私は、/etc/fstabを変更するという考え方に慣れていません。私は/etc/fstabのバックアップコピーを作成し、それを変更し、最終的にテストが完了した後に元のファイルを復元することを考えていました。私は一時的にfstabの位置を変更することができればそれを好むだろう。/etc/fstabの場所を変更してください

mount -aは、スクリプト内から実行されたときに/usr/local/etc/fstabで唯一のエントリが処理されるように/usr/local/etc/fstab、たとえば、にfstabの場所を変更する方法がありますか?

UPDATE:

私はLIBMOUNT_FSTAB=/usr/local/etc/fstabを設定することにより、bishop's solutionを使用。過去にいくつかの機会にマニュアルページmountをスキミングしましたが、私はこの変数に気付かなかったのです。私はこの変数がいつもそこにあって、それを見落としてしまったのか、ある時点で追加されたのか分からない。私はmount from util-linux 2.27.1を使用しており、少なくともこのバージョンではLIBMOUNT_FSTABが利用可能であり、マニュアルページに記載されています。最後のENVIRONMENTセクションにあります。これにより、私の自動化されたテストは将来もっと安全になります。

アップデート2:これは、適切なプログラミングの質問であるか否かの議論があったので

、私は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 

私のスクリプトは、ほとんどの場合、ほとんどの場合接続されていない外部デバイスを管理します。ループデバイスを使用して、外部デバイスをシミュレートしてスクリプトの機能をテストします。これにより、複数の物理デバイスを接続/再接続する必要がないため、時間が大幅に節約されます。 fstabの代わりに使うことができることが証明されたのは、非常に便利な機能であり、構文解析/変更がfstabになるたびに、安全なテストシナリオをスクリプト化できることです。実際には、代替スクリプトfstabも使用できるようにスクリプトを部分的に書き直すことにしました。ほとんどの外部デバイスはほとんどシステムに接続されていないので、対応するエントリはちょうど/etc/fstabまで乱雑です。

+0

SOプログラミングの質問です。 Unix.SEは、Unixの設定について質問するのに適しています。 – Barmar

+1

それは私にそれを逆行させるように聞こえる。環境変数から場所を取るようにします(設定されていない場合は '/ etc/fstab'を使用します)。 –

+0

AFAIK、 'mount'に' fstab'の代わりの場所を使うよ​​うに指示する方法はありません。 – Barmar

答えて

3

fstabの内容を1つの関数に変更するコードをリファクタリングしてから、その関数が提供するダミーのfstabファイルを正しく変更するかどうかテストします。次に、その機能を確実にパイプラインの一部として使用できます。

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

change_fstab /etc/fstab && mount ... 

はまた、the libmount docsあたりLIBMOUNT_FSTABを設定します。

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

'mount(8)'のマニュアルページにその環境変数を使用していることが表示されません。あなたはそれを試しましたか? – Barmar

+1

@Barmar私はソースコードを使用しました。 mount.cはlibmountを使用し、libmountはそれを使用します。走行距離はGNU/Linux外で異なる場合があります。偶然にも、 "環境"の下にCentOSのmanページがあります:LIBMOUNT_FSTAB = は、fstabファイルのデフォルトの場所を上書きします。 – bishop

+0

おそらくそれは配布に依存します。私はDebian 7に入っていて、manページには表示されていません。しかし 'ldd/bin/mount'は' libmount'を使ってそれを示しているので、うまくいくかもしれません。 – Barmar

関連する問題