Недавно я уменьшил размер файловой системы ext4 до 500 ГБ
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 493G 64G 404G 14% /
теперь я хочу уменьшить размер раздела, чтобы он точно соответствовал размеру файловой системы.
Я пытался использовать команду parted и resizepart. Проблема в том, когда parted запрашивает новый размер. Если я выберу 500 ГБ, результирующий раздел будет меньше 500 ГБ, и в результате основная файловая система не сможет поместиться на этом разделе. Любые подсказки о том, как правильно рассчитать размер?
Размеры сообщили df
будут неверными, поскольку они учитывают только блоки данных и пропущенные блоки, используемые внутри файловой системы, а также зарезервированные блоки.
Самый простой способ - уменьшить файловую систему как минимум на 10%, чтобы она была меньше, чем вы хотите. Измените размер раздела до желаемого размера, затем увеличьте файловую систему с помощью resize2fs.
Если вы хотите рассчитать это вручную, вы должны знать, насколько велика файловая система внутри. Проверьте это с tune2fs -l /dev/sda2
и умножьте количество блоков на размер блока. При изменении размера раздела в parted переключите блоки на сектора с unit s
и print
таблица для получения начального сектора и размера логического сектора. Разделите общий размер в байтах сверху на размер сектора. Округлите до ближайшего кратного 2048 и измените размер до этого количества секторов (конечный сектор = размер в секторах + начальный сектор - 1).
Уравнение (запускаемое в python, просто введите первые 4 значения):
block_count = N
block_size = N
sector_size = N
start_sector = N
fs_size = block_count * block_size
fs_sectors = fs_size/sector_size
part_sectors = ((fs_sectors-1)/2048+1)*2048
end_sector = start_sector + part_sectors - 1
print "Partition start: %d end: %d size: %d"%(start_sector,end_sector,part_sectors)
print "Resize in parted with: \nresizepart <number> %ds"%(end_sector)
Вот пример всего процесса.
Это жесткий диск:
root@debian:~# fdisk /dev/loop0
Command (m for help): p
Disk /dev/loop0: 4,9 GiB, 5243928576 bytes, 10242048 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc5127fad
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 8192 9765625 9757434 4,7G 83 Linux
Размер раздела составляет 4,7 ГБ. Это файловая система раздела:
root@debian:~# df -h
/dev/loop0p1 4,7G 2,1G 0 45% /mnt
Он имеет такой же размер, что и раздел, и занимает примерно половину его. Мы хотим уменьшить раздел и файловую систему в нем, чтобы сделать ее как можно меньше.
Первый шаг - использовать resize2fs с ключом -M, чтобы максимально сжать файловую систему:
root@debian:~# resize2fs -M /dev/loop0p1
Файловая система теперь выглядит так:
root@debian:~# df -h
/dev/loop0p1 2,1G 2,1G 0 100% /mnt
На жестком диске теперь есть раздел размером 4,7 ГБ с файловой системой 2,1 ГБ. Следующим шагом является уменьшение размера раздела для соответствия файловой системе меньшего размера.
Сначала рассчитайте размер файловой системы:
root@debian:~# dumpe2fs -h /dev/loop0p1
dumpe2fs 1.43.4 (31-Jan-2017)
Filesystem volume name: <none>
Last mounted on: /
Filesystem UUID: 7d5ec9a4-cc65-4433-95e2-6536e4fd56d6
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: journal_data_writeback user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 139392
Block count: 565950
Reserved block count: 7825
Free blocks: 8611
Free inodes: 2296
First block: 0
Block size: 4096
Это говорит нам, что существует 565950 блоков, а размер блока составляет 4096 байт. Это позволяет нам рассчитать размер файловой системы:
565950 * 4096 = 2318131200 байт
Исходя из этого, мы можем рассчитать размер файловой системы в секторах. Из приведенного выше вывода fdisk мы знаем, что размер сектора жесткого диска составляет 512 байт:
2318131200/512 = 4527600 секторов
Поскольку раздел не начинается с сектора 0, нам нужно добавить начальный сектор из вывода fdisk:
4527600 + 8192 = 4535792
Это новый конечный сектор для нашего раздела. На всякий случай добавьте к этому номеру 10 секторов (около 5 КБ): 4535802
Теперь мы можем использовать parted, чтобы уменьшить раздел до этого нового конечного сектора. Команда «unit s» используется для переключения единиц на сектора.
root@debian:~# parted
GNU Parted 3.2
Using /dev/sda
(parted) select /dev/loop0
Using /dev/loop0
(parted) p
Model: Loopback device (loopback)
Disk /dev/loop0: 5244MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 4194kB 5000MB 4996MB primary ext4
(parted) unit s
(parted) p
Model: Loopback device (loopback)
Disk /dev/loop0: 10242048s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 8192s 9765625s 9757434s primary ext4
(parted) resizepart 1 4535802
Warning: Shrinking a partition can cause data loss, are you sure you want to
continue?
Yes/No? yes
(parted) p
Model: Loopback device (loopback)
Disk /dev/loop0: 10242048s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 8192s 4535802s 4527611s primary ext4
Готово!