Linux konsolda disk imajında değişiklik yapmak

Elinizde Banana Pi için hazırlanmış debian dağıtımı olan “bananian.img” adında bir disk imajı var diyelim. Aşağıda bu imaj üzerinde nasıl değişiklikler yapılabileceğine dair komutlar ve örnekler bulunmaktadır. Bu örneklerde imajın partition listesini görmek, dosya sistemini kontrol etmek, imajı ve içindeki partitionları genişletmek ya da daraltmak ile ilgili bilgiler vardır. Bu örnekleri uygulamadan önce imajı yedeklemek için muhakkak bir kopyasını, mümkünde başka bir yere alın. Bu örneklere bakarak yapacağını işlemler sonucunda imajda oluşabilecek hatalar ve hatta geri döndürülemeyecek bozulmalardan bu yazıyı yazan yazar sorumlu değildir.

 

“bananian-1508..img” imajını mount etmeden önce içinde ne tip ve kaç tane partition var bakalım:

fdisk -l bananian-1508.img

Disk bananian-1508.img: 1899 MB, 1899999744 bytes
255 heads, 63 sectors/track, 230 cylinders, total 3710937 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
Disk identifier: 0x0ccea0b3

Device Boot Start End Blocks Id System
bananian-1508.img1 2048 43007 20480 83 Linux
bananian-1508.img2 43008 3710936 1833964+ 83 Linux

Görüldüğü üzere imaj dosyamızda iki adet partition bulunmaktadır. Bu bölümlerden bananian-1508.img1 olanı “/boot” partition’ı ve bananian-1508.img2 olanı da “/” partition’ı.  Bu dağıtıma birşeyler eklemek istedik ancak “/” partition’ında kullanılacak alan kalmamış. bu yüzden alanı genişletmemiz gerekiyor. (Bu durumda artık imaj dosyasını en az 4GB bir belleğe yazabileceksiniz)

Bölümü genişletmek için öncelikle imaj dosyasını genişletmek gerekmekte. Elimizdeki imaj dosyasının boyutlarına bir bakalım:

qemu-img info bananian-1508.img
image: bananian-1508.img
file format: raw
virtual size: 1.8G (1900000256 bytes)
disk size: 1.8G

Raw image dosyamızın boyutu 1.8GBmış. Şimdi bu dosyayı genişletelim:

#qemu-img resize bananian-1508.img +2.2GB
Image resized.

Yukarıdaki komut ile img dosyasının mevcut boyutunu 2.2GB daha genişlettik yani 1.8GB + 2.2GB = 4GB oldu.

# qemu-img info bananian-1508.img
image: bananian-1508.img
file format: raw
virtual size: 4.0G (4262232576 bytes)
disk size: 1.8G

Şimdi raw img dosyası içindeki “/” bölümünü genişletmeye başlamadan önce dosya sisteminin temiz olup olmadığını kontrol edip hatalar var ise düzeltmemiz gerekmekte. Aksi takdirde partition genişletme işlemi sırasında veri kaybına sebep olunabilir. Dosya sistemini kontrol etmek için önce “/” partition’ını loopback olarak bağlamamız gerekiyor:

losetup -o $((512 * 43008)) /dev/loop0 bananian-1508.img

Yukarıdaki komutta -o anahtarından sonra yazan $() ve içindeki kısımın açıklaması şu şekilde: $() = içerikteki işlemi yap ve sonucu ver (512 * 43008). Buradaki 512 yukarıda fdisk çıktısında bulunan “Units = sectors of 1 * 512 = 512 bytes” satırındaki 1 sektördeki toplam byte sayısını ve 43008 rakamı da bananian-1508.img2 partition’ının başlangıç sektörünü ifade eder.

Böylelikle “bananian-1508.img” imajı içindeki “bananian-1508.img2” partition’ınını “/dev/loop0” aygıtına bağlamış bulunduk. Şimdi bu aygıt üzerinden dosya sistemini kontrol edeceğiz.

fsck -fvp /dev/loop0

Yukarıdaki komutun anahtarlarına bakacak olursa “f” bölüm temiz olarak işaretlenmiş olsa da kontrol et, “v” çıktılar açıklayıcı olsun, “p” eğer hata bulursan bana sormadan düzelt anlamlarını taşımaktadır. Eğer herhangi bir hata yoksa çıktı aşağıdaki gibi olacaktır:

fsck from util-linux 2.20.1

18329 inodes used (15.98%, out of 114688)
15 non-contiguous files (0.1%)
29 non-contiguous directories (0.2%)
# of inodes with ind/dind/tind blocks: 0/0/0
Extent depth histogram: 16003/4
245346 blocks used (53.51%, out of 458491)
0 bad blocks
1 large file

14230 regular files
1624 directories
12 character device files
25 block device files
0 fifos
2 links
2429 symbolic links (2276 fast symbolic links)
0 sockets
————
18322 files

Dosya sistemini kontrol ettiğimize göre şimdi bölümü genişletebiliriz. Bu işleme başlamadan önce bölümü loopback’ten çıkartmamız lazım. öncelikle loopbackte neler varmış onu kontrol edelim:

losetup -a
/dev/loop0: [0811]:7874548 (/media/Home/sencer/Downloads/Bananian/bananian-1508.img), offset 22020096

Görüldüğü üzere sadece bağladığımız partition görünüyor. Bazen yanlışlıkla iki kere bağlamış olabiliyorum bu durumda aynı satırdan “/dev/loop1” olarak bir tane daha altında görünür.

losetup -d /dev/loop0

Şimdi imajın partitonlarını genişletmek için tam olarak disk gibi görünmesini sağlamamız lazım. Bunun için img dosyasını bağladıktan sonra partitionları da maplememiz gerekiyor. Bunu yapmanın kolay yolu “kpartx” komutu ile imajı loopback device’a bağlamak.

kpartx -a -v bananian-1508.img
add map loop0p1 (252:0): 0 40960 linear /dev/loop0 2048
add map loop0p2 (252:1): 0 3667929 linear /dev/loop0 43008

Gördüğünüz üzere komut otomatik olarak partitionları mapledi.

Bundan sonra parted resize ile /dev/loop0 diskini açıp genişletmek istediğiniz bölümü elden geçirebilirsiniz. Baktınız aşağıdaki şekilde hatalar mı veriyor, “gksu gparted /dev/loop0” ile grafik ekranda gparted ile de değişiklikleri yapabilirsiniz.

Örnek hata: “Error: File system has an incompatible feature enabled. Compatible features are has_journal, dir_index, filetype, sparse_super and large_file. Use tune2fs or debugfs to remove features.”

Resize işleminiz bittikten sonra aşağıdaki komut ile imaj dosyasını loopback devicelardan ayırabilirsiniz:

kpartx -vd bananian-1508.img
del devmap : loop0p2
del devmap : loop0p1
loop deleted : /dev/loop0