컴퓨터에 로그인하면 구글 드라이브와 MS 원드라이브가 자동으로 마운트되도록 하였는데 어디서 이 방법을 알아냈는지 찾아보려고 하니까 찾을 수가 없다. 작년 3월 즈음 Rclone과 이 방법에 대해서 블로그 글을 쓰다가 귀찮아서 그만 두었는데 아마도 내가 이것저것 찾아보고 조합해 낸 방법인 것 같다.

이 방법이 지원하는 클라우드 저장소는 Rclone에서 지원하는 어떤 것도 될 것이다. 내가 쓰는 것은 Google Drive, MS OneDrive, Dropbox, pCloud, Mega, Box, Google Photos, AWS S3 등이다. Mega에 대해서는 Rclone이 문제가 있고 2단계 인증을 지원하지 않아서 MEGAcmd라는 툴을 써서 WebDAV 로컬 서버를 만들고 우회 접속하는 방법을 쓴다. 이것은 GitHub:rclone#3393의 한 댓글에 설명되어 있다.

먼저 pam_mount가 필요하다. 로그인할 때 자동적으로 마운트해 주는 PAM 모듈이다. 이것의 설정은 /etc/security/pam_mount.conf.xml에 하는데 사용자별 설정을 읽게 해서 볼륨 설정은 사용자 홈의 ~/.pam_mount.conf.xml에서 한다.

/etc/security/pam_mount.conf.xml은 다음과 같다.

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
<!--
	See pam_mount.conf(5) for a description.
-->

<pam_mount>

		<!-- debug should come before everything else,
		since this file is still processed in a single pass
		from top-to-bottom -->

<debug enable="0" />

		<!-- Volume definitions -->


		<!-- pam_mount parameters: General tunables -->

<luserconf name=".pam_mount.conf.xml" />

<!-- Note that commenting out mntoptions will give you the defaults.
     You will need to explicitly initialize it with the empty string
     to reset the defaults to nothing. -->
<mntoptions allow="nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other" />
<!--
<mntoptions deny="suid,dev" />
<mntoptions allow="*" />
<mntoptions deny="*" />
-->
<mntoptions require="nosuid,nodev" />

<!-- requires ofl from hxtools to be present -->
<logout wait="0" hup="no" term="no" kill="no" />


		<!-- pam_mount parameters: Volume-related -->

<mkmountpoint enable="1" remove="true" />


</pam_mount>

그리고 로그인할 때 pam_mount가 작동하도록 PAM을 설정한다. pam_mount ArchWiki에 설명된 것과 같이 /etc/pam.d/system-login을 고치면 되는데 나는 auth include system-authauth optional pam_mount.so의 순서를 바꿨다. 아마도 중요한 문제는 아니고 미관상의 문제로 그랬던 것 같다. ArchWiki에 있는대로 하면 로그인 부분에 pam_mount라는 글자가 박혔던 것 같다. 내 /etc/pam.d/system-login 이다.

#%PAM-1.0

auth       required   pam_tally2.so        onerr=succeed file=/var/log/tallylog
auth       required   pam_shells.so
auth       requisite  pam_nologin.so
#auth       optional   pam_mount.so
auth       include    system-auth
auth       optional   pam_mount.so

account    required   pam_tally2.so
account    required   pam_access.so
account    required   pam_nologin.so
account    include    system-auth

password   optional   pam_mount.so
password   include    system-auth

session    optional   pam_loginuid.so
session    optional   pam_keyinit.so       force revoke
session [success=1 default=ignore] pam_succeed_if.so service = systemd-user quiet
session    optional   pam_mount.so
session    include    system-auth
session    optional   pam_motd.so          motd=/etc/motd
session    optional   pam_mail.so          dir=/var/spool/mail standard quiet
-session   optional   pam_systemd.so
session    required   pam_env.so

이렇게 하여 사용자가 로그인하면 pam_mount가 작동하게 되었다. 그런데 아직 볼륨을 넣어 주지 않았기 때문에 아무것도 마운트되지 않는다. 마운트할 거리를 만들자. Google Drive, MS OneDrive나 다 비슷한 방법으로 Rclone을 설정할 수 있다. Rclone은 상당히 많은 클라우드 저장소를 지원하는 동기화 프로그램이다. 마운트할 클라우드 저장소 각각에 대해서 rclone config 명령을 치고 프로그램이 물어 보는대로 답하고 상호작용을 하여 웹브라우저에서 클라우드 서비스에 로그인하고 인증 과정을 거치면 rclone이 이 설정을 저장한다. 신경 쓸 부분은 클라우드 저장소에게 붙여 주는 이름이다. 이 이름을 나중에 프로토콜 이름처럼 사용하는데 적당한 이름을 주면 된다. Google Drive라면 gdrive와 같이 주면 된다.

그런 다음 ~/.pam_mount.conf.xml 파일을 만들어서 볼륨을 설정할 것인데 ArchWiki에 설명된 것처럼 <fusemount></fusemount>를 써서 마운트 명령을 변경하는 것이 사용자 설정에서는 허용되지 않는다고 한다. 난 이 방법을 애초에 시도도 안 해 보았다가 이번에 해 보니 그렇다고 하면서 안 된다.

내가 한 방법은 rclone-mount 스크립트를 만들고 volume 태그의 pathrclone-mount#gdrive:와 같이 설정하는 것이다. FUSE는 원천(소스의 우리말)의 # 앞에 있는 것을 마운트 명령으로 인식하기 때문이다. 그래서 꼭 pam_mount가 아니라도 /etc/fstab에 원천을 rclone-mount#gdrive:과 같이 넣어서 마운트를 설정할 수도 있다. # 뒤의 것은 아까 rclone config할 때 주었던 클라우드 저장소에 대해서 주었던 이름과 콜론(:)이다.

rclone-mount 스크립트를 다음과 같이 만들어 실행권한을 주고 PATH 환경변수에 포함되어 있는 디렉토리 한 곳에 넣어서 rclone-mount를 실행시킬 수 있게 하자. 나는 /usr/local/bin에 넣었다.

#!/bin/bash

/usr/bin/rclone mount "$1" "$2" --vfs-cache-mode full --daemon

이제 마구마구 Rclone에 클라우드 저장소를 등록하고 ~/.pam_mount.conf.xml 파일을 만들자. 다음과 같은 모습이다.

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">

<pam_mount>

<volume fstype="fuse" path="rclone-mount#onedrive:" mountpoint="~/OneDrive" options="nosuid,nodev" />
<volume fstype="fuse" path="rclone-mount#gdrive:" mountpoint="~/GoogleDrive" options="nosuid,nodev" />
<volume fstype="fuse" path="rclone-mount#gphoto:" mountpoint="~/GooglePhotos" options="nosuid,nodev" />
<volume fstype="fuse" path="rclone-mount#aws-s3:" mountpoint="~/AWS-S3" options="nosuid,nodev" />
<volume fstype="fuse" path="rclone-mount#box:" mountpoint="~/Box" options="nosuid,nodev" />
<volume fstype="fuse" path="rclone-mount#pcloud:" mountpoint="~/PCloud" options="nosuid,nodev" />
<volume fstype="fuse" path="rclone-mount#dropbox:" mountpoint="~/Dropbox-RClone" options="nosuid,nodev" />
<volume fstype="fuse" path="rclone-mount#megawebdav:" mountpoint="~/MegaWebDAV" options="nosuid,nodev" />

</pam_mount>

마운트 위치로 설정된 디렉토리들은 미리 만들 필요가 없다. 로그인하면 마운트하면서 자동으로 만들어지고 로그아웃하면 지워진다.

앞에서 언급하였듯이 Mega는 MEGAcmd로 우회하였는데 이 프로그램 패키지를 설치하고 아까 그 Rclone 이슈의 댓글을 따라서 mega-cmd 명령을 실행해서 WebDAV 세션을 한번 만들면 mega-cmd를 빠져 나가도 나중에 mega-cmd를 다시 실행시키면 WebDAV가 다시 만들어진다. 그러므로 우리는 pam_mount가 실행되기 전에 mega-cmd가 실행되도록 만들어 주면 된다. 실제로는 mega-cmd가 아니라 mega-cmd-server를 실행시켜 줄 것이다.

이를 위해서 세 가지 방법을 시도해 보았는데 두 가지 방법은 만족스럽지 못했다. 첫번째 방법으로 rclone-mount 스크립트처럼 rclone-mount-megawebdav 스크립트를 만들어서 rclone mount 명령줄 앞에 mega-cmd-server &를 넣어 보았는데 한참을 뜸을 들이더니 로그인이 실패한다. 하지만 mega-cmd-server가 실행되고 마운트는 되는 듯 보인다. 그래서 다시 로그인을 시도하면 로그인이 된다.

다른 방법은 ~/.config/autostart 디렉토리에 자동시작 프로그램으로 mega-cmd-server를 등록하는 것이다. 그런데 이렇게 하면 mega-cmd-server의 실행이 늦어져서 로그인도 좀 지연되고 Gnome shell에서 컴퓨터의 모든 파티션이 나열된다. 루트 파티션이나 EFI 파티션 같은 것이 보이는 것이다. Gnome shell을 재시작해 주면 원상복구가 되긴 하지만 좋지 않다. Gnome shell이 아니라면 크게 문제가 없을 것 같다.

마지막 방법으로 다음과 같이 mega-cmd-server.service를 만들어서 ~/.config/systemd/user/ 디렉토리에 두고 systemctl --user enable mega-cmd-server.service를 실행해서 서비스를 등록해 주었다. 그랬더니 문제없이 잘 된다.

[Unit]
Description=MegaCMD server

[Service]
Type=oneshot
ExecStart=/usr/bin/mega-cmd-server

[Install]
WantedBy=default.target

나머지 클라우드 저장소를 Rclone에 등록하는 방법은 Rclone 사이트의 문서에 자세히 나와 있으니 그걸 보면 될 것이다.

인터넷이 안 될 때 어떻게 될까? 로그인이 한참 걸리고 Gnome shell이 보이지 않아야 할 파티션들을 나열해 주게 될 것이다. 인터넷이 안 될 때를 대비해서 pam_mount를 끄는 방법이 없을까? 이것은 우리의 과제로 남았다.

다 등록해 버릴 거야!