Chroot adından da anlaşılacağı üzere change root olarak, kök dizini değiştirme ya da başka bir deyişle izole edilmiş farklı sanal kök dizinleri oluşturmak için kullanılır. Yani servis ve uygulamaların çalıştırdığı her bir process’in gördüğü ya da çalıştığı “root” “kök” “/” dizini değiştirmek için kullanılır.

İnternetten bulduğum aşağıdaki görsel ile durum daha kolay anlaşılabilir.

Crepe

Şimdi biz chroot’u kullanarak kendi process’lerimiz için oluşturacağımız sanal root dizini ile Linux ve Container için dosya sistemi izolasyon konusunu anlamaya çalışalım.

NoT: Bash, her kullanıcı için ilk başlangıç progress’idir(çünkü bash ile yönetimimizi gerçekleştiririz), her hizmet ve uygulama altında çalışan süreçler olarak yer alır. Bundan ötürü bizde bash’e chroot uygulayarak konuyu ele alacağız.

İlk önce kendi sanal root directory’imizi oluşturalım

mkdir jailroot

Sonra komutları atacağımız bin klasörünü oluşturalım

mkdir jailroot/bin

Akabinde bash ve istediğimiz binary executable(komutlar)leri bu dizin altına atacağız. Ben bash, ps, pwd, ls, cat, mount, w, id, tree komutlarını bu dizin altına atacağım ve onunla beraber bir takım klasörler oluşturacağım.

Fakat bu komutların çalışabilmesi için bağımlı olduğu kütüphaneleri de bu sanal root(jailroot) dizinin altına gönderilmesi gerekir.

Bash ve diğer komutlara ait bağımlı lib’leri görebilmek için “ldd” ve “readelf” komutlarını kullanabilirsiniz.

ldd /bin/bash
readelf -d /bin/bash | egrep -i "needed|rpath"

Crepe

Şimdi dosyaları sanal root(jailroot)un altına atalım. Tabi bağımlı kütüphane dosyalarını da gönderelim. Normalde yukarıdaki komutlar ile sadece kullanacağınız komutların kütüphane dosyalarını bulup atabilirsiniz ama ben direk uğraşmadan olduğu gibi atıyorum.

cp -a /lib jailroot/

cp -a /lib64 jailroot/

cp /bin/bash jailroot/bin/

cp /bin/ls jailroot/bin/

cp /bin/cat jailroot/bin/

cp /bin/mount jailroot/bin/

cp /bin/ps jailroot/bin/

cp /bin/pwd jailroot/bin/

cp /usr/bin/w jailroot/bin/

cp /usr/bin/id jailroot/bin/

cp /usr/bin/tree jailroot/bin/

Hiyerarşiye uygun bir takım klasörler oluşturalım.

mkdir	jailroot/opt

mkdir	jailroot/var

mkdir	jailroot/tmp

Son olarak change root yapalım.

chroot jailroot /bin/bash

Crepe

Tüm attığımız komutlar çalışıyor, özellikle pwd ve tree komutlarını çalıştırdığınızda kök directory’nin izole olarak göründüğünü fark edebilirsiniz. Fakat w ve ps koutlarında aşağıdaki gibi uyarı alacaksınız.

Crepe

Bu komutların çalışabilmesi için en tepedeki /proc süreçler dosyalarının saklandığı dizinin proc olarak chroot alanına mount(mount proc /proc -t proc) edilmesi gerekiyor uyarısı veriyor.

Bu yüzden aşağıdaki gibi proc klasörünü oluşturalım ve mount komutunu çalıştıralım.

mkdir	jailroot/proc
mount proc /proc -t proc

Ve sırasıyla w, ps ve mount komutlarını run edersek sorunsuz bir şekilde çalıştığını görebiliriz.

Crepe

Böylelikle dosya sistemi izolasyon konusunu, hatta volume mount konusuda aklımıza yakınlaştırmış olduk.

Tabi konu aslında bunlarla sınırlı değil kaldı ki chroot tam yalıtım sağlamaz ve etkileri yalnızca kök bağlama noktasıyla sınırlıdır. Asıl önemli olan namespaces’ler ve cgroup’lardır ki container teknolojileri bunların üzerine bina edilmiştir.