:::: MENU ::::
Posts tagged with: pandaboard

SELinux entegrasyonu nasil yapilir?

SELinux çalışan bir Linux sistemini ayaga kaldırmak için gereken çalışmalar anlatılacaktır. 

Kernel seviyesinde SELinux

Kernel’in derleneceği toolchain, 2014-09 linaro arm-linux-gnueabihf’nin SELinux özelinde geliştirilmiş halidir. Repo adresi: https://github.com/eckucukoglu/arm-linux-gnueabihf

Kernel olarak 3.10.80 Linux kernel’i kullanılacaktır. 
omap2plus_defconfig ile konfigüre edilen kernelde, ardindan ethernet için usb, eger pandaboard es chipsee expansion board kullaniliyorsa, ekranı için chipsee dpi, input device için touchscreen ads7846 sürücüleri açılabilir.

Ardından SELinux için gerekli konfigurasyon ayarları açılmalıdır. Bunlar:

Ayrıca kullanılan filesystem için ‘extended attribute’ desteği açılmalıdır. Bunlar ise (ext2 filesystem için):

Diğer SELinux ayarları da incelenip, ihtiyaca göre kullanılabilinir. Bunlara ek olarak debug amaçlı low-level debugging özelliği de açılabilir.

Userspace seviyesinde SELinux

Userspace’de selinux kütüphanelerini derledikten sonra rootfs içerisine koymalıyız. Fakat öncelikle buildroot ile ihtiyaç duyulan temel araçları içeren bir rootfs paketi cikartilabilinir.

Cikan rootfs icerisinde asagidaki degisiklikler, ihtiyaca gore, uygulanabilir:

  • NFS kullanildigi durumda, /etc/network/interfaces dosyasından dhcp servisi kapatılmalı, cihaz nfs kullanıyorsa network bilgileri girilmelidir.
  • auditd kullaniliyor ve baslatilmasinda sikinti varsa: /etc/audit/auditd.conf dosyasının owner’ı değiştirilmeli ve dispatcher adresi güncellenmeli. (audit deamon çalışması için yapılmaktadır. /etc/init.d/S01auditd start yazarak manuel başlatılarak, hata vermesi durumunda /var/log/messages kontrol edilebilinir.)
  • libpcre.so.3 (sistemdeki libpcre’e bağlanacak) symlink oluşturulmalı. (buildroot rootfs’lerinde karsilastigim bir hata, cozumunu bu sekilde sagliyorum.)
  • m4 binary’si /usr/bin içerisine atılacak. (refpolicy-arm için gerekli)

Bu işlemlerin ardından şu repodaki selinux derlenmelidir: https://github.com/eckucukoglu/selinux-arm
Derleme esnasında yine aynı toolchain kullanılacaktır. Çıkan dosyalar olduğu gibi rootfs içerisine kopyalanabilir.

Reference policy yükleme

Sistemimizde SELinux userspace kütüphaneleri ve araçları yer alıyorsa, bir sonraki aşamada SELinux reference policy project derlenerek sisteme yüklenmelidir. Bu policy içerisinde, gömülü bir sistemin ihtiyaçlarından çok fazlası yer almaktadır. Bu nedenle direkt olarak reference policy’nin kullanılması doğru değildir. Gömülü, mobil sistemlerin ihtiyaçları doğrultusunda aşamalı olarak kırpılması gerekmektedir.

Reference policy project için su repo kullanilmistir: https://github.com/eckucukoglu/refpolicy-arm

Burada önemli olan nokta contrib modülü (policy/modules/contrib) bir subproject olduğu için, proje clone’lanırken bu dizin içindeki dosyaların varlığı kontrol edilmelidir.

Proje içinde çalışmaya başlamadan önce “make bare” diyerek olası ihtiyaç dışı dosyaları temizlemek gerekebilir.
Öncelikle build.conf dosyası aşağıdaki ayarlar geçerli olacak şekilde güncellenmiştir:

Ardından derleme işlemine geçmeden önce, sistemin ihtiyaç duyduğu libaudit.so desteği sağlanmalıdır. Eğer sistemde mevcut bir libaudit.so dosyası varsa, ihtiyaç duyulana linklenebilir. Örnek vermek gerekirse sistemde libaudit.so.0 aranıyor fakat libaudit.so.1 mevcut ise, şu şekilde bağlantı oluşturulabilinir:

modular seçim için:

Bu işlemlerin ardından rootfs içerisine, policy derleme ve yükleme işlemleri esnasında ihtiyaç duyulacak aşağıdaki uygulamalar derlenerek sistem içerisine atılmalıdır:

  • m4 (make conf esnasında kullanılır)
  • gawk (make base esnasında kullanılır)
  • make
  • python

İlerde çağrılacak komutlardan make conf için xml.dom.minidom paketi gerekmektedir. Bu sebeple python’un derlenirken içerisinde bu paketin ve bağlantılı paketlerin yer aldığından emin olmak gerekiyor.

Burada python için libtinfo, libssl, libcrypto kütüphaneleri sistemde hazır bulunmalıdır.

Bu işlemlerin ardından sırasıyla aşağıdaki komutlar çalıştırılacaktır. İşlevlerini öğrenmek için SELinux notebook sayfa 256-257’ye bakılabilir.

monolithic seçim için:

Buildroot üzerinden  çıkartılan rootfs üzerine, (bu sistemde gawk, python, auditd, setools, make yüklü olmalidir) şu işlemler yapılmalıdır:

  • m4 sistem içerisine yüklenmelidir.
  • ardından refpolicy-arm içerisinde sırasıyla şu komutlar çalıştırılmalıdır:

Reference policy işlemlerinin ardından /etc/selinux/config dosyasının aşağıdaki içerik ile oluşturulması gerekmektedir:


Buildroot kullanimi

Genel hatlarıyla versiyon seçimleri ve konfigürasyon değerleri buildroot ozelinde değişkenlik gösterebilir. Buildroot detaylarina; mimari, toolchain, kernel, target packages secimlerinin detaylarina girilmeyecektir. Fakat bu yazida stabil çalışan pandaboard dagitimi icin yapilacak seçim ve değerleri bulabilirsiniz. Ayrica buildroot uzerinden kernel’e build time’da nasil yama yapilacagi da, preempt_rt yamasiyla orneklenecektir.

İndirme

Buildroot versiyon 2014.11-rc1, http://git.buildroot.net/buildroot/snapshot/buildroot-2014.11-rc1.tar.gz adresinden indirilir.

Buildroot ana konfigürasyonu

buildroot-pandaboard-linux.config indirilip, buildroot dizininde:

diyerek acilan menuden bu konfigürasyon dosyası yüklenir.

Realtime yaması

Bu konfigürasyon dosyasının realtime ile ilgili ihtiyacı olan diğer dosyalar ve menüdeki ilgili yerleri şu şekildedir:

Realtime preempt_rt yamasını uygulamak istiyorsak:

Derleme ve çıktılar

make diyerek derleme işlemlerinin çalışması sağlanır. Bootloaders -> U-Boot version: ayarına 2011.11.2 girilmesi durumunda buildroot/output/images altindaki

dosyaları sd-karta atılır. Sd-kartın tek bir partition şeklinde fat-32 kullanarak formatlanmış ve boot etme yeteneği atanmış olması gerekmektedir.

https://github.com/eckucukoglu/linux-tools/tree/master/make-sdcard incelenerek, ihtiyaca uygun hale getirilebilinir.

Bootloaders -> U-Boot version: 2013.01.01 girilmesi durumunda (4460 pandaboard u-boot versiyonu için bu versiyon kullanılmaktadır) sd-kart içerisine /output/images/u-boot.bin yerine  output/build/uboot-2013.01.01/u-boot.img  konulmalıdır.

Aynı zamanda sd-kart içerisine konulacak boot.scr dosyası şu şekilde oluşturulur:

içeriği ile oluşturulacak boot_mmc.txt dosyasından,

komutu ile boot.scr oluşturulur ve sd-kart ana dizinine diğer dosyaların yanına atılır.

Pandaboard’a takılacak sd-kart boot edecek ve komut istemini verecektir.

  • Derlenirken izlek oluşturmamak için -jX parametresi girilmemelidir.
  • Adımlar izlenirken öncelikli kaynak olarak [2] kullanılmıştır.
Referanslar

[1]: http://www.linux-magazine.com/Online/Features/Qemu-and-the-Kernel
[2]: http://fooprotected.wordpress.com/2014/03/13/buildroot-linux-on-the-pandaboard-rev-3/
[3]: http://www.rte.se/blog/linux-0/buildroot-basics-building-real-target-pandaboard/1.2
[4]: http://elinux.org/Panda_How_to_buildroot
[5]: http://delog.wordpress.com/2011/09/04/custom-embedded-linux-system-for-pandaboard-with-buildroot/


Pandaboard ES’de NFS kullanarak root dosya sistemini calistirmak

Pandaboard ES platformları üzerinde kullanilan dosya sistemleri için sd/mmc blok kullanmak yerine NFS kullanarak, geliştirme yapilan bilgisayari kullanmak mümkündür.

Bunun için ana hatlarıyla şu işlemler yapılmalıdır:

  1. NFS ve Pandaboard ES konfigürasyonları düzgün yapılmış bir Linux kernel.
  2. u-boot ayarları ve derlenmesi.
  3. Geliştirme yapılan bilgisayarda network ve NFS ayarları.
  4. otomatize hale getirmek için boot.scr oluşturulması.
  5. udhcpc sisteminin deaktifleştirilmesi.

Kernel konfigürasyonu

Linux kernel omap2plus_defconfig kullanılarak konfigüre edildikten sonra, menuconfig ile girilen menüde aşağıdaki seçenek aktifleştirilmeli:
Device Drivers -> USB support CONFIG_USB_SUPPORT -> EHCI HCD (USB 2.0) support CONFIG_USB_EHCI_HCD

Her ne kadar omap2plus_defconfig aşağıdaki ayarları otomatik açıyor olsa da, kontrol etmekte fayda var:

Networking support
–> [*] TCP/IP networking CONFIG_INET
–> –> [*] IP: kernel level autoconfiguration CONFIG_IP_PNP
–> –> –> [*] IP: DHCP support CONFIG_IP_PNP_DHCP
–> –> –> [*] IP: BOOTP support CONFIG_IP_PNP_BOOTP
–> –> –> [*] IP: RARP support CONFIG_IP_PNP_RARP
Device Drivers
–> [*] Network device support CONFIG_NETDEVICES
–> –> USB Network Adapters
–> –> –> [*] SMSC LAN95XX based USB 2.0 10/100 ethernet devices CONFIG_USB_NET_SMSC95XX
File systems
–> [*] Network File Systems CONFIG_NETWORK_FILESYSTEMS
–> –> NFS client support CONFIG_NFS_FS
–> –> –> [*] NFS client support for NFS version 3 CONFIG_NFS_V3 –> [*] Root file system on NFS CONFIG_ROOT_NFS

Bu ayarlar ile derlenen kernel ve device tree blob (gerekiyorsa) sd-kart içerisine atılmalıdır.

Not: Bazı kernel sürümlerinde aşağıdaki ayarları da açmak gerekebilir:
CONFIG_USB_PHY
CONFIG_NOP_USB_XCEIV

u-boot işlemleri

Aşağıdaki adresten güncel u-boot versiyonu indirilebilinir:
ftp://ftp.denx.de/pub/u-boot/u-boot-latest.tar.bz2

Ardından u-boot ana dizini içerisinde

komutları kullanılarak u-boot.img dosyası oluşturulmalı ve sd-kart içerisine atılmalıdır.

Geliştirme yapılan bilgisayar ayarları

/etc/exports dosyası içerisine

satırı eklenmelidir.
Ardından
sudo /etc/init.d/nfs-kernel-server restart
ile NFS server restart edilmelidir.

Daha sonra network ayarlarından yaratılacak bir ağ bağlantısı ile verilen <ip aralığı> içerisinden bir ip adresi atanmalı ve netmask <netmask adresi>, gateway <gateway adresi> olarak ayarlanmalıdır.

Boot scripti oluşturmak

Pandaboard içine atılan u-boot üzerinde saveenv komutunun yer almadığını göreceksiniz. Benzer sekilde, kernel ve bootloader’u da tftp ile transfer etmeyi pandaboard es rev3 platformlar icin basaramadim. Bu nedenle u-boot’un argümanlarını boot.scr dosyasından almasını sağlamamız gerekiyor. Bu nedenle aşağıdaki satırları içeren boot.script dosyasını oluşturmak gerekiyor, lütfen ilgili değişkenleri kendi ayarlarınıza göre değiştirin:

Ardından oluşturulan boot.script dosyası aşağıdaki komutla derlenerek boot.scr dosyası oluşturulmalıdır:

Oluşturulan boot.scr dosyası sd-kart içerisine atılmalıdır.

Platform network ayarları

Şu anda sd-kart panda üzerinde çalıştırıldığında başarılı bir şekilde istenen remote dizinden dosya sistemini kullanacaktır. Fakat eğer dhcp servisi aktifleştirilmiş ise komut istemi kullanıcıya verilmeden önce u-boot ile kernele atanan ip adresi değiştirilmeye çalışılacak ve bu nedenle de NFS ile olan bağlantı kopacaktır. Bunun önüne geçmek için platform dosya sistemi içerisindeki /etc/network/interfaces dosyasındaki
iface eth0 inet dhcp
satırı çıkartılmalıdır.
Manual olarak aşağıdaki ayarlar kullanılabilinir:

Örnek değişken değerleri:


Display panel and touchscreen driver support for Pandaboard ES

Chipsee pandaboard expansion set comes with ubuntu-precise kernel. Even though, modified files are already indicated by readme files, as far as i know there isn’t any vanilla kernel integration of expansion set drivers.

To achieve that, I analyzed some linux kernel patches* from version 3.2 through version 3.10.80. And then, modified both chipsee provided files and kernel files.

These are the changed files:

And this is the related commit:
https://github.com/eckucukoglu/sober-kernel/commit/f6820c3a926b6ffd685b47f5ac9d4aac7b78dc26

Although, it is not proper to implement platform spesifics in dss-common.c, since it is an experimental work, i didn’t hesitate to do that.

After patching kernel, one should calibrate the touchscreen. Tslib (http://processors.wiki.ti.com/index.php/Tslib) is the hardware handling utility and it has ts_calibrate tool to do that. However, before executing ts_calibrate, some environment variables should be set:

Moreover, in TSLIB_CONFFILE, module_raw input line has to be commented out.

After all of them, to run a qt application in linux frame buffer, these arguments should be passed:

X, Y, Z numbers can be checked from /sys/class/input.

*: Here are the kernel patches that I analyzed:
http://permalink.gmane.org/gmane.linux.kernel.commits.head/335192
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a8d5e41cef43bd740ca7c56ff316bdee30040a91
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a9105cb5c25aa335b11088549927a8aa9eaa7ef2
http://www.spinics.net/lists/linux-omap/msg86741.html
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=54b956b903607
http://permalink.gmane.org/gmane.linux.ports.arm.omap/87206
http://permalink.gmane.org/gmane.linux.ports.arm.omap/73541
http://lists.infradead.org/pipermail/linux-arm-kernel/2011-December/076194.html
http://lists.infradead.org/pipermail/linux-arm-kernel/2012-October/128063.html
http://lkml.iu.edu/hypermail/linux/kernel/1007.3/02904.html
http://lists.infradead.org/pipermail/linux-arm-kernel/2011-February/040712.html