chroot (Türkçe)
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
- 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
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ı
--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
-
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
.
chroot işlemini gerçekleştirdikten sonra, yerel bash yapılandırma dosyasını yüklemek gerekebilmektedir:
# source /etc/profile # source ~/.bashrc
# 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
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
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.