chroot (Türkçe)

İ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. Çevrilmiş tüm makelelere
buradan erişebilirsiniz
.
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/sd
xY
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/sd
XY
, NVMe diskler için ise
/dev/nvme0n
X
p
Y
formatında olacaktır.
Dosya sistemini bağlayın:
# mount /dev/sd
XY
/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/sd
XZ
/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