본문 바로가기

개발

파일 옮길 땐 tar를 쓰자

수정 내역

24.11.20 rsync로 대규모 파일 이관 레퍼런스 추가

24.11.22 심볼릭 링크 아카이빙 케이스 및 재발시, 사전에 수행할 명령어 추가

문제 상황

개발 서버에 디비 구조가 변경된 코드를 배포하다

스크립트 이슈로 다른 팀이 사용 중인 서버에도 배포됐다.

실제 사용자들이 쓰는 서비스는 아니어서 문제가 발생한다는 걸 뒤늦게 알았지만, 어쨌든 수습은 해야 했다.

잘못 배포된 서버에 운영 서버에 있는 jar와 다른 파일들을 옮기는 과정에서 새로 알게 된 내용을 정리했다.

구성도

tar를 쓰는 이유

파일의 inode를 유지하기 위해서다.

단순히 파일을 복사하면 수정 시간이 현재 시간으로 변경되고, 권한도 초기화된다.

실행 파일의 경우 접근 권한 x가 사라지고 다른 파일들의 경우 수정 날짜가 원본과 다르기 때문에

누가 수정했을 것이란 착각을 줄 수 있다.

 

따라서, 서버 간 파일 전송을 한다면 tar 아카이빙을 통해 파일 정보를 유지한 상태로 복사해야 한다.

 

11시 19분 22시 59분에 생성된 755 권한의 runnable.sh를 다음 3가지 경우로 나눠 다른 서버로 복사했다.

  1. 파일 그대로 복사

  2. tar로 아카이빙 후 복사

  3. tar.gz로 아키이빙 및 압축 후 복사

초기 구성

원본이 될 runnable.sh

1. 파일 그대로 복사

runnable.sh의 권한이 644로 되고, 수정 시간도 23시 07분으로 변경됐다.

권한과 수정 시간 모두 변경됐다.

 

2. tar로 아카이빙 후 복사

권한 755와 수정 시간 22시 59분이 그대로 유지됐다.

권한과 수정 시간이 유지됨

3. tar.gz로 아키이빙 및 압축 후 복사

마찬가지로 권한과 수정 시간이 유지됐다.

마찬가지로 권한과 수정 시간이 유지됨

rsync 안 씀?

rsync -a를 쓰면 파일의 메타데이터까지 보존되기 때문에 이걸로 해결할 수 있었다.

하지만, 폐쇄망이나 독립망을 사용하는 프로젝트의 경우 rsync를 사용할 수 없기 때문에

tar를 사용해 파일을 복사하는 경험을 할 필요가 있었다.

심볼릭 링크는 어떻게 처리될까?

옮기려는 파일이 디렉토리고, 그 안에 심볼릭 링크 파일이 있는 경우 어떻게 될지 궁금해 다음과 같이 테스트 환경을 만들었다.

결론부터 말하면 심볼릭 링크가 가리키는 경로에 파일이 있다면 실행한다.

greet.sh를 가리키는 symbolic 파일을 복사

 

1. 두 서버에 서로 다른 echo를 출력하는 greet.sh를 만들었다.

두 서버 모두 동일한 위치에 다른 내용을 출력하는 greet.sh 생성

 

2. 서버 A에서 greet.sh를 가리키는 심볼릭 파일 greet_symbolic을 만들었다.

서버 A에 greet.sh와 연결된 심볼릭 파일 생성

 

3. greet_symbolic 파일을 서버 B로 옮긴 후, 실행시킨 결과, 가리키는 파일을 실행했다.

서버 B에 greet_symbolic 심볼릭 파일을 tar로 옮긴 결과

 

당연하지만, 심볼릭 파일을 tar 아카이빙 없이 복사하면 권한이 초기화된다.

그냥 복사하면 권한과 수정 시간이 변경된다.

하드링크는?

현재는 잘 몰라서 건너뛴다.

하드 링크가 무엇이고, 왜 쓰는지는 알고 있지만 심볼릭 링크와는 달리 사용해 본 케이스가 없다.

그래서 어떤 경우를 보여줘야 할지 모르겠고, 억지로 만들다 아는척하게 될 것 같았다.

언제가 될진 모르겠지만 나중에 관련 경험을 하면 정리할 것이다.

이런 상황이 다시 생긴다면 어떻게 할까

가장 먼저 실행 파일과 심볼릭 링크 파일을 찾아볼 것이다.

실행 파일의 경우, 설치 과정에서 권한 문제가 발생할 것이고

심볼릭 링크의 경우, 우연히 해당 위치에 실행 가능한 파일이 있어 의도치 않은 행위를 할 것이기 때문이다.

 

다음 명령어를 통해 실행 가능한 파일과 심볼릭 링크를 찾을 것이다.

# 현재 위치에서 심볼릭 링크 파일들을 출력
find . -type l

# 현재 위치에서 심볼릭 링크 개수 출력
find . -type l | wc -l



# 현재 위치에서 실행 가능한 파일들을 출력
find . -type f -executable

# 현재 위치에서 실행 가능한 파일 개수 출력
find . -type f -executable | wc -l

 

당연하지만, x 권한이 없거나 심볼릭 링크가 깨졌다면 저 명령어의 결과에 집계되지 않는다.

 

함께 보면 좋은 글

대규모 데이터를 이전하는 상황에선 tar나 rsync를 어떻게 사용할지 궁금했다.

rsync를 어떻게 효율적으로 썼는지에 대한 좋은 레퍼런스가 있어 공유한다.

https://okms1017.tistory.com/28

 

[Migration] Rsync를 이용한 대용량 데이터 마이그레이션

✍ Posted by Immersive Builder Seong 1. 시작하며 고객사 클라우드 전환 사업을 수행하면서 정보시스템별로 최소 GB 단위에서 시작하여 최대 TB 단위에 이르는 대용량 파일 데이터(텍스트, 이미지, 영상,

okms1017.tistory.com

 

코어 여러 개를 사용할 뿐만 아니라 로그까지 남기기 때문에, 정밀하고 신속한 작업이 필요한 상황에선 큰 도움이 될 것이다.

'개발' 카테고리의 다른 글

ArrayBuffer, Blob  (0) 2024.11.09
단위 테스트 적용하기  (0) 2024.10.26
[Java] p6spy 긴 바인딩 로그 치환하기  (0) 2024.09.04
[python] pandas csv 분할 중 .0 .1 문제  (0) 2024.08.29
proxyBeanMethods=false를 써야 하는지  (0) 2024.07.21