2016-12-29 1 views
0

/etc/fstab에 몇 가지 항목을 읽어야하는 스크립트를 작성했습니다. /etc/fstab에 수동으로 일부 항목을 추가하여 스크립트를 테스트 한 다음 파일을 원래 내용으로 수동으로 복원했습니다. 이제이 테스트를 자동화하고 별도의 스크립트로 실행하고 싶습니다. 그러나 저는 /etc/fstab을 변경하는 아이디어에 익숙하지 않습니다. /etc/fstab의 백업 복사본을 만든 다음 테스트를 마친 후 원래 파일을 복원하는 방법을 생각했습니다. 임시로 fstab의 위치를 ​​변경할 수 있으면 선호합니다./etc/fstab의 위치를 ​​변경하십시오

말에 fstab의 위치를 ​​변경하는 방법이 있나요, mount -a 스크립트 내에서 실행될 때 /usr/local/etc/fstab 그래서 /usr/local/etc/fstab의 항목 만 처리됩니다?

업데이트 :

나는 LIBMOUNT_FSTAB=/usr/local/etc/fstab을 설정하여 bishop's solution을 사용했다. 나는 과거에 여러 번에 걸쳐 mount의 맨 페이지를 보았지만이 변수를 결코 알지 못했습니다. 나는이 변수가 항상 거기에 있었는지 확실하지 않고 간단히 간과했거나 어떤 시점에서 추가 되었다면 확실하지 않습니다. mount from util-linux 2.27.1을 사용하고 있으며 최소한이 버전에서는 LIBMOUNT_FSTAB을 사용할 수 있으며 설명서 페이지에 설명되어 있습니다. 끝 부분의 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 

내 스크립트는 주로 첨부되지 않은 외부 장치를 주로 관리합니다. 루프 디바이스를 사용하여 외부 디바이스를 시뮬레이트하여 스크립트의 기능을 테스트합니다. 여러 물리적 장치를 연결하거나 다시 연결할 필요가 없기 때문에 이렇게 많은 시간을 절약 할 수 있습니다. 이것은 fstab 대안을 사용할 수 있다는 것이 매우 유용한 기능이며, 구문 분석/변경이 fstab 일 때마다 안전한 테스트 시나리오를 스크립팅 할 수 있음을 증명합니다. 실제로 스크립트를 부분적으로 다시 작성하여 대체 스크립트 fstab을 사용할 수 있도록 결정했습니다. 대부분의 외부 장치는 시스템에 거의 연결되지 않으므로 해당 항목은 단지 /etc/fstab까지 어수선하게 정리됩니다.

+0

그래서 프로그래밍 질문입니다. 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 ... 

또는 the libmount docsLIBMOUNT_FSTAB을 설정

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

'mount (8)'맨 페이지에 환경 변수를 사용한다고하는 내용이 전혀 없습니다. 너 해봤 어? – Barmar

+1

@Barmar 소스 코드를 사용했습니다. mount.c는 libmount를 사용하고 libmount는이를 사용합니다. 마일리지는 GNU/Linux 외부에서 다를 수 있습니다. "환경"아래에 CentOS 매뉴얼 페이지가 있습니다 : LIBMOUNT_FSTAB = 은 fstab 파일의 기본 위치를 덮어 씁니다. – bishop

+0

어쩌면 배포판에 따라 달라질 수 있습니다. 나는 데비안 7에 있고 man 페이지에서 그것을 볼 수 없다. 그러나'ldd/bin/mount'는'libmount'를 사용하여 그것을 보여 주므로 작동 할 수도 있습니다. – Barmar

관련 문제