Jump to content
From ArchWiki

İlgili makaleler

- PRoot
- Linux Containers
- systemd-nspawn

Çeviri Durumu: Bu makale, Chroot makalesinin çevirisidir. Son çeviri tarihi (yıl-ay-gün şeklinde): 2022-08-14. Eğer makalenin İngilizce sürümünde değişiklik yapılmış ise çevirinin senkronize edilmesine yardımcı olabilirsiniz. Çevirmenliğe dair bilgi edinmek için Telegram grubumuzu ziyaret edebilirsiniz.

Chroot işlemi, mevcut durumda çalışan işlemler ve bu işlemlerin alt işlemleri için görünen kök dizinini değiştiren bir işlemdir. Böyle değiştirilmiş bir ortamda çalışan bir programın, çalıştığı ortam dizininin dışındaki dosyalara ve komutlara erişim izni bulunmamaktadır. Bu değiştirilmiş ortama chroot kafesi ismi verilmektedir.

## Nedenler

Kök dizinini değiştirmek, genellikle önyüklemenin ve/veya giriş yapmanın mümkün olmadığı sistemlerde, sistem bakımını gerçekleştirmek için yapılmaktadır. En yaygın örnekler ise şunlardır:

- Önyükleyici yeniden kurmak.
- initramfs imaj'ını yeniden oluşturmak.
- Paketleri yükseltmek veya paketleri eski sürümlerine düşürmek.
- Unutulmuş bir parolayı sıfırlamak.
- Temiz chroot ortamında paketleri oluşturmak.

Ayrıca Chroot'un Sınırlamaları sayfasına bakınız.

## Gereksinimler

- Kök izni ayrılacılığı.
- Başka bir Linux ortamı, örn. bir Canlı CD veya USB flash medyası veya mevcut durumdaki başka bir Linux dağıtımı.
- Chroot'un yapılacağı ortam ile chroot'un uygulanacağı ortamın mimarilerinin birbirleri ile eşleşmesi gerekmektedir. Geçerli ortamın mimarisi şu komut ile öğrenilebilmektedir: `uname -m` (örn. i686 or x86_64).
- Chroot ortamında ihtiyaç duyulan kernel modüllerinin yüklenilmesi.
- Gerekli ise takas alanının etkinleştirilmiş olması:

      # swapon /dev/sdxY

- Gerekli ise internet bağlantısının kurulu olması.

## Kullanım

Not:

- hostnamectl, localectl ve timedatectl gibi bazı systemd araçları aktif bir dbus bağlantısına ihtiyaç duyduklarından, chroot ortamı içerisinde kullanılamamaktadır. [1]
- Chroot'un yeni kök dizini (`/`) olarak hizmet verecek dosya sistemi erişilebilir olmalıdır. (yani şifresi çözülmüş, bağlanılmış (mounted))

Aşağıda belirtildiği üzere chroot'un kullanımı için iki ana seçenek bulunmaktadır.

### arch-chroot'un kullanımı

`arch-chroot` bash komut dosyası, arch-install-scripts paketinin bir parçasıdır. Komut dosyası `/usr/bin/chroot` programını çalıştırmadan önce `/proc` gibi API dosya sistemlerini bağlamakta ve `/etc/resolv.conf` dosyasını chroot'dan erişilebilir kılmaktadır.

#### Bir chroot'a girilmesi

arch-chroot komutu, kullanılacak yeni kök dizini ilk argümanda olacak şekilde çalıştırılmaktadır.

    # arch-chroot /yeni/kök/dizininin/yeri

Örnek olarak, kurulum rehberine göre bu dizin `/mnt` olmalıdır.

    # arch-chroot /mnt

chroot'dan çıkmak için exit komutu kullanılmaktadır:

    # exit

#### Var olan bir kurulum üzerinde chroot işleminin gerçekleştirilmesi

`lsblk` komutunu çalıştırın ve kurulumunuzun disk bölümü düzenini bir kenara not edin. Bu genellikle SATA diskler için `/dev/sdXY`, NVMe diskler için ise `/dev/nvme0nXpY` formatında olacaktır.

Dosya sistemini bağlayın:

    # mount /dev/sdXY /mnt

Ek olarak, sisteminizde bir EFI sistem bölümü var ve üzerinde değişiklikler (örneğin vmlinuz'u veya initramfs imajlarını güncellemek) yapmanız gerekiyor ise:

    # mount /dev/sdXZ /mnt/esp

Son olarak, chroot'a giriş yapın:

    # arch-chroot /mnt

Chroot'dan çıkmak için:

    # exit

komutunu kullanın.

Böylece var olan kurulumunuzda bulunan işlemlerin bir çoğunu yapabilirsiniz. Ancak D-Bus'ı gerektiren bazı işlemler, #Kullanım bölümünde belirtildiği gibi çalışmayacaktır.

#### Tek bir komutun çalıştırılması ve çıkış yapılması

chroot'dan bir komut çalıştırıp sonrasında çıkmak için komut satırının sonuna ekleyin:

    # arch-chroot /yeni/kök/dizininin/yeri benim_komutum

Örnek olarak, `/mnt/arch` konumundaki chroot için `mkinitcpio -p linux` komutunun çalıştırılması şu şekilde yapılmaktadır:

    # arch-chroot /mnt/arch mkinitcpio -p linux

### chroot'un kullanımı

Uyarı: `--rbind` parametresi kullanılırken `dev/` ve `sys/` gibi bazı alt dizinlerin bağlantısı kaldırılamayacaktır. Böyle bir durumda `umount -l` komutu ile bağlantıyı kaldırmaya çalışmak oturumu bozacaktır ve bu durum ise yeniden başlatmayı gerektirecektir. Mümkünse, `--rbind` parametresinin yerine `-o bind` parametresini kullanın.

Aşağıdaki örnekte `/yeni/kök/dizininin/yeri` dizini yeni kökün bulunduğu dizindir.

Öncelikle, geçici API dosya sistemlerini bağlayın:

    # cd /yeni/kök/dizininin/yeri
    # mount -t proc /proc proc/
    # mount -t sysfs /sys sys/
    # mount --rbind /dev dev/

Ve isteğe bağlı olarak:

    # mount --rbind /run run/

Eğer UEFI bir sistem kullanıyorsanız, EFI değişkenlerine de erişmeniz gerekecektir. Aksi takdirde, GRUB'ı yükleme işlemi sırasında `UEFI variables not supported on this machine`(UEFI değişkenleri bu makinede desteklenmemektedir) gibi bir mesaj alabilirsiniz:

    # mount --rbind /sys/firmware/efi/efivars sys/firmware/efi/efivars/

Ardından, chroot ortamında internet bağlantısını kullanmak için DNS ayrıntılarını kopyalayınız:

    # cp /etc/resolv.conf etc/resolv.conf

Son olarak, bash kabuğu kullanarak kök dizinini `/yeni/kök/dizininin/yeri` dizinine değiştirin.

    # chroot /yeni/kök/dizininin/yeri /bin/bash

Not: Eğer aşağıdaki hatayı alırsanız:

- `chroot: cannot run command '/usr/bin/bash': Exec format error`, ana bilgisayar ortamının ve chroot ortamının mimarilerinin eşleşmemesi büyük bir olasılıktır.
- `chroot: '/usr/bin/bash': permission denied`, çalıştırma izni ile yeniden bağlamaya çalışın: `mount -o remount,exec /yeni/kök/dizininin/yeri`.
  - Eğer kontrol etmek yardımcı olmadıysa, yeni ortamın temel bileşenlerinin sağlam olduğundan emin olun.(Eğer kök dizini bir Arch kökü dizini ise pacutils paketinden `paccheck --root=/yeni/kök/dizininin/yeri --files --file-properties --md5sum glibc filesystem` komutunu deneyin.)

chroot işlemini gerçekleştirdikten sonra, yerel bash yapılandırma dosyasını yüklemek gerekebilmektedir:

    # source /etc/profile
    # source ~/.bashrc

İpucu: İsteğe bağlı olarak, chroot ortamını diğer ortamlardan ayırt edebilmek için özgün bir komut istemi oluşturulabilmektedir:

    # export PS1="(chroot) $PS1"

chroot ile yapılcak işlemler tamamlandığında, şu komut ile çıkış yapılabilmektedir:

    # exit

Ardından geçiçi dosya sistemlerinin bağlantısını kaldırın:

    # cd /
    # umount --recursive /yeni/kök/dizininin/yeri

Not: Eğer aşağıdaki gibi bir hata alıyor iseniz:

`umount: /path: device is busy` bu genellikle bir programın (bir kabuğun bile) chroot ortamında çalışır konumda bırakıldığını veya bir alt bağlamanın hala mevcut olduğunu belirtmektedir. Programdan çıkın ve `findmnt -R /yeni/kök/dizininin/yeri` komutunu kullanarak alt bağlantıları bulun ve `umount` komutu ile bu alt bağlantıları kaldırın. Bir bağlantıyı kaldırma sırasında `umount` komutunun kullanılması sıkıntı çıkarmakta ise `umount --force` komutu kullanılabilir. Eğer bu da işe yaramaz ise son çare olarak bağlantıları serbest bırakmak için `umount --lazy` komutunu kullanın. Her iki durumda da güvende olmak ve gelecekteki olası çakışmaları önlemek için `reboot` komutunu kullanarak sistemi yeniden başlatın.

## chroot'dan grafik tabanlı uygulamaları çalıştırma

Eğer sistemde çalışan bir X sunucusu bulunmakta ise, chroot ortamından direkt olarak grafik tabanlı uygulamalar başlatılabilmektedir.

chroot ortamının bir X sunucusuna bağlanmasına izin vermek için, X sunucusu içerisinde sanal bir terminal açınız (örn. halihazırda girişi yapılmış bir kullanıcının masaüstünde), ardından herhangi bir kimsenin, kullanıcının X sunucuna bağlanmasına izin vermek için xhost komutunu çalıştırın (ayrıca bakınız Xhost):

    $ xhost +local:

Ardından, uygulamaları X sunucusundan chroot ortamına yönlendirmek için, chroot ortamındaki DISPLAY ortam değişkeninin değerini, X sunucusunun sahibi olan kullanıcının DISPLAY ortam değişkeninin değerine eşitleyin. Yani, X sunucunun sahibi olan kullanıcı olarak DISPLAY ortam değişkeninin değerini öğrenmek için aşağıdaki komutu çalıştırın:

    $ echo $DISPLAY

Eğer değer (örneğin) ":0" ise, chroot ortamında:

    # export DISPLAY=:0

komutunu çalıştırın.

## Kök izni ayrıcalıkları olmadan çalıştırma

Chroot çalışmak için kök izni ayrıcalıklarına ihtiyaç duymaktadır. Ancak bazı durumlarda kullanıcıdan bu izinler istenmemekte veya kullanıcının bu izinleri elde etmesi mümkün olmamaktadır. Böyle durumlarda, alternatif uygulamalar kullanarak chroot'un işleyişini taklit etmenin çeşitli yolları vardır.

### PRoot

Görünen kök dizinini değiştirmek için PRoot uygulaması ve kök izni ayrıcalıkları olmadan `mount --bind` komutu kullanılabilmektedir. Bu durum, uygulamaları tek bir dizine sınırlamak veya farklı bir işlemci mimarisi için derlenmiş programları çalıştırmada kullanışlı olabilmektedir, ancak tüm dosyaların ana bilgisayar sistemindeki kullanıcıya ait olması nedeni ile bu işlemin sınırlamaları vardır. PRoot uygulaması, bu sınırlamaların bazıları için geçici bir çözüm olarak (daha sınırlı da olsa) fakeroot durumuna benzeyen `--root-id` parametresini sağlamaktadır.

### Fakechroot

fakechroot, chroot'un çağırılmasını engelleyen ve sonuçları taklit eden bir kütüphanedir. fakeroot uygulaması ile birlikte, normal bir kullanıcı olarak chroot işlemini taklit etmede kullanılabilmektedir.

    $ fakechroot fakeroot chroot ~/my-chroot bash

### Unshare

util-linux paketinin bir parçası olan Unshare, yeni bir kernel alan adı oluşturmak için kullanılabilmektedir. Bu, sıradan chroot komutu ile birlikte de çalışmaktadır. Örneğin:

    $ unshare --map-root-user chroot ~/namespace /bin/sh

## Sorun Giderme

### arch-chroot: /yeni/kök/dizininin/yeri konumu bir bağlantı noktası değildir. Bu işlemin istenmeyen yan etkileri olabilir.

`arch-chroot /yeni/kök/dizininin/yeri` komutunu çalıştırırken bir uyarı mesajı verilebilmektedir:

    ==> WARNING: /yeni/kök/dizininin/yeri is not a mountpoint. This may have undesirable side effects.

Bu mesajın açıklaması için ve bir bağlama montajı örneğinde chroot dizinini bir bağlama noktası olarak kullanmak için arch-chroot(8) rehber sayfasına bakınız.

## Ayrıca Bakınız

- Temel Chroot

Categories:

- System recovery (Türkçe)
- Sandboxing (Türkçe)
- Commands (Türkçe)