사용자 정의 파일 크기 제한을 지원하는 파일 시스템이 있습니까?

사용자 정의 파일 크기 제한을 지원하는 파일 시스템이 있습니까?

EXT4에는 각 디렉토리의 최대 크기를 설정하는 max_dir_size_kb 마운트 옵션이 있다는 것을 알고 있습니다. 그러나 개별 파일의 최대 크기를 지정하는 유사한 옵션은 없습니다. 이 작업을 수행할 수 있는 다른 파일 시스템을 아는 사람이 있습니까? XFS, ZFS 및 ReiserFS를 확인했지만 이러한 파일 시스템에 대한 전문가는 아니지만 아무것도 찾지 못했습니다.

내가 달성하려는 목표에 대해 좀 더 구체적으로 설명하자면, Samba 공유에 저장할 수 있는 개별 파일의 크기를 제한하고 싶습니다(전체 할당량이 아닌 개별 파일, 예를 들어 사용자가 지정된 크기를 초과하는 파일을 저장하지 못하도록 방지). Samba에는 이 옵션이 없으며 Linux /etc/security/limits.conf는 Samba에서 작동하지 않습니다(참조:https://askubuntu.com/questions/1315369/is-obey-pam-restrictions-still-supposed-to-work-in-samba-4-ubuntu-20-04, 대답은 다음과 같습니다. Samba 개발자는 /etc/security/limits.conf에 설정된 파일 크기 제한이 적용되지 않는다고 설명합니다.

그래서 내 생각은 파일 시스템 수준에서 해당 제한을 정의하는 것이었지만 이 기능을 지원하는 파일 시스템은 없는 것 같습니다.

답변1

Lustre 2.12 이상에서는 "최대 파일 크기" 구성 요소가 없고 고정 크기 구성 요소 측이 있는 PFL 레이아웃을 지정하여 파일당, 디렉터리당 또는 파일 시스템당 최대 파일 크기 제한을 지정할 수 있습니다.

   $ lfs setstripe -E 1G -c 1 /path/to/<file|directory>

directory그 아래 (예: 로그 디렉터리)에 생성된 파일 에는 1GiB 크기 제한이 있으며 directory이는 루트 디렉터리인 경우 모든 파일에 적용됩니다.새로운별도로 명시하지 않는 한 파일 시스템의 파일입니다. 즉, 당신은아마도Samba 서버에서 요구하지 않는 한 Lustre를 사용하도록 설정하고 싶지 않습니다.많은용량/성능 확장.

ext4에 이러한 제한을 추가하는 것은 그리 어렵지 않습니다. maxbytes파일이 블록 매핑(이전 스타일, 4TB 제한)인지 범위 매핑(새 스타일, 16TB 제한)인지에 따라 이미 다른 값을 처리해야 합니다 . 매개변수 설정 s_maxbytes및 값을 전달하는 것은 매우 간단하며 업스트림에서 승인될 가능성이 높습니다(그동안 서버 커널을 패치할 수 있습니다).s_bitmap_maxbytes/sys/fs/ext4/<dev>/maxbytes

유일한 까다로운 부분은 sysfs 값을 다음과 같이 사용해야 한다는 것입니다.줄이다제한 사항 및 기존 제한 사항. maxbytes는 기존 제한보다 높게 설정하면 안 됩니다. 매개변수가 더 높게 설정되면 sysfs 핸들러에 일부 코드가 필요하여 이전 제한을 재설정 s_maxbytes및/또는 되돌릴 수 있습니다. 슈퍼블록에 별도의 매개변수로 저장하면 코딩하기는 더 쉽지만, 사용할 때마다 확인해야 하므로 속도가 느려지고,s_bitmap_maxbytesmaxbytess_sysfs_maxbytes매우이 값은 런타임 시 변경될 가능성이 없습니다. 또한 s_*_maxbytes코드의 모든 액세스를 다음과 같은 도우미로 바꿔야 합니다.

loff_t ext4_inode_get_maxbytes(struct inode *inode)
{
        loff_t maxbytes;

        if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
                maxbytes = inode->i_sb->s_maxbytes;
        else
                maxbytes = EXT4_SB(inode->i_sb)->s_bitmap_maxbytes;

        if (maxbytes > EXT4_SB(inode->i_sb)->s_sysfs_maxbytes)
                maxbytes = EXT4_SB(inode->i_sb)->s_sysfs_maxbytes;

        return maxbytes;
}

이는 상대적으로 기본적인 코딩 기술(주로 검색 잘라내기 및 바꾸기)을 갖춘 커널 초보자라도 수행할 수 있습니다.

관련 정보