Назад | Перейти на главную страницу

Уменьшить раздел, чтобы он точно соответствовал размеру базовой файловой системы

Недавно я уменьшил размер файловой системы 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

Готово!