개요
chattr 명령어는 리눅스 第二확장 파일시스템(E2FS)에서만 사용 가능한 특수 파일 속성을 수정하는 도구이다. 이 명령어를 통해 파일의 다양한 특성을 제어할 수 있으며, 보안과 성능 측면에서 유용하게 활용된다.
명령어 형식
chattr [-RVf] [-v version] [mode] files...
기호 모드(Symbolic Mode)
속성 지정에는 세 가지 연산자를 사용한다:
- + : 선택한 속성 추가
- - : 선택한 속성 제거
- = : 파일의 고유 속성으로 지정
사용 가능한 속성 문자는 aAcCdDeijsStTu이며, 각각 다음과 같은 의미를 가진다:
- a (append only): 추가 전용 모드만 허용
- A (no atime): 접근 시간(atime) 업데이트 비활성화
- c (compressed): 커널 레벨 자동 압축
- C (no copy-on-write): 쓰기 시 복사(CoW) 비활성화
- d (no dump): dump 도구 백업 제외
- D (sync dir): 디렉토리 변경 시 동기 쓰기
- e (extent format): 확장 영역 사용 표시
- i (immutable): 불변 파일 (변경/삭제 불가)
- j (data journal): 데이터 저널링
- s (secure delete): 안전한 삭제 (영역 제로화)
- S (sync file): 파일 변경 시 동기 쓰기
- t (no tail merge):尾部 병합 지원 안 함
- T (top of hierarchy): 디렉토리 계층 구조顶端 표시
- u (undeletable): 삭제 시 데이터 보존
읽기 전용 속성
다음 속성들은 lsattr(1)로 조회만 가능하며 chattr로 수정할 수 없다:
- E: 압축 오류 표시
- h: 대용량 파일 (2TB 이상)
- l (indexed): 인덱스 디렉토리
- N: inode 내 inline 데이터
- X: 압축 데이터 직접 접근 가능
- : 압축된 더러운(dirty) 파일
명령어 옵션
| 옵션 | 설명 |
|---|---|
| -R | 하위 디렉토리까지 재귀적으로 속성 적용 |
| -V | 상세 출력模式 및 버전 정보 표시 |
| -f | 대부분 오류 메시지 표시 안 함 |
| -v version | 파일 시스템 버전 설정 |
주요 속성 상세설명
불변 속성 (i)
i 속성이 설정된 파일은 어떤 사용자도 수정할 수 없다. 파일 삭제, 이름 변경, 링크 생성, 데이터 쓰기가 모두 금지된다. 이 속성을 설정하거나 해제하려면 루트 권한 또는 CAP_LINUX_IMMUTABLE 기능이 필요하다.
접근 시간 비활성화 (A)
A 속성이 설정된 파일에 접근할 때 atime이 업데이트되지 않는다. 노트북 환경에서 불필요한 디스크 I/O를 줄이는데 효과적이다.
자동 압축 (c)
c 속성이 설정된 파일은 커널이 자동으로 압축하여 디스크에 저장한다. 읽을 때는 압축 해제된 데이터를 반환하고, 쓸 때는 압축 후 저장한다.
쓰기 시 복사 비활성화 (C)
copy-on-write 파일시스템에서 C 속성이 설정된 파일은 CoW 동작의 영향을 받지 않는다. btrfs 파일시스템에서 새로운 파일이나 빈 파일에 설정해야 한다. 디렉토리에 설정하면 해당 디렉토리에서 생성되는 새 파일이 No_COW 특성을 갖는다.
저널링 (j)
파일시스템이 data=ordered 또는 data=writeback 옵션으로 마운트된 경우, j 속성이 설정된 파일은 파일 데이터 자체를 쓰기 전에 ext3/ext4 저널에 먼저 기록한다. data=journal 옵션 사용 시에는 이미 모든 데이터가 저널링되므로 이 속성이 의미 없다. 설정/해제에는 CAP_SYS_RESOURCE 기능이 필요하다.
동기 쓰기 (S)
S 속성이 설정된 파일이 수정되면 변경 사항이 즉시 디스크에 동기 기록된다. 파일 단위의 sync 마운트 옵션과 동일하다.
안전한 삭제 (s)
s 속성이 설정된 파일이 삭제되면 해당 디스크 블록이 제로(0)로 덮어씌워진다.
복원 가능한 삭제 (u)
u 속성이 설정된 파일이 삭제되어도 파일 내용이 보존되어 복원이 가능하다.
디렉토리 계층 구조顶端 (T)
T 속성이 설정된 디렉토리는 Orlov 블록 할당자에게 해당 디렉토리가 계층 구조의 맨 상단에 위치함을 알려준다. /home 디렉토리에 설정하면 john과 mary 디렉토리가 별도의 블록 그룹에 배치되어 불필요한 디스크 섹터 접근을 줄일 수 있다.
제한사항
- 현재主流 커널의 ext2, ext3, ext4文件系统는 c, s, u 속성을 지원하지 않음
- j 옵션은 ext3/ext4 파일시스템에서만 유효
- D 옵션은 리눅스 커널 2.5.19 이상에서만 사용 가능
- 모든 파일시스템이 모든 속성을 지원하는 것은 아님 (btrfs, ext4, xfs 매뉴얼 참조)
사용 예시
예제 1: 삭제 불가능한 파일 생성
# 테스트 파일 생성
[root@server ~]# touch /tmp/testfile
# 파일 속성 확인
[root@server ~]# lsattr /tmp/testfile
---------------- /tmp/testfile
# 불변 속성 추가 (누구도 삭제 불가)
[root@server ~]# chattr +i /tmp/testfile
# 속성 변경 확인
[root@server ~]# lsattr /tmp/testfile
----i----------- /tmp/testfile
# 삭제 시도 (실패)
[root@server ~]# rm -f /tmp/testfile
rm: cannot remove '/tmp/testfile': Operation not permitted
예제 2: 불변 속성 해제 후 삭제
# 속성 제거
[root@server ~]# chattr -i /tmp/testfile
# 확인
[root@server ~]# lsattr /tmp/testfile
---------------- /tmp/testfile
# 파일 삭제
[root@server ~]# rm /tmp/testfile
removed '/tmp/testfile'
예제 3: 추가 전용 파일 생성
# 로그 파일에 추가 전용 속성 설정
[root@server ~]# touch /var/log/important.log
[root@server ~]# chattr +a /var/log/important.log
# 확인
[root@server ~]# lsattr /var/log/important.log
-----a---------- /var/log/important.log
예제 4: 디렉토리 전체에 재귀적 적용
# 특정 디렉토리 내 모든 파일에 불변 속성 적용
[root@server ~]# chattr -R +i /secure/data/
# 확인
[root@server ~]# lsattr -R /secure/data/
관련 명령어
파일시스템 속성 조회에는 lsattr 명령어를 사용한다:
lsattr [-RVadv] [files]
| 옵션 | 설명 |
|---|---|
| -R | 하위 디렉토리 재귀 조회 |
| -V | 버전 정보 표시 |
| -a | .으로 시작하는 숨김 파일 포함 조회 |
| -d | 디렉토리 자체의 속성만 표시 |
| -v | 파일 버전 표시 |
결론
chattr 명령어는 리눅스 파일시스템의 고급 속성을控制하여 보안과 데이터 무결성을 강화할 수 있는 강력한 도구이다. 특히 immutable 속성은 중요한 파일을 실수나 외부 공격으로부터 보호하는 데 유용하게 활용된다.