본문 바로가기

라즈베리파이

webdav 이용, 네트워크 드라이브 연결 3 - 권한 문제 해결

"ugeek/webdav" 이미지는 PUID 및 PGID 환경변수 설정을 인식하지 않는다. 따라서 webdav를 이용하여 파일을 생성할 경우 자잘한 권한 문제가 발생한다.

 

윈도우즈 PC에서 그냥 볼때는 아무런 차이가 없어 보이지만 리눅스 입장에서 볼 경우 SMB로 생성한 파일과 WebDAV로 생성한 파일의 소유주가 다르다는 문제가 있다. 물론, 사용에 지장이 없다면 그냥 사용해도 무방하다.

 

1. 문제점 파악

우선 라즈베리파이에 SMB 공유 폴더로 접속하여 파일 및 폴더를 하나씩 생성해 보았다.

 

이번에는 WebDAV로 접속하여 동일하게 파일 및 폴더를 생성하였다. 참고로 WebDAV를 https 프로토콜을 이용하여 원격 드라이브로 연결할 경우 파일명 변경이 안되는 현상이 발생할 수 있다. 이에 대한 해결 방법은 추후 포스팅 하겠다.

 

이제 SSH로 라즈베리파이에 접속하여 생성된 폴더 및 파일을 비교해 보도록 하겠다.

아래 그림에서 볼 수 있드시 SMB로 접속해 만든 폴더 및 파일은 nobody 사용자 권한인데 반하여, WebDAV에서 만든 폴더 및 파일은 www-data 사용자 권한이다.

 

2. 문제 해결하기

보통 이러한 권한 문제는 docker 컨테이너 생성시 PUID, PGID 환경변수 설정을 통해 해결할 수 있다. 그러나, 맨 처음에 얘기 했드시 "ugeek/webdav" 이미지는 PUID 및 PGID 환경변수 설정을 인식하지 못한다.

 

이럴 경우 해결 방법은 두가지로 생각해 볼 수 있다.

  1. 프로그램 실행 권한 변경, 여기서는 nginx 실행권한 변경
  2. www-data의 UID 번호를 nobody로 변경, 즉 www-data와 nobody가 같은 놈으로 인식하게끔 만드는 방법

원래 1번, 2번 둘다 동작해야 하나, 이 이미지에서 nginx를 nobody 권한으로 동작시키면 제대로 작동하지 않는다. 

따라서, 이 이미지에서는 /etc/passwd 파일을 변경하는 방법을 써야 한다.

 

근데 또하나의 문제가 있다. 이 컨테이너 이미지의 경우 vi나 nano와 같은 문서 편집기를 제공하지 않는다. 하여튼, 컨테이너 내부의 파일에 접근해야 하므로 WebDAV 컨테이너의 쉘로 접근한다. 그리고 아래 명령처럼 /etc/passwd 파일을 외장 HDD의 특정 폴더로 복사하도록 한다.

 

참고로 컨테이너의 /media 폴더는 외장 HDD 루트로 연결되어 있다.

 

이제 라즈베리파이 SMB로 접속하여 외장 HDD의 web 폴더로 이동하면 복사된 passwd 파일을 찾을 수 있다.

 

문서 편집기를 이용하여 www-data의 숫자값을 33에서 65534로 변경해 준다. 여기서 65534는 nobody의 UID값이다.

혹시 passwd 파일 구조에 대해 궁금하다면 https://www.codesarang.com/45에 간단히 정리해 놓았으니 방문해 보길 바란다.

 

파일의 권한(root 사용자) 문제로 저장이 불가능 하므로, 다른 파일명(여기서는 passwd2)으로 저장한다. 그리고 컨테이너의 쉘로 다시 돌아가 저장된 passwd2파일을 /etc/passwd 파일로 복사한다.

 

복사가 완료 되었다면 다시 컨테이너 리스트로 돌아가 WebDAV 컨테이너를 재시작 시켜준다.

 

3. 결과 확인

이제 다시 WebDAV로 접속, 새로운 파일을 만들어 보았다.

 

그리고 SSH로 접속하여 만들어진 파일의 권한을 보면 www-data가 아닌 nobody로 바뀐것을 확인할 수 있다.