CentOS ve RHEL'e LXC Kurulumu
Tags: lxc, rhel, installation
Published: 2021-10-12 08:45:46

LXC, Linux Konteyner altyapısı olarak bilinen bir servistir. Bu servis tam olarak Docker benzeri bir yapıya sahiptir. Linux konteynırları, tek bir Linux çekirdeği üzerinde tek bir kontrol ana bilgisayarında aynı anda birden çok sanal birimi çalıştıran hafif "sanallaştırma" yöntemleridir.

Linux çekirdeği, herhangi bir sanal makinenin başlatılmasına gerek duymadann kaynak izolasyonu (CPU, bellek, blok G/Ç, ağ vb.) için *Cgroups* olarak adlandırılan gruplar içerir.

*Cgroups* ayrıca işlem ağaçları, ağlar, kullanıcı kimlikleri ve bağlı dosya sistemleri dahil olmak üzere işletim ortamının uygulama görünümünü tamamen izole etmek için isim alanı yalıtımı (namespace isolation) sağlar.

Konteyner kapsayıcıları ise, konteyner tarafından kullanılmak istenen yani *kapsanan* bir alanı bölmek için isim alanları, cgroups grupları, chroot adı verilen kök sistem değişim yöntemini ve çekirdek özelliklerini kullanır.
LXC'de bir konteyner kapsayıcısıdır, herhangi bir sanallaştırma yöneticisi veya hiperyönetici (hypervisor) olmadan linux içerisinde konteyner oluşturmayı sağlar.

Bu yazımda CentOS ve RHEL üzerinde LXC kurulumunu anlatacağım. Başlayalım.

## Ön Gereksinimler

Her kurulumda olduğu gibi bu kurulum için de güncellemeleri yaparak başlayalım:

```bash
sudo yum update
```

LXC kurulumu esnasında kaynak kodu derlemek için `gcc` ve `make` programlarına ihtiyaç duyacağız. Yani LXC kurulumu için geliştirme araçları bize sıkça gerekmekte. Bu yüzden Development Tools grubunu kuralım:
```
sudo yum groupinstall "Development tools"
```

Ardından LXC için kullanılacak bağımlılıkları ayarlayalım. LXC iki kitaplığa bağlıdır; *libpcap* ve *libcgroup*. LXC aynı zamanda *busybox* ve *bridge-utils* yardımcı programlarını da gerektirir.
Şimdi bu paketleri kuralım:

```bash
sudo yum install libcap-devel libcgroup busybox bridge-utils
```

Son olarak hala *wget* indirme yöneticisine sahip değilsek ona da ihtiyacımız olacağını belirteyim. Kurulumu ise şu şekilde yapılmaktadır.
```bash
sudo yum install wget
```

## LXC Kurulumu

Şimdi süperkullanıcı olalım ve LXC'yi kuralım.

```bash
sudo su
```

Ayrıca süperkullanıcı olarak dosya işlemi yapacakken, kendi kişisel ev dizinimizden ayrılmamızda yarar var:
```bash 
cd
```

LXC'nin son sürümü olan lxc-4.0.x'i indireceğim şimdi:
```bash
wget https://linuxcontainers.org/downloads/lxc/lxc-4.0.10.tar.gz
```
Şimdi dosyaları çıkartalım:
```bash
tar xvf lxc-4.0.10.tar.gz
```

```bash
cd lxc-4.0.10/
```
Şimdi yapılandırmaya başlayalım:

```bash
./configure
```

Başarılı bir yapılandırma bir çıktı şu şekilde olmalı:

```
...
...
config.status: creating src/python-lxc/setup.py
config.status: creating src/lua-lxc/Makefile
config.status: executing depfiles commands
config.status: executing default commands
----------------------------
Environment:
 - compiler: gcc
 - distribution: centos
 - init script type(s): sysvinit
 - rpath: no
 - GnuTLS: no
 - Bash integration: yes
Security features:
 - Apparmor: no
 - Linux capabilities: yes
 - seccomp: no
 - SELinux: no
 - cgmanager: no
Bindings:
 - lua: no
 - python3: no
Documentation:
 - examples: yes
 - API documentation: yes
 - user documentation: no
Debugging:
 - tests: no
 - mutex debugging: no
Paths:
 - Logs in configpath: no
```

Şimdi de LXC'yi derleyelim:
```bash
make 
```

Başarılı bir inşanın bir çıktı şu şekilde olmalı:
```
...
Building full member lists recursively...
Adding members to member groups.
...
Generating style sheet...
Generating index page...
Generating page index...
Generating example documentation...
Generating file sources...
Generating code for file /root/lxc-4.0.10/src/lxc/attach_options.h...
Generating code for file /root/lxc-4.0.10/src/lxc/lxccontainer.h...
Generating code for file /root/lxc-4.0.10/src/lxc/lxclock.h...
Generating file documentation...
Generating docs for file /root/lxc-4.0.10/src/lxc/attach_options.h...
...
Generating file member index...
make[2]: Leaving directory `/root/lxc-4.0.10/doc/api'
make[2]: Entering directory `/root/lxc-4.0.10/doc'
...
Making all in hooks
make[1]: Entering directory `/root/lxc-4.0.10/hooks'
make[1]: Nothing to be done for `all'.
```

Şimdi de yine make ile kuralım:
```bash
make install
```

Başarılı bir kurulumun sonucu aşağıdaki gibi görünmelidir.
```
...
Making install in hooks
make[1]: Entering directory `/root/lxc-4.0.10/hooks'
 /bin/mkdir -p '/usr/local/share/lxc/hooks'
 /usr/bin/install -c clonehostname mountecryptfsroot ubuntu-cloud-prep squid-deb-proxy-client '/usr/local/share/lxc/hooks'
...
/bin/mkdir -p /usr/local/var/lib/lxc
/bin/mkdir -p /usr/local/var/cache/lxc
 /bin/mkdir -p '/usr/local/lib/pkgconfig'
 /usr/bin/install -c -m 644 lxc.pc '/usr/local/lib/pkgconfig'
...
```

## Bridged Adaptörü Yapılandırması

LXC konteynerlerine internet bağlamak için internet köprüsü oluşturmamız gerekecek ki bunu da bridged düzenleyerek yapacağız. Aşağıdaki *ifcfg-eth0* örneğinde gösterildiği gibi köprü bağdaştırıcı için statik IP'yi yapılandıracağız:

```bash
cd /etc/sysconfig/network-scripts	
```
Şimdi şu içeriği oluşturalım. Ancak `ifcfg-br0` dosyasının olmadığına emin olun. Önceki yapılandırmalar için kullanıldıysa veya haricinde başka bir uygulama için kullanılıyorsa sıkıntı çıkarabilir. Ayrıca aşağıda benim `xxx.xxx.xxx.xxx` olan IP adresi ile NetMask'ı kendiniz için düzenleyin.

```bash
cat > ifcfg-br0 << "EOF" 
DEVICE="br0"
BOOTPROTO="static"
IPADDR="xxx.xxx.xxx.xxx"
NETMASK="255.255.255.xxx"
ONBOOT="yes"
TYPE="Bridge"
NM_CONTROLLED="no"
EOF
```

Örneğin benim için bu dosya şu şekilde idi:

```bash
cat > ifcfg-br0 << "EOF" 
DEVICE="br0"
BOOTPROTO="static"
IPADDR="10.32.4.31"
NETMASK="255.255.224.0"
ONBOOT="yes"
TYPE="Bridge"
NM_CONTROLLED="no"
EOF
```

### Son adımlar

Son adımlarda LXC için bazı soft-link'ler oluşturmamız gerekecek. Bu linkler lxc'nin düzgün çalışması için önem arzetmekte.
Örneğin lxc'yi deneyelim:
```
# lxc-info --name test
test doesn't exist
```
Yukarıdaki `lxc-info --name test` komutu için çıktı normal ancak eğer bizim shared object bazlı bir sorunumuz varsa çıktı biraz daha değişik olacaktır. Örneğin:

```bash
# lxc-info --name test
lxc-info: error while loading shared libraries: liblxc.so.4: cannot open shared object file: No such file or directory
```

Bu durumda, bunu düzeltmek için, aşağıda gösterildiği gibi libxc.so.4 adında bir bağlantı oluşturmamız ve bu bağlantıyı, liblxc.so.xxx dosyasının doğru sürümüne bağlamamız gerekecektir.

```bash
ln -s /usr/local/lib/liblxc.so.4.0.10 /lib64/liblxc.so.4
```

## LXC Kurulumunu Doğrulamak

En son adımda, lxc ortamınızın doğru kurulduğunu doğrulamak için `lxc-checkconfig`'i  çalıştıralım.

Bu script kurulumla alakalı dört farklı bölümde çıktılar verecektir, Bunlar: 
1) İsim Alanları
2) Kontrol Grupları
3) Çeşitli ve 
4) Kontrol Noktası/Geri Yükleme. 

Sisteminizde her şey düzgün yapılandırılmışsa, yukarıdaki çıktıda, yukarıdaki gruplardaki tüm seçenekler “etkin” yazmalıdır. Örneğin:

```
# lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-4.18.0-80.el8.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroup: enabled
Cgroup namespace: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
..
--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
Bridges: enabled
Advanced netfilter: enabled
..
--- Checkpoint/Restore ---
CONFIG_EVENTFD: enabled
CONFIG_EPOLL: enabled
..
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/local/bin/lxc-checkconfig
```

Bu kılavuzda da LXC kurmuş olduk. İyi çalışmalar...