Как сбросить размер метаданных папки, не создавая папку заново?

Чтобы он заработал, мне пришлось включить NAT.

$ iptables -t nat -A POSTROUTING -o envmw -j MASQUERADE
$ iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ iptables -A FORWARD -i virbr0 -o envmw -j ACCEPT
6
22.11.2016, 13:37
2 ответа

e4fsck поддерживает флаг -D, который, похоже, делает то, что вы хотите:

попытайтесь оптимизировать все каталоги, либо переиндексируя их, если файловая система поддерживает индексацию каталогов, либо сортируя и сжимая каталоги для небольших каталогов, либо для файловых систем, использующих традиционные линейные каталоги.

Конечно, для использования fsck вам потребуется размонтировать файловую систему, что означает простой вашего сервера.

Вы захотите использовать опцию -f, чтобы убедиться, что e4fsck обрабатывает файловую систему, даже если она чистая.

Testing:

# truncate -s1G a; mkfs.ext4 -q ./a; mount ./a /mnt/1
# mkdir /mnt/1/x; touch /mnt/1/x/{1..4000}
# ls -ld /mnt/1/x
drwxr-xr-x 2 root root 69632 Nov 22 12:54 /mnt/1/x/
# rm -f /mnt/1/x/*
# ls -ld /mnt/1/x
drwxr-xr-x 2 root root 69632 Nov 22 12:55 /mnt/1/x/
# umount /mnt/1
# e2fsck -f -D ./a
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 3A: Optimizing directories
Pass 4: Checking reference counts
Pass 5: Checking group summary information

./a: ***** FILE SYSTEM WAS MODIFIED *****
./a: 12/65536 files (0.0% non-contiguous), 12956/262144 blocks
# mount ./a /mnt/1
# ls -ld /mnt/1/x
drwxr-xr-x 2 root root 4096 Nov 22 12:55 /mnt/1/x/
3
27.01.2020, 20:28

Практически ответ на ваш вопрос: нет . ext4 не обрезает каталоги, поэтому вам нужно создать их заново. Вы можете улучшить свой предыдущий метод, перемещая, а не копируя файлы в новый каталог, это, вероятно, будет намного быстрее и изменит только ctime файлов.

Если нет подкаталогов, вы даже можете использовать ln , чтобы жестко связать файлы в новый каталог.

В Linux есть системный вызов renameat2 , который можно использовать для обмена двумя именами, поэтому, опять же, предполагая, что у вас нет подкаталогов, вы можете создать новый каталог, связать файлы из старого с новым, а затем поменять местами старый и новый каталоги. Быстрый Google предложил https://gist.github.com/eatnumber1/f97ac7dad7b1f5a9721f в качестве примера кода для вызова renameat2.

Конечно, все это только данные, поэтому вы можете использовать что-то вроде debugfs или даже dd для редактирования структур данных прямо на диске. Я бы не советовал идти по этому пути ради 360 КБ места.

2
27.01.2020, 20:28

Теги

Похожие вопросы