Etiket: disk

  • 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

  • Yarım kalan recovery ve kullanıma girmeyen RAID array bölümü.

    Başıma gelen bir diğer sorun ise recovery’nin bir şekilde yarım kalması ve bu yüzden RAID arraye ait bölümün birisinin kullanıma girmemesiydi ([_U] durumu).

    Tekrar recvery denediğimde bana “Device or Resource Busy” hatası döndürdü durdu.

    # mdadm –manage /dev/md0 –add /dev/sda1
    mdadm: cannot open device /dev/sda1: Device or resource busy

    MD array’indeki bölümü durdurmama bile müsaade etmedi.

    # mdadm –stop /dev/md2 /dev/sda3
    mdadm: fail to stop device /dev/sda1: Device or resource busy

    İnanılmaz birşey ancak bir türlü durmuyordu. Onu durdurabilmek için baya bir uğraştıktan ve araştırdıktan sonra öncelikle failed olarak işaretlemem ve ardından remove etmem gerektiğini öğrendim.

    # mdadm –fail /dev/md2 /dev/sda3
    mdadm: set /dev/sda3 faulty in /dev/md2

    # mdadm –remove /dev/md2 /dev/sda3
    mdadm: hot removed /dev/sda3

    Sonunda onu durdurmayı başardım ve doğrudan recovery işlemini başattım. recovery işlemini başlattığımda otomatik olara sda3 bölümün md2 arrayine ekleyip resync işlemine başladı. Bu yazıyı yazarken recovery henüz bitmemişti, bitmesine de daha en az 3 saat vardı. O yüzden bölümün kullanıma girip girmediğini yazmıyorum.

  • RAID1 array’i yeniden yapılandırma.

    Önceki yazımızda RAID arrayde bulunan bozuk diskin nasıl tespit edileceğini görmüştük. Bu yazımızda bozuk diskin yerine takılan yeni diskin array’e nasıl ekleneceğini göreceğiz. Normalde ubuntu sunucular bu işi yeni disk takılıp sistem açıldıktan sonra otomatik olarak yapmaya başlayabiliyor, ancak zaman zaman sorunlar ile karşılaşmak mümkün oluyor. Örneğin benim vereceğim örnekte md1 array’i nedense inactive durumda. Bu sorunla yüzleştiğimizde neler yapılabilir beraber bakalım:

    (Not: bu işlemleri yaparken, herhangi bir veri kaybı yaşamanızdan sorumlu olmadığımı tekrar belirtmek isterim. Önceki yazıda bulunan kurallar aynen bu yazı için de geçerli.)

    Öncelikle yeni diskte eş bölümleri oluşturmamız gerekmekte. Bunun için elimizde bulunan ikinci diskin bölümlerini ve Boot kaydını aynen yeni diske geçirmemiz gerekiyor. Bu işlemler için sırası ile şunları yapacağız:

    Öncelikle ikinci diskin bölümleme tablosunun bir kopyasını yeni diske çıkartalım.

    Hatırlayacağınız üzere bozulan diskimiz “sda” sağlam olan diskimiz de “sdb” idi. Ancak yanlış işlem yapmamanız için öncelikle dolu ve boş diskin hangisi olduğuna sisteminizden bakın:

    # fdisk -l

    Disk /dev/sda: 750.2 GB, 750156374016 bytes
    255 heads, 63 sectors/track, 91201 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x55555555

    Disk /dev/sda doesn’t contain a valid partition table

    Disk /dev/sdb: 750.2 GB, 750156374016 bytes
    255 heads, 63 sectors/track, 91201 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00088969

    Device Boot Start End Blocks Id System
    /dev/sdb1 1 262 2102562 fd Linux raid autodetect
    /dev/sdb2 263 295 265072+ fd Linux raid autodetect
    /dev/sdb3 296 91201 730202445 fd Linux raid autodetect

    Disk /dev/md0: 2152 MB, 2152923136 bytes
    2 heads, 4 sectors/track, 525616 cylinders
    Units = cylinders of 8 * 512 = 4096 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00000000

    Disk /dev/md0 doesn’t contain a valid partition table

    Disk /dev/md2: 747.7 GB, 747727224832 bytes
    2 heads, 4 sectors/track, 182550592 cylinders
    Units = cylinders of 8 * 512 = 4096 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00000000

    Disk /dev/md2 doesn’t contain a valid partition table

    Benim sistemimde dolu olan disk “/dev/sdb” boş olan yeni disk ise “/dev/sda” olarak görünmekte. Buna göre sdb’deki bölümleme tablosunu aşağıdaki komut ile “sda”ya kopyalayacağız:

    # sfdisk -d /dev/sdb | sfdisk /dev/sda

    Checking that no-one is using this disk right now …
    OK

    Disk /dev/sda: 91201 cylinders, 255 heads, 63 sectors/track

    sfdisk: ERROR: sector 0 does not have an msdos signature
    /dev/sda: unrecognized partition table type
    Old situation:
    No partitions found
    New situation:
    Units = sectors of 512 bytes, counting from 0

    Device Boot Start End #sectors Id System
    /dev/sda1 3906 4209029 4205124 fd Linux raid autodetect
    /dev/sda2 4209030 4739174 530145 fd Linux raid autodetect
    /dev/sda3 4739175 1465144064 1460404890 fd Linux raid autodetect
    /dev/sda4 0 – 0 0 Empty
    Warning: no primary partition is marked bootable (active)
    This does not matter for LILO, but the DOS MBR will not boot this disk.
    Successfully wrote the new partition table

    Re-reading the partition table …

    If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
    to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
    (See fdisk(8).)

    İşlemin başarılı olup olmadığını tekrar “fdisk -l” komutu vererek çıktıdan görebilirsiniz. Eğer şöyle bir çıktı ile karşıltıysanız işlem başarılı demektir:

    # fdisk -l

    Disk /dev/sda: 750.2 GB, 750156374016 bytes
    255 heads, 63 sectors/track, 91201 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x55555555

    Device Boot Start End Blocks Id System
    /dev/sda1 1 262 2102562 fd Linux raid autodetect
    /dev/sda2 263 295 265072+ fd Linux raid autodetect
    /dev/sda3 296 91201 730202445 fd Linux raid autodetect

    Disk /dev/sdb: 750.2 GB, 750156374016 bytes
    255 heads, 63 sectors/track, 91201 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00088969

    Device Boot Start End Blocks Id System
    /dev/sdb1 1 262 2102562 fd Linux raid autodetect
    /dev/sdb2 263 295 265072+ fd Linux raid autodetect
    /dev/sdb3 296 91201 730202445 fd Linux raid autodetect

    Disk /dev/md0: 2152 MB, 2152923136 bytes
    2 heads, 4 sectors/track, 525616 cylinders
    Units = cylinders of 8 * 512 = 4096 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00000000

    Disk /dev/md0 doesn’t contain a valid partition table

    Disk /dev/md2: 747.7 GB, 747727224832 bytes
    2 heads, 4 sectors/track, 182550592 cylinders
    Units = cylinders of 8 * 512 = 4096 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00000000

    Disk /dev/md2 doesn’t contain a valid partition table

     Bu işlemden sonra Boot record’u kopyalayacağız, önce boot recordun kopyasını dosyaya yazıyoruz:

    # dd if=/dev/sdb of=sdb.part bs=1024k count=1
    1+0 records in
    1+0 records out
    1048576 bytes (1.0 MB) copied, 0.0249217 s, 42.1 MB/s

    # dd if=sdb.part of=/dev/sda bs=1024k count=1
    1+0 records in
    1+0 records out
    1048576 bytes (1.0 MB) copied, 0.00123787 s, 847 MB/s

    Bölümleme işlemleri bittikten sonra sda arrayleri sdb’den geri alma işlemine başlayabiliriz:

    # mdadm –manage /dev/md0 –add /dev/sda1
    mdadm: added /dev/sda1

    # mdadm –manage /dev/md1 –add /dev/sda2
    mdadm: added /dev/sda2

    # mdadm –manage /dev/md2 –add /dev/sda3
    mdadm: added /dev/sda3

     Bu mirrorlama işlemleri arka planda devam etmektedir. Durumu görmek için “cat /proc/mdstat” komutunu verebilirsiniz. An be an takip etmek isterseniz şu komut ile konsolun birisinde monitörleme yapabilirsiniz:

    # watch -n .5 cat /proc/mdstat

    .5 rakamı güncellenme sıklığını saniye cinsinden belirtir 0.5 saniye anlamındadır değer 1 yaparak saniyede bir güncellenmesini sağlayabilirsiniz. Mirrorlama işlemi süresi diskin boyutu ve makinenin gücüne ayrıca başka işlem yapılıp yapılmadığına göre değişiklik göstermektedir.

    Every 0.5s: cat /proc/mdstat Tue Jul 23 13:42:47 2013

    Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] [linear] [multipath]
    md1 : active raid1 sda2[0] sdb2[1]
    264960 blocks [2/2] [_U]
    resync=DELAYED

    md2 : active raid1 sda3[2] sdb3[1]
    730202368 blocks [2/1] [_U]
    [=====>……………] recovery = 2.2% (16135936/730202368) finish=151.9min speed=78334K/sec

    md0 : active raid1 sda1[0] sdb1[1]
    2102464 blocks [2/2] [UU]

    unused devices: <none>

    Yukarıdaki görüntüde arrayler görünmekte ve bunların bazılarında ufak tefek farklar bulunmakta, bunları açıklamak gerekirse;

    • [2/2] [2/1] gibi ibareler md arrayine bağlı bölümlerin kaç tanesinin çalışır durumda olduğunu göstermektedir. md0 arrayinde 2 bölümde çalışır durumda.
    • [UU] [_U] gibi ibarelerde ise “U” harfi kullanımda olan bölümlemeleri göstermektedir. “_” ise kullanımda olmayan bölümlemeyi işaret eder.
    • md0 cihazı aktif ve sda1 bölümünün kopyası oluşturulmuş. Şu an sorunsuz bir şekilde çalışmakta.
    • md1 cihazı resync için “DELAYED” durumunda sıra beklemekte. ikinci bölümleme arraye eklenmiş ancak kullanıma açılmamış
    • md2 cihazında şu an resync yapılmakta bu yüzden henüz o da kullanıma açılmamış durumda.

    Sonraki yazımız karşılaşılan sorunlar ile nasıl başa çıkılacağına dair olacak.

  • Ubuntu sunucuda RAID1 array içindeki bozuk diski bulmak.

    RAID1 sistemdeki diskin bir tanesi bozulduğu zaman izlenecek yöntemler:

    Öncelikli işlem sistem henüz açık iken yedek almaktır. Her zaman yedeğinizi alın! Bu işlem sonucunda sisteminizde oluşabilecek sorunlardan tamamen siz sorumlusunuz. Ben yaptım oldu ancak sizin sistemde de aynı sonucu vermeme olasılığı her zaman vardır ve veri kaybı yaşamanız bu olasılık dahilindedir. Bu yüzden bu adımları uygularken yaşayacağını hiçbir kayıptan ben sorumlu değilim. 🙂

    Canlı sistemin yedeğini aldıktan sonra bozuk diskin hangisi olduğunu bilmiyorsanız öncelikle bunu tespit etmemiz gerekir.

    Sistemde root kullanıcı haklarına nail olup (# sudo -s) /var/log/ altındaki messages log dosyasının içine bakarak bozuk diskin hangisi olduğunu anlayabiliriz. Örnek olarak benim messages dosyasının içeriğini aşağıya ekledim:

    kernel: [ 540.541685] ata3.00: configured for UDMA/133
    kernel: [ 540.541698] sd 2:0:0:0: [sda] Unhandled sense code
    kernel: [ 540.541701] sd 2:0:0:0: [sda] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
    kernel: [ 540.541704] sd 2:0:0:0: [sda] Sense Key : Medium Error [current] [descriptor]
    kernel: [ 540.541709] Descriptor sense data with sense descriptors (in hex):
    kernel: [ 540.541711] 72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
    kernel: [ 540.541721] 00 40 3b 8b
    kernel: [ 540.541725] sd 2:0:0:0: [sda] Add. Sense: Unrecovered read error – auto reallocate failed
    kernel: [ 540.541730] sd 2:0:0:0: [sda] CDB: Read(10): 28 00 00 40 3b 8b 00 00 03 00
    kernel: [ 540.541981] ata3: EH complete

    Yukarıda görüldüğü üzere “sd 2:0:0:0: [sda] Sense Key : Medium Error [current] [descriptor]” ve “sd 2:0:0:0: [sda] Add. Sense: Unrecovered read error – auto reallocate failed” satırları “sda” olarak bağlanmış olan diskte “medya hatası” ve “kurtarılamayan okuma hatası” hatası olduğunu söylemekte.

    Eğer sda diskin kasanın içindeki hangi disk olduğu konusunda bir fikriniz yoksa sistemi kapatıp disk sökmeye başlamadan önce hangi diski sökmeniz gerektiğini diskin seri numarasına bakarak şu şekilde bulabilirsiniz:

    # hdparm -i /dev/sda | grep SerialNo
    Model=SAMSUNG HD753LJ, FwRev=1AA01118, SerialNo=S13UJ90SXXXXXX

    İkinci olarak şu yöntem ile de seri numarasını bulabilirsiniz:

    # /sbin/udevadm info –query=property –name=sda | grep ID_SERIAL
    ID_SERIAL=SAMSUNG_HD753LJ_S13UJ90SXXXXXX
    ID_SERIAL_SHORT=S13UJ90SXXXXXX

    Eğer S.M.A.R.T. verilerini okumayı biliyorsanız mevcut RAID1 yapısındaki iki diskin S.M.A.R.T. verilerine bakarak hangi diskin bozuk olduğunu ve seri numarasını bulabilirsiniz.

    # smartctl -x /dev/sda

    Bu komut çıktısı çok uzun olduğu ve ekstra açıklamalar gerektiği için yazıyı daha uzatmamak adına buraya eklemiyorum. S.M.A.R.T. verisi nasıl okunur bunu başka bir konuda işleyeceğiz.

    Hangi diski sökmemiz gerektiğini öğrendiğimize göre artık sistemi kapatıp doğru diski değiştirebiliriz. Diski değiştirdikten sonra sistemi tekrar yükleyip RAID array’i yapılandırma işine girişeceğiz.