ZFS kök dizininde arızalı bir diski değiştirme
Bu kılavuz, Linux üzerinde ZFS mirror havuzundaki arızalı bir diskin nasıl değiştirileceğini açıklar. Prosedür; diski çevrimdışı duruma getirmeyi, bölüm tablosunu yedek diske kopyalamayı, diski havuza yeniden eklemeyi ve resilvering işlemi tamamlandıktan sonra önyükleyiciyi yüklemeyi kapsar.
Ön koşullar
Root yetkileri gereklidir. Aşağıdaki örneklerde iki diske sahip bir sunucu varsayılmıştır: /dev/sda (çalışan) ve /dev/sdb (arızalı). Aygıt adlarını kendi yapılandırmanıza göre değiştirin.
Devam etmeden önce tüm önemli verilerin yedeğini alın. Root diski değiştirmek yüksek riskli bir işlemdir. Herhangi bir adımda yapılacak bir hata veri kaybına veya sistemin önyüklenememesine neden olabilir. ZFS komutlarında /dev/sdX aygıt adlarını kullanmaktan kaçının. Aygıt adları yeniden başlatma sonrasında değişebilir. Bunun yerine /dev/disk/by-id/ gibi kararlı tanımlayıcıları kullanın. Aşağıdaki örneklerde bölümleme araçlarıyla çalışırken basitlik amacıyla /dev/sdX kullanılmıştır. ZFS komutlarında her zaman /dev/disk/by-id/ kullanılmalıdır.
1. Adım: Havuzun durumunu kontrol edin
Herhangi bir değişiklik yapmadan önce havuzun mevcut durumunu kontrol edin:
zpool status -v
Çıktı, hangi diskin arızalı olduğunu ve havuzdaki tanımlayıcısını gösterecektir.
2. Adım: Arızalı diski çevrimdışı duruma getirin
Disk ONLINE durumundaysa ancak arıza belirtileri gösteriyorsa, fiziksel olarak değiştirmeden önce diski çevrimdışı duruma getirin:
zpool offline rpool <failed-device>
ZFS, fiziksel değiştirme işleminden önce arızalı diski kullanmaya çalışmayı durduracaktır. <failed-device> yerine zpool status -v komutunda gösterilen tanımlayıcıyı yazın. Disk zaten FAULTED veya REMOVED durumundaysa bu adımı atlayıp doğrudan 3. adıma geçin.
3. Adım: Diski fiziksel olarak değiştirin
Sunucunuz hot swap özelliğini destekliyorsa diski sistemi kapatmadan değiştirebilirsiniz.
Aksi durumda sistemi kapatın:
poweroff
Yedek diski taktıktan sonra sunucuyu başlatın ve yeni diskin görüldüğünü doğrulayın:
lsblk -o NAME,SIZE,MODEL ls -l /dev/disk/by-id/
Sonraki adımlarda yeni diskin by-id tanımlayıcısını kullanın.
4. Adım: Bölüm tablosu türünü belirleyin
Kurulu değilse gdisk'i yükleyin:
apt install gdisk -y
Çalışan diskteki bölüm tablosu türünü kontrol edin:
gdisk -l /dev/sda
Çıktıda Partition table scan bölümünü bulun. MBR için sonuç MBR: MBR only ve GPT: not present şeklinde olacaktır. GPT için ise MBR: protective ve GPT: present gösterilecektir.
5. Adım: Bölüm tablosunu hazırlayın ve yeni diske kopyalayın
Çoğu ZFS root kurulumu GPT bölümleme kullanır. MBR yöntemi eski sistemler için dahil edilmiştir.
GPT
Devam etmeden önce yeni diske karşılık gelen /dev/sdX adını belirleyin; bölümleme araçları bu adı gerektirir:
lsblk -o NAME,SIZE,MODEL,SERIAL
Bölüm tablosunu kopyalamadan önce yedek disk üzerindeki eski imzaları temizleyin:
wipefs -a /dev/disk/by-id/<new-disk>
wipefs -a, diskteki tüm dosya sistemi ve bölüm imzalarını kalıcı olarak siler. Bu komutu çalıştırmadan önce doğru disk tanımlayıcısının belirtildiğinden emin olun.
Aşağıdaki komut bölüm tablosunu /dev/sda (kaynak) üzerinden /dev/sdb (hedef) diskine kopyalar:
sgdisk -R /dev/sdb /dev/sda
sgdisk -R komutunda ilk argüman hedef diski, ikinci argüman ise kaynak diski belirtir. Argümanların ters yazılması, çalışan diskteki bölüm tablosunun üzerine yazılmasına neden olur.
Yedek disk orijinal diskten daha büyükse, GPT'yi genişleterek diskin tamamının kullanılmasını sağlayın:
sgdisk -e /dev/sdb
Ardından yedek diske yeni ve benzersiz bir UUID atayın:
sgdisk -G /dev/sdb
sgdisk -G, yedek diskteki tüm bölümlere yeni UUID'ler atar. /etc/fstab içinde bu bölümlerden herhangi biri için UUID tabanlı girişler varsa sistem önyüklenemeyebilir. Resilvering tamamlandıktan sonra /etc/fstab dosyasının UUID yerine /dev/disk/by-id/ tanımlayıcılarını kullandığını doğrulayın.
Çekirdeğin yeni bölüm düzenini algılaması için bölüm tablosunu yeniden yükleyin:
udevadm trigger udevadm settle
Yedek disk daha önce başka bir ZFS havuzunda kullanıldıysa çakışmaları önlemek için eski ZFS meta verilerini temizleyin:
zpool labelclear /dev/disk/by-id/<new-disk-partX> 2>/dev/null || true
<new-disk-partX> yerine gerçek ZFS bölüm tanımlayıcısını yazın.
MBR
Aşağıdaki komut bölüm tablosunu /dev/sda (kaynak) üzerinden /dev/sdb (hedef) diskine kopyalar:
sfdisk -d /dev/sda | sfdisk /dev/sdb
Kopyalama sonrasında yeni bölümler sistemde görünmüyorsa bölüm tablosunu yeniden yükleyin:
udevadm trigger udevadm settle
6. Adım: Diski havuza ekleyin
Havuzdaki arızalı disk girişini yeni diskle değiştirin. Öncelikle havuzda görünen arızalı diskin tam tanımlayıcısını kontrol edin:
zpool status rpool
Çıktıda havuzun aygıt listesi altında arızalı disk girişini bulun. Disk, örneğin /dev/disk/by-id/ata-WDC_WD10_12345-part3 gibi tam bir yol ile ve FAULTED, UNAVAIL veya OFFLINE durumlarından biriyle gösterilecektir. Bu yolu replace komutunda <old-device> olarak kullanın:
zpool replace rpool <old-device> /dev/disk/by-id/<new-disk-part>
<old-device> yerine önceki adımda bulunan arızalı diskin tanımlayıcısını yazın. <new-disk-part> yerine yedek disk bölümünün by-id tanımlayıcısını yazın ve çalışan diskte kullanılan bölüm numarasının aynısını kullanın (örneğin -part3 veya -part4). Doğru tanımlayıcıyı bulmak için ls -l /dev/disk/by-id/ komutunu çalıştırın.
Eski disk tamamen kullanılamıyorsa (UNAVAIL) ve zpool replace bir hata döndürüyorsa, değişimi zorlamak için -f seçeneğini ekleyin:
zpool replace -f rpool <old-device> /dev/disk/by-id/<new-disk-part>
zpool replace komutunu çalıştırdıktan sonra resilvering işleminin başladığını ve yeni diskin ONLINE olarak göründüğünü doğrulayın:
zpool status
Resilvering arka planda otomatik olarak devam eder.
7. Adım: Resilvering işlemini izleyin
Resilvering ilerlemesini şu komutla takip edin:
zpool status -v
Çıktı ilerlemeyi, hızı ve tahmini kalan süreyi gösterir. Devam etmeden önce durumun state: ONLINE olarak görünmesini ve resilvering işleminin tamamlanmasını bekleyin. Disk boyutuna bağlı olarak bu işlem birkaç saat sürebilir.
8. Adım: Önyükleme dataset'ini doğrulayın
Önyükleyiciyi yüklemeden önce havuzda doğru önyükleme dataset'inin yapılandırıldığını doğrulayın:
zpool get bootfs rpool
Çıktıda rpool/ROOT/debian gibi bir dataset yolu görünmelidir. Değer none ise veya yanlış dataset'i gösteriyorsa manuel olarak ayarlayın:
zpool set bootfs=rpool/ROOT/debian rpool
rpool/ROOT/debian yerine sisteminizdeki gerçek root dataset adını yazın. Kullanılabilir dataset'leri listelemek için zfs list komutunu çalıştırın.
9. Adım: Önyükleyiciyi yükleyin
Resilvering tamamlandıktan sonra önyükleyiciyi yedek diske yükleyin. Resilvering sırasında sistem orijinal diskten çalışmaya devam eder; bu nedenle havuz sağlıklı duruma geldikten sonra bu adımı güvenle gerçekleştirebilirsiniz.
BIOS (Legacy)
grub-install /dev/disk/by-id/<new-whole-disk>
Bazı sistemlerde grub-install by-id yolunu kabul etmeyebilir. Bu durumda /dev/disk/by-id/<new-whole-disk> yerine ilgili aygıt adını, örneğin /dev/sdb, kullanın.
UEFI
grub-install komutunu çalıştırmadan önce yedek diskteki EFI bölümünü geçici bir dizine bağlayın. Bu, hâlihazırda etkin olan EFI bölümünün üzerine yazılmasını önler:
mkdir -p /mnt/new_efi mount /dev/disk/by-id/<new-disk-part1> /mnt/new_efi
<new-disk-part1> yerine gerçek EFI bölüm tanımlayıcısını yazın (genellikle -part1 veya -part2; bölüm türü EF00). Emin değilseniz ls -l /dev/disk/by-id/ komutuyla kontrol edin.
EFI bölümü boşsa grub-install komutunu çalıştırmadan önce mevcut EFI bölümünün içeriğini kopyalayın:
cp -r /boot/efi/* /mnt/new_efi/
Önyükleyiciyi yükleyin:
apt install grub-efi-amd64 efibootmgr -y grub-install --target=x86_64-efi --efi-directory=/mnt/new_efi --bootloader-id=debian --recheck /dev/disk/by-id/<new-whole-disk> update-grub update-initramfs -u -k all
--bootloader-id=debian değerini dağıtımınıza uygun adla değiştirin (örneğin ubuntu veya debian). /dev/disk/by-id/<new-whole-disk> yerine bölümün değil, yedek diskin tamamının by-id tanımlayıcısını yazın.
update-initramfs komutunun çalıştırılması, başlangıç RAM diskinde güncel ZFS modüllerinin bulunmasını ve yeni havuz düzeninin tanınmasını sağlar. Bu adım olmadan sistem, disk değişiminden sonra önyükleme yapamayabilir.
Kurulumdan sonra EFI bölümünün bağlantısını kaldırın:
umount /mnt/new_efi
EFI önyükleme girişlerini doğrulayın:
efibootmgr -v
ZFS root kullanılan sistemlerde grub-install, GRUB sürümüne ve sistem yapılandırmasına bağlı olarak başarısız olabilir veya ek seçenekler gerektirebilir. Örneğin bazı sistemlerde GRUB'un ZFS destek modülleriyle yüklenmesi veya komutun bir chroot ortamından çalıştırılması gerekebilir. Komut bir hata döndürürse ZFS'e özel GRUB kurulum talimatları için kullandığınız dağıtımın belgelerine başvurun.
Proxmox VE'de grub-install devre dışıdır. Bunun yerine proxmox-boot-tool kullanın. Aşağıdaki örnekte /dev/sdb2 kullanılmıştır — bunu sisteminizdeki gerçek EFI bölümüyle değiştirin:
proxmox-boot-tool format /dev/sdb2 proxmox-boot-tool init /dev/sdb2
Sonuç
Önyükleyiciyi yükledikten sonra sunucuyu yeniden başlatın ve sistemin normal şekilde açıldığını doğrulayın. Resilvering sırasında oluşmuş olabilecek okuma/yazma hatalarını kontrol etmek için bir scrub işlemi başlatın:
zpool scrub rpool
Ardından havuzun durumunu kontrol edin:
zpool status -v
Havuz online durumda ve hatasız olmalıdır. İşlem sırasında herhangi bir sorun ortaya çıkarsa daha fazla ayrıntı için journalctl -xe komutuyla sistem günlüklerini kontrol edin.
3. adımda çıkardığınız arızalı diski elden çıkarmadan önce sunucuyu yeniden başlatın ve sistemin yedek diskten normal şekilde önyükleme yaptığını doğrulayın. Önyüklemenin başarılı olduğu kesinleşene kadar arızalı diski yedek seçenek olarak saklayın.