개요
제목이 좀 직관적이지 않네요 ㅎ_ㅎ...
리눅스로 네트워크 저장소(SMB, NFS 등)을 부팅 시 마운트하기 위해서는 보통 /etc/fstab을 사용합니다. 그러나 이 방법으로는 구글 드라이브, Baidu 등의 클라우드 같은 저장소를 연결하긴 어렵습니다. 그래서 이에 대한 대안으로 Rclone이 많이 사용되고 있죠.
그런데, Rclone은 /etc/fstab을 이용할 수 없고 Systemd를 통해 부팅 시 자동 마운트가 되도록 구성해도 도커 컨테이너의 실행이 더 빨라서 많은 불편함을 겪었습니다.
구체적인 예로, 저는 Teldrive와 AList를 함께 활용중입니다. Teldrive에 파일을 업로드하고 rclone mount로 로컬에 마운트한 뒤, 해당 경로를 AList에서 볼륨으로 사용하는 것을 통해 간편하게 파일 공유를 할 수 있도록 구성하고 있죠. 그런데, VM을 재부팅하고 나면 AList 컨테이너는 자동으로 실행되지만, Rclone 마운트는 자동으로 이루어지지 않았죠. 별 수 없이 Shell에 접속해 컨테이너를 내리고 rclone mount를 수행한 뒤 다시 AList를 실행시키는 과정을 밟아줘야 했습니다.
그래서, 우분투 재부팅 이후에도 자동으로 Rclone 마운트가 이루어지고, 마운트가 완료되는 것을 기다린 후에 AList가 실행되도록 하고 싶어서 여러가지 검색해 보다가 찾게 된 방법을 포스팅하려고 합니다.
Rclone 부팅 시 자동 마운트하기
우선, Rclone으로 저장소를 마운트할 스크립트는 있어야 합니다. 보통 긴 명령어를 매번 입력할 수 없어 간편하게 스크립트로 만들어 두는 편이니, 해당 스크립트를 사용하면 됩니다. 아래 예시는 제가 사용하는 스크립트로, 얼마전에 구축글을 올렸던 Teldrive를 마운트하는 스크립트입니다.
마운트 / 언마운트용 스크립트를 따로 작성했고, 예시경로는 각 스크립트 아래에 적혀있습니다.
- /home/ubuntu/script/tdmount.sh
#! /bin/bash
rclone mount teldrive: /mnt/teldrive/ \
--allow-other \
--allow-non-empty \
--buffer-size 4G \
--timeout 5s \
--stats 1m \
--poll-interval 60m \
--drive-chunk-size 16M \
--dir-cache-time 5m \
--buffer-size 32M \
--cache-dir /docker/teldrive/cache \
--vfs-cache-mode full \
--vfs-read-chunk-size 128M \
--vfs-read-chunk-size-limit 1G \
--vfs-cache-max-age 1h \
--vfs-cache-max-size 50G \
--transfers 20 \
--gid 0 \
--uid 0 \
--log-file=/docker/teldrive/tdmount.log \
--log-level NOTICE \
--daemon
- /home/ubuntu/script/tdmountexit.sh
#! /bin/bash
/bin/fusermount -u /mnt/teldrive
해당 스크립트를 부팅 시마다 실행하려면 systemd에 등록해야 합니다.
root로 전환 후 적당한 이름으로 하나 생성해 주겠습니다.
sudo -i
nano /etc/systemd/system/tdmount.service
그리고 아래 구문을 복사 붙여넣기 합니다.
- /etc/systemd/system/tdmount.service
[Unit]
Description=mount teldrive
After=docker.service
Requires=docker.service
StartLimitIntervalSec=0
[Service]
Type=forking
ExecStart=/bin/bash /home/ubuntu/script/tdmount.sh
ExecStop=/bin/bash /home/ubuntu/script/tdmountexit.sh
Restart=always
[Install]
WantedBy=multi-user.target
저장 후 쉘로 빠져나와 실행해 봅니다.
systemctl daemon-reload
systemctl start tdmount.service
마운트가 제대로 이루어졌는지 확인해 봅니다.
마운트가 확인되지 않는다면 아래 명령어를 이용해 오류 내역을 찾아야 합니다.
journalctl -xeu tdmount.service
마운트 되는 것을 확인했다면 언마운트도 제대로 이루어지는지 확인해 봅니다.
systemctl stop tdmount.service
df -h
정상적으로 작동하는 것을 확인했다면, enable을 통해 부팅 시마다 실행되도록 해 줍니다.
systemctl enable tdmount.service
마운트 이후 컨테이너 실행하기
글의 서두에서도 말했다시피, 제 목적은 리눅스 부팅 이후 Rclone이 Teldrive저장소를 마운트하고, 그 이후에야 해당 저장소를 사용할 컨테이너가 시작되는 것입니다.
그런데, 위 과정까지만 진행했다면, 부팅 시마다 Rclone이 Teldrive를 마운트해주긴 하지만, AList가 훨씬 더 먼저 실행되기 때문에 손이 한 번 갈 수 밖에 없죠.
방법은 사실 간단합니다. 마운트 이후 컨테이너를 실행하면 되죠.
먼저, 부팅 시에 자동으로 실행되지 않도록 docker compose의 restart 옵션을 on-failure로 변경해 줍니다.
services:
alist:
image: xhofe/alist:latest-ffmpeg
container_name: alist
...
restart: on-failure
이제 마운트용 스크립트 하단에 아래처럼 alist 컨테이너 실행 명령을 넣어 줄 겁니다.
- /home/ubuntu/script/tdmount.sh
#! /bin/bash
rclone mount teldrive: /mnt/teldrive/ \
--allow-other \
--allow-non-empty \
--buffer-size 4G \
--timeout 5s \
--stats 1m \
--poll-interval 60m \
--drive-chunk-size 16M \
--dir-cache-time 5m \
--buffer-size 32M \
--cache-dir /docker/teldrive/cache \
--vfs-cache-mode full \
--vfs-read-chunk-size 128M \
--vfs-read-chunk-size-limit 1G \
--vfs-cache-max-age 1h \
--vfs-cache-max-size 50G \
--transfers 20 \
--gid 0 \
--uid 0 \
--log-file=/docker/teldrive/tdmount.log \
--log-level NOTICE \
--daemon
/bin/bash -c 'docker start alist' &
이렇게 해주면, 리눅스 부팅 이후 Rclone이 Teldrive를 마운트하고, 순차적으로 AList를 실행하게 됩니다.
또, 언마운트 스크립트에서도 AList컨테이너를 종료하는 명령어를 넣어 주겠습니다. 아래처럼요.
- /home/ubuntu/script/tdmountexit.sh
#! /bin/bash
/bin/bash -c 'docker stop alist'
/bin/fusermount -u /mnt/teldrive
이렇게 구성해 두면, AList를 종료한 뒤 마운트를 해제하게 되겠죠.
마무리
별로 대단한 내용은 아니지만, 같은 고민을 하는 글을 인터넷에서 여럿 찾을 수 있었습니다. Rclone이 도커 이미지도 지원하고 있어서, 일반적인 상황에선 Rclone 도커 이미지를 같이 사용해 docker compose를 작성해 문제를 해결할 수 있습니다.
그렇지만, Teldrive는 공식 Rclone은 사용이 불가능하기 때문에 다른 방법을 찾다가 적용해보게 된 방법입니다.
관련 글
2025.01.23 - [Apps] - 다목적 웹 기반 파일 매니저 AList 구축하기
다목적 웹 기반 파일 매니저 AList 구축하기
개요FileBrowser, FileGator 등은 대표적인 웹 기반 파일 매니저입니다. 이러한 웹 기반 파일 매니저는 기기나 운영체제에 구애받지 않고 누구나 큰 제약 없이 접근하기 좋은 서비스입니다. 그 외에도
worklazy.net