네트워크에 Raspberry Pi 2를 부팅한 후 마운트하려는 공유 폴더가 있습니다. 내 항목을 편집했으며 /etc/fstab
수동으로 실행하면 mount -a
해당 항목에 액세스할 수 있습니다. 인터넷에서 다양한 "솔루션"을 찾았지만 그 중 어느 것도 나에게 적합한 것 같지 않습니다.
mount -a
빠른 수정으로 이러한 볼륨을 마운트하고( 사용하여 ) 내 볼륨에 추가 하는 스크립트를 만들었으므로 .bashrc
해당 사용자를 통해 연결할 때 ssh
해당 볼륨에 액세스할 수 있습니다.
이 스크립트를 추가하려고 시도했지만 /etc/network/if-up.d/
작동하지 않는 것 같습니다. 왜 이것이 작동하지 않습니까? 어떤 방법이 더 낫나요?
추신: 저는 osmc
Raspbian 버전을 사용하고 있습니다(이것이 단지 "osmc" 서비스를 사용하는 Raspbian인지 아니면 다른 배포판인지는 확실하지 않습니다). 그래서 내가 실행하면 uname -a
다음을 얻습니다.
Linux osmc 4.2.1-1-osmc #1 SMP PREEMPT Wed Sep 23 17:57:49 UTC 2015 armv7l GNU/Linux
답변1
때로는 작동해야 하는 메커니즘이 작동하지 않는 이유를 알아내는 것이 필요한 다른 작업을 수행하는 것보다 더 많은 작업이 될 수 있습니다.방탄방법.
부팅 시 공유 폴더가 마운트되기를 원하지만 네트워크가 시작될 때까지 기다려야 합니다(WRT 부팅 서비스에서는 "네트워크"와 "네트워크 부팅"이 서로 다른 두 가지인 경향이 있습니다). 이를 수행하는 정식 방법은 분명히 ifup
네트워크 연결("네트워크"와 동일하지 않음)을 설정해야 하는 서비스에 의존하는 서비스를 전달하거나 시작하는 것입니다. 그러나 우리는 어떤 이유로든 이러한 메커니즘이 이 상황에서는 신뢰할 수 없다는 것을 확인했습니다.
보다 "완벽한" 접근 방식을 마련하려면 이 작업을 가장 기본적인 요소로 축소하고 쉘 도구를 사용하여 기본적이고 근본적인 방법으로 이러한 요소를 처리해야 합니다. 먼저 일종의 테스트를 수행하여 네트워크가 정상인지 확인한 다음 테스트가 성공할 때까지 기다릴 수 있습니다.
또는 이 테스트를 건너뛰고 자체적으로 결과를 테스트할 수 있습니다 mount
. 이는 네트워크 공유를 사용할 수 없으면 실패합니다.
#!/bin/bash
exec &> /var/log/mountshare.log
gap=3
attempts=40
while [ $attempts -gt 0 ]; do
mount -v /foo /bar
if [ $? -eq 0 ]; then break; fi
attempts=$(($attempts - 1))
sleep $gap
done
설명하다:
exec &> /var/log/mountshare.log
이 스크립트의 모든 출력을 파일로 리디렉션하여 이전 버전을 덮어씁니다. 이것은 일종의 bashism이므로 shebang 라인이 단순하지 않습니다#!/bin/sh
. 그러나 일반 Linux 시스템에서는 bash를 사용하는 것이 일반적으로 안전한 선택입니다.gap
and 값은attempts
2분 동안(충분한 시간) 3초마다 시도된다는 의미입니다. 원하는 경우 간격을 1로 설정할 수 있습니다. 이는 실제로 시스템에 해를 끼치지 않고 1초 간격으로 영원히 실행될 수 있는 믿을 수 없을 정도로 작은 작업입니다.이
mount
줄은 구체적입니다(물론 사용자 정의가 필요함). 자신이 원하는 것이 무엇인지 정확히 알고 있기 때문에 이것이 최선mount -a
이며 테스트가 더 정확하다는 것을 보장합니다.방탄. fstab에 목록이 있는 경우 매개변수(장치 경로 또는 기타 식별자)를 사용할 수 있어야 하지만, 이 요구 사항은 전체 특정 명령을 사용하면 더 쉽고 더 잘 충족됩니다.방탄기준.테스트에서는
if [ $? -eq 0 ]
종료 상태를 확인합니다mount
. 성공하면 0을 반환하고, 실패하면 다른 값을 반환합니다. 이 경우 mount는 오류를 발생시키고 이 출력은 로그 파일에 남게 됩니다. 우리가 그것을 사용했기 때문에-v
호출이 성공할 때 메시지도 생성합니다.다음 두 줄은 카운터(
attempts
)를 감소시키고 절전 모드를 추가합니다. 수면은 매우 중요합니다. 잠도 안 자고 이런 일을 하지 마세요. 이것이 없으면 "말 그대로 영원히 실행되는 엄청나게 작은 작업"에서 많은 프로세서 시간을 차지하는 작업으로 변합니다.
사용하려면 예를 들어 /usr/local/bin
. root.root( sudo chown root:root mountmyshare.sh
) 및 실행 파일( ) 이 있는지 확인하세요 chmod 755 mountmyshare.sh
. 넣지 않으려면 어디에나 넣을 수 있습니다. $PATH
왜냐하면 우리는 어쨌든 절대적이고 난공불락의 경로로 호출할 것이기 때문입니다.
그런 다음 상단에서 /etc/rc.local
:
/usr/local/bin/mountmyshare.sh &
이는 &
매우 중요합니다. 거기에 문제를 일으킬 수 있는 다른 것이 있을 경우를 대비해 "맨 위에 올려 놓으세요"라고 말했습니다. 이것은 다른 것을 망치지 않을 것입니다.
이것은 레거시 메커니즘 이지만 /etc/rc.local
내가 아는 한 모든 정상적인 Linux 시스템에서는 부팅 시퀀스가 끝날 때 여전히 실행됩니다.