Micșorarea partiției pentru a se potrivi exact cu dimensiunea sistemului de fișiere de bază (Administrarea sistemului, Partiție, Parted)

Vikelidis Kostas a intrebat.

Recent am micșorat dimensiunea unui sistem de fișiere ext4 la 500GB

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       493G   64G  404G  14% /

acum vreau să micșorez dimensiunea partiției pentru a se potrivi exact cu dimensiunea sistemului de fișiere.

Am încercat să folosesc parted și comanda resizepart. Problema este atunci când parted cere noua dimensiune. Dacă aleg 500GB, partiția rezultată este mai mică de 500GB și, ca urmare, sistemul de fișiere de bază nu se poate potrivi pe această partiție. Aveți vreun indiciu despre cum să calculați corect dimensiunea?

Comentarii

  • IMO, faceți acest lucru invers. Micșorați sistemul de fișiere sub dimensiunea partiției țintă, micșorați partiția, apoi redimensionați sistemul de fișiere pentru a umple partiția… Nu trebuie să calculați nimic, în mod implicit se utilizează tot spațiul disponibil în partiție în resize2fs. Dimensiunea partiției dictează dimensiunea maximă a sistemului de fișiere, nu invers. –  > Por yoonix.
2 răspunsuri
David

Dimensiunile raportate de df vor fi incorecte, deoarece acestea iau în calcul doar blocurile de date și blocurile de ratare utilizate intern de sistemul de fișiere, precum și blocurile rezervate.

Cel mai simplu este să micșorați sistemul de fișiere pentru a fi mai mic decât doriți cu cel puțin 10%. Redimensionați partiția la dimensiunea dorită, apoi măriți sistemul de fișiere cu resize2fs.

Dacă doriți să o calculați manual, trebuie să știți cât de mare este sistemul de fișiere la nivel intern. Verificați acest lucru cu tune2fs -l /dev/sda2 și înmulțiți numărul de blocuri cu dimensiunea blocului. Atunci când redimensionați partiția în parted schimbați unitățile în sectoare cu unit s și print tabelul pentru a obține sectorul inițial și dimensiunea sectorului logic. Împărțiți dimensiunea totală în octeți de mai sus la dimensiunea sectorului. Rotunjiți la cel mai apropiat multiplu de 2048 și redimensionați la acest număr de sectoare (end sector = dimensiune în sectoare + start sector – 1).

Ecuație (executabilă în python, trebuie doar să completați primele 4 valori):

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: 
resizepart <number> %ds"%(end_sector)

Martin Hansen

Iată un exemplu al întregului proces.

Acesta este discul nostru dur:

[email protected]:~# 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

acesta conține o singură partiție (/dev/loop0p1) care are o dimensiune de 4,7 GB. Acesta este sistemul de fișiere de pe partiție:

[email protected]:~# df -h
/dev/loop0p1    4,7G    2,1G     0  45% /mnt

În mod implicit, acesta are aceeași dimensiune ca și partiția (4,7GB). Dar numai 2,1GB (45%) din sistemul de fișiere este utilizat. Acest lucru înseamnă că am putea micșora sistemul de fișiere și partiția la doar 2,1 GB fără a pierde date.

Primul pas este să folosim resize2fs cu comutatorul -M pe partiție. Similar unui defragmentator de disc, această comandă va încerca să mute toate fișierele la începutul sistemului de fișiere pentru a forma un bloc contiguu. Acest lucru permite apoi micșorarea sistemului de fișiere la cea mai mică dimensiune posibilă.

[email protected]:~# resize2fs -M /dev/loop0p1

Sistemul de fișiere arată acum în felul următor:

[email protected]:~# df -h
/dev/loop0p1    2,1G    2,1G     0  100% /mnt

Discul dur conține acum o partiție de 4,7 GB cu un sistem de fișiere de 2,1 GB care este utilizat în proporție de 100%. Următorul pas este micșorarea dimensiunii partiției pentru a se potrivi cu sistemul de fișiere mai mic.

Pentru aceasta, trebuie să calculăm dimensiunea sistemului de fișiere. Instrumentul dumpe2fs este foarte util în acest sens, acesta afișează informații detaliate despre un sistem de fișiere.

[email protected]:~# 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

Acesta ne spune că există 565950 de blocuri și că dimensiunea blocului este de 4096 octeți. Acest lucru ne permite să calculăm dimensiunea sistemului de fișiere:

565950 blocuri * 4096 octeți = 2318131200 octeți

De aici, putem calcula dimensiunea sistemului de fișiere în sectoare. Din rezultatul fdisk de mai sus, știm că dimensiunea sectorului de pe hard disk este de 512 octeți:

2318131200 bytes / 512 = 4527600 sectoare

Deoarece partiția nu începe de la sectorul 0, trebuie să adăugăm sectorul de start din fișierul de ieșire fdisk:

4527600 + 8192 (sector de start) = 4535792

Acesta este noul sector final pentru partiția noastră. Pentru a fi siguri, adăugați 10 sectoare (aproximativ 5 KB) la acest număr: 4535802

Acum putem folosi parted pentru a micșora partiția la acest nou sector final. Comanda „unit s” este utilizată pentru a schimba unitățile în sectoare.

[email protected]:~# 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

Aceasta ne dă un avertisment cu privire la o potențială pierdere de date, dar deoarece am mutat toate datele la începutul partiției înainte, acesta poate fi ignorat în siguranță. Gata! Acum avem o partiție de 2,1GB cu un sistem de fișiere de 2,1GB care este ocupat 100%.