Dosya Sisteminin Hazırlanması
Bu bölümde busybox ile temel bir dosya sisteminin nasıl hazırlandığına bakacağız, benzer anlatım bir sonraki konu olan Raspberry Pi bölümünde de bulunmaktadır. Dosya sistemi hazırlanmasıyla ilgili daha detaylı bilgiler için ise Kök Dosya Sistemi Oluşturma başlıklı bölümü inceleyebilirsiniz.
Biz burada konunun bütünlüğünü korumak için kullandığımız derleme seti ile temel bir dosya sistemini /opt/orangepi/RootFS/
altında oluşturacağız.
Busybox
Busybox
kodlarını aşağıdaki gibi indirip derleyebiliriz. İstenirse öngörülen ayar dosyası make defconfig
işlemi sonrasında make menuconfig
ile özelleştirilebilir.
$ cd /opt/orangepi
$ git clone git://busybox.net/busybox.git
$ cd busybox/
$ make defconfig
$ make CROSS_COMPILE=arm-linux-gnueabihf-
Bu işlem sonucunda busybox
dosyası oluşacaktır. Bu aşamadan sonra gerekli sembolik linkler oluşturulmadır. Bu işlem için Makefile dosyası install
isimli bir hedef barındırmaktadır. Bu işlemden önce dosya sistemini kendi bilgisayarımızda nerede oluşturacağımıza karar vermeliyiz. Biz bu amaçla /opt/orangepi/RootFS
dizinini kullanacağız. İlk olarak bu dizin altındaki dosyaların sahibi olarak kendi kullanıcımızı tanımlayalım.
$ sudo chown -R $USER /opt/orangepi/RootFS/
Derleme işleminden sonra make install
dediğimizde _install
adlı bir dizin altında, ihtiyaç duyduğumuz sembolik linkleri barındıran, /bin
, /sbin
ve /usr
dizinleri oluşacaktır. CONFIG_PREFIX
değişkenini kullanarak bu dizinleri, _install
dizini yerine, RootFS altında aşağıdaki gibi oluşturabiliriz.
$ make CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_PREFIX=/opt/orangepi/RootFS install
Bu işlem sonucunda RootFS dizininde aşağıdaki dosyalar oluşmuş olmalıdır.
drwxrwxr-x 2 serkan serkan 4096 Ağu 17 18:24 bin
lrwxrwxrwx 1 serkan serkan 11 Ağu 17 18:24 linuxrc -> bin/busybox
drwxrwxr-x 2 serkan serkan 4096 Ağu 17 18:24 sbin
drwxrwxr-x 4 serkan serkan 4096 Ağu 17 18:24 usr
Temel Kütüphanelerin Taşınması
Cihaz üzerinde çalışacak busybox ve diğer uygulamalar libc
ve libm
gibi birtakım temel kütüphanelere ihtiyaç duymaktadır. Bu kütüphaneleri kullandığımız derleyici setinden temin edeceğiz.
Derleyici, derleme esanasında kullandığı hedef sisteme ait kütüphane ve başlık dosyalarını sysroot denilen bir dizin yapısında saklamaktadır. Bu dizin yapısını aşağıdaki gibi öğrenebiliriz.
$ arm-linux-gnueabihf-gcc --print-sysroot
Bu dizinden yapacağımız kopyalama işlemlerini basitleştirmek için bu dizini gösteren bir çevre değişkenini aşağıdaki gibi tanımlayabiliriz.
SYSROOT=$(arm-linux-gnueabihf-gcc --print-sysroot)
RootFS
altında /lib
dizinini oluşturduktan sonra ilk planda ihtiyaç duyduğumuz kütüphaneleri aşağıdaki gibi kopyalayabiliriz.
$ mkdir -p /opt/orangepi/RootFS/lib
$ cp $SYSROOT/lib/libc.so.6 /opt/orangepi/RootFS/lib/
$ cp $SYSROOT/lib/libm.so.6 /opt/orangepi/RootFS/lib/
$ cp cp $SYSROOT/lib/ld-linux-armhf.so.3 /opt/orangepi/RootFS/lib/
Kernel ve DTB Dosyasının Taşınması
Daha önce derlediğimiz kernel imajını ve dtb dosyasını RootFS
altında /boot
dizinine aşağıdaki gibi taşıyabiliriz.
$ mkdir /opt/orangepi/RootFS/boot
$ cd /opt/orangepi/RootFS
$ cp ../linux-stable/arch/arm/boot/zImage boot/
$ cp ../linux-stable/arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dtb boot/
Kernel Modüllerinin Taşınması
Kernel modülleri dosya sistemi üzerinde /lib/modules/kernel-version
şeklinde uygun dizin yapısında bulunmalıdır. Kopyalama işlemini aşağıdaki gibi yapabiliriz.
$ cd /opt/orangepi/linux-stable/
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=../RootFS modules_install
Bu işlem sonrasında RootFS
altında lib/modules/4.13.0
gibi bir dizin oluşmalıdır.
Açılış Betiğinin Hazırlanması
İşletim sistemi çekirdeği açılış sürecini tamamladığında, dosya sistemi üzerinde bir takım öntanımlı dizinlere bakarak, init
isimli bir uygulamayı aramaktadır. İlk çalışan uygulama olan init
/etc/inittab
isimli bir dosyayı okuyarak gerekli işlemleri yapmaktadır.
İlk olarakRootFS
altında dosya sistemi için temel dizinleri aşağıdaki gibi oluşturalım.
$ cd /opt/orangepi/RootFS
$ mkdir etc dev proc sys tmp var
Basit bir inittab
dosyasının içeriği aşağıdaki gibi olabilir.
# /etc/inittab
::sysinit:/etc/rcS
::askfirst:-/bin/sh
::shutdown:/bin/sync
::shutdown:/bin/umount -a -r
inittab
içerisinde sysinit
ile başlayan satırda rcS
açılış betiğinin çalıştırıldığını görüyoruz. Açılışa ilişkin temel işlemler bu betik içinde yapılmaktadır. Temel bir açılış betiği aşağıdaki gibi olabilir.
#!/bin/sh
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t tmpfs -o mode=1777 tmpfs /tmp
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 devpts /dev/pts
mkdir /dev/shm
mount -t tmpfs -o mode=0777 tmpfs /dev/shm
mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /var
ifconfig lo 127.0.0.1 up
route add -net 127.0.0.0 netmask 255.0.0.0 gw 127.0.0.1 lo
mount -o remount -o rw /
Son durumda RootFS dizinimizin içeriği aşağıdaki gibi olmalıdır.
$ tree -L 1 RootFS/
RootFS/
├── bin
├── boot
├── dev
├── etc
├── lib
├── linuxrc -> bin/busybox
├── proc
├── sbin
├── sys
├── tmp
├── usr
└── var
Bu aşamadan sonra SD kartın hazırlanması kısmına geçebiliriz.