NAS 공유폴더를 리눅스에 붙이려고 검색하면 대부분 이렇게 나옵니다.
sudo apt install cifs-utils
sudo mount -t cifs //서버/공유 /mnt/nas -o ...
그런데 sudo를 쓸 수 없는 상황이 있습니다. 비밀번호를 모르거나, 권한을 안 받았거나,
저처럼 비대화형 셸이라 암호를 입력할 수가 없을 때입니다.
sudo: 암호를 읽으려면 터미널이 필요합니다여기서 막혀서 한참 헤맸는데, 데스크탑 환경이면 sudo 없이도 됩니다.
애초에 SSH로 파일을 보내려다 막혀서 SMB로 돌아선 상황이었습니다.
NAS에 일반 계정을 하나 만들어 ssh 로 붙으려니 비밀번호가 맞는데도 거부당했습니다.
알고 보니 그 NAS는 관리자 그룹 계정만 SSH 로그인을 허용하는 설정이었습니다.
권한을 나눠 쓰려고 만든 계정이었으니 관리자 그룹에 넣을 수는 없었고,
파일만 주고받으면 되니 SMB가 맞는 선택이었습니다.
결론부터 — 방법이 두 갈래입니다
GVFS (gio mount) |
커널 CIFS (mount -t cifs) |
|
|---|---|---|
| 권한 | 일반 사용자 | root 필요 |
| 설치 | 데스크탑이면 이미 있음 | cifs-utils 설치 필요 |
| 마운트 위치 | /run/user/$UID/gvfs/... |
아무 경로 |
| 보이는 범위 | 그 사용자 세션만 | 시스템 전체 |
| 성능 | FUSE 경유라 느림 | 빠름 |
| 부팅 시 자동 | 불가 | /etc/fstab 가능 |
사람이 쓰는 데스크탑에서 파일을 주고받는 거라면 GVFS가 맞습니다.
서버나 cron, 도커 바인드마운트처럼 세션과 무관해야 하면 커널 CIFS를 써야 합니다.
서버 쪽에서 먼저 확인할 것
클라이언트를 만지기 전에 두 가지는 맞춰져 있어야 합니다.
- SMB 서비스가 켜져 있는지 — NAS 설정에서 파일 공유 프로토콜로 SMB를 활성화합니다
- 그 계정이 그 공유폴더에 읽기/쓰기 권한이 있는지 — 계정이 있어도 폴더 권한이 따로입니다
445 포트가 열려 있는지는 이렇게 봅니다.
timeout 3 bash -c 'echo > /dev/tcp/192.0.2.10/445' && echo 열림 || echo 닫힘
전제 조건 3가지만 확인합니다
command -v gio # GVFS 클라이언트
ls /usr/lib/gvfs/gvfsd-smb # SMB 백엔드
echo $DBUS_SESSION_BUS_ADDRESS # 세션 D-Bus
세 번째가 핵심입니다. gio는 직접 마운트하는 게 아니라 데몬에게 D-Bus로 부탁하는 구조입니다.
그래서 세션 D-Bus가 없는 순수 SSH 접속이나 cron에서는 설치돼 있어도 동작하지 않습니다.
이 경우엔 방법이 없고 커널 CIFS로 가야 합니다.
붙이기
printf '%s\n%s\n%s\n' '계정명' 'WORKGROUP' '비밀번호' \
| gio mount 'smb://192.0.2.10/공유폴더'
대화형으로 쓰면 사용자·도메인·비밀번호를 순서대로 묻습니다. 스크립트로 넘길 때는 위처럼
stdin에 파이프로 넣습니다.
비밀번호를 명령줄 인자로 주지 않는 게 요점입니다. 인자로 쓰면 ps에 그대로 보입니다.
파이프로 넣으면 프로세스 목록에 남지 않습니다.
쓰기
gio mount -l | grep smb # 마운트 확인
ls "/run/user/$(id -u)/gvfs/"
# → smb-share:server=192.0.2.10,share=공유폴더
M="/run/user/$(id -u)/gvfs/smb-share:server=192.0.2.10,share=공유폴더"
cp ./파일 "$M/" # 일반 명령 그대로
gio mount -u 'smb://192.0.2.10/공유폴더' # 해제
경로에 : 와 , 가 들어갑니다. 반드시 따옴표로 감싸세요. 안 그러면 셸이 쪼갭니다.
마운트 위치가 /run/user/$(id -u)/ 아래라는 건 그 사용자 세션에만 존재한다는 뜻입니다.
로그아웃하면 사라지고, 다른 사용자나 시스템 서비스는 이 경로를 볼 수 없습니다.
재부팅 후에도 다시 붙여야 합니다. 그게 이 방식의 한계입니다.
큰 파일에서 만난 함정
934MB 파일을 보내고 해시를 대조하려는데 이런 게 나왔습니다.
sha256sum "$M/big.tar"
# sha256sum: ...: 부적절한 인수 (Invalid argument)
파일이 깨진 줄 알고 다시 보냈는데 또 같은 에러였습니다.
파일 문제가 아니라 FUSE 경유 읽기 방식 문제입니다. cat 파이프로 읽으면 통과합니다.
cat "$M/big.tar" | sha256sum # 정상 동작
큰 파일을 자주 다룰 거면 애초에 커널 CIFS를 쓰는 게 낫습니다.
그리고 크기가 맞는 건 검증이 아닙니다. 전송이 중간에 잘려도 크기는 맞을 수 있습니다.
보낼 때 해시를 같이 올려두면 받는 쪽에서 언제든 대조할 수 있습니다.
sha256sum big.tar > big.tar.sha256 # 데이터와 같은 폴더에 함께 둔다
커널 CIFS를 쓸 때 — fstab 한 줄 주의
root를 쓸 수 있고 부팅 시 자동 마운트가 필요하면 이쪽입니다.
sudo tee /etc/.nas-cred >/dev/null <<'CRED'
username=계정명
password=비밀번호
CRED
sudo chmod 600 /etc/.nas-cred
sudo mount -t cifs //192.0.2.10/공유폴더 /mnt/nas \
-o credentials=/etc/.nas-cred,uid=$(id -u),gid=$(id -g),iocharset=utf8
uid=/gid= 를 빼면 마운트된 파일이 전부 root 소유로 보여 일반 사용자가 쓸 수 없습니다.
/etc/fstab에 넣을 때는 nofail과 _netdev를 반드시 넣으세요.
//192.0.2.10/공유폴더 /mnt/nas cifs credentials=/etc/.nas-cred,uid=1000,iocharset=utf8,nofail,_netdev 0 0빠뜨리면 서버가 꺼져 있을 때 부팅이 멈춰 복구 콘솔로 떨어집니다. 원격 서버에서는 특히 위험합니다.
정리
- 데스크탑에서 파일만 주고받는다면
gio mount,sudo불필요 sudo가 막혔다고 포기하기 전에 GVFS가 있는지 먼저 확인- GVFS는 세션 D-Bus가 전제입니다. SSH·cron에서는 안 됩니다
- 큰 파일 해시는
cat파이프로.Invalid argument는 손상이 아닙니다 - fstab에 넣을 때
nofail,_netdev를 빠뜨리지 마세요