2012. október 24., szerda

Raspberry Pi firmware frissítés


Korábban nagyon bosszantó hiba volt a Raspberry Pi használatakor (Raspbian operációs rendszer mellett), hogy egy gyorsabb letöltésnél, egyre több ram-ot kezdett használni a Transmission, és egy idő után már nem maradt elég memória a működéséhez, ezért magától leállt a torrentkliens.
Szerencsére ez egy firmware frissítéssel megoldható, viszont sokáig nem találtam rá egy egyszerű megoldásra, amivel könnyen lehetne firmware-t frissíteni, így nagyon megörültem, amikor nem régen felfedeztem Hexxeh oldalát. Ő készített egy nagyszerű kis szkriptet, amivel nagyon egyszerű az egész:
  1. Git+ca-certificates csomag telepítése:
    sudo apt-get install git ca-certificates
  2. Szkript letöltése, telepítése, futtatási jog beállítása:
    sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && sudo chmod +x /usr/bin/rpi-update
  3. Futtatás & enjoy:
    sudo rpi-update

2012. október 4., csütörtök

Linux optimalizálása SSD-hez

  1. Első lépésként érdemes megnézni, hogy a partíciók jól lettek-e létrehozva (partition alignment megfelelő-e), de ahogy láttam a Crunchbang telepítő erre figyel, és MSDOS partíciós táblánál is (nem csak GUID Partition Table-nél, ahogy fő forrásom is írja) az első szektor 2048-nál van, ami megfelelő. Erre azért van szükség röviden, mert az SSD másképpen működik, mint a HDD: ha egy partíció nem a page size méretével osztható határon kezdődik, akkor az SSD-nek egy lap írása helyett 2 lapot kell írnia, így a sebesség és az élettartam is csökken. 25nm-es gyártási technológiánál a page size 8kB, erase block size 2MB, egy szektor 512B így kiszámolható, hogy megfelelően van eltolva a partíció.
  2. Lépés a TRIM funkció bekapcsolása. Ehhez először is 2.6.33-as vagy újabb kernellel kell rendelkezünk. Röviden a TRIM-ről: HDD esetén, ha egy fájl letörlünk, akkor az operációs rendszer az érintett szektorokat megjelöli törölhetőként és később újabb adat kiírásakor felülíródnak a korábban törölt adatok. Az SSD-nél viszont más a helyzet, mert új adatot csak üres lapokra lehet írni, törléskor azonban az operációs rendszer csak megjelöli a szektorokat törölhetőként, így azok nem tűnnek el, megjelölve továbbra is ott vannak az SSD-n. Újabb adat írásakor az erase blocknak megfelelő nagyságú részt be kell olvasni, kiírni gyorsítótárba, törölni a szükségtelen lapokat, visszaírni, majd az üres helyre az új adatokat is beírni. A TRIM egy SATA utasítás, melyet az operációs rendszer hív meg, ilyenkor ténylegesen törlődnek a szükségtelen lapok az SSD-ről. Bekapcsolásával sebességnövekedést érhetünk el.
    Ehhez az /etc/fstab fájlba kell beírnunk a discard attribútumot:
    # / was on /dev/sda1 during installation
    UUID=8a159c3a-0867-431d-a7a1-e5211fc3a8d9 /               ext4    discard 0       1
    # /home was on /dev/sda5 during installation
    UUID=fc76149a-8a7d-43eb-a676-56ae599c440a /home           ext4    defaults,user_xattr,discard 0        0       2
  3.  Az előző lépéshez hasonlóan az /etc/fstab fájlban érdemes beállítani a noatime attribútumot is. Így a rendszer nem írja ki fájloknál az utolsó hozzáférés idejét, ezzel rengeteg erőforrást megspórolva.
    # / was on /dev/sda1 during installation
    UUID=8a159c3a-0867-431d-a7a1-e5211fc3a8d9 /               ext4    noatime,discard 0       1
    # /home was on /dev/sda5 during installation
    UUID=fc76149a-8a7d-43eb-a676-56ae599c440a /home           ext4    defaults,noatime,user_xattr,discard 0        0       2
  4. Az alapértelmezett IO ütemező Crunchbang-ben a CFQ (Complete Fair Queueing Scheduler), mely a HDD olvasó/író fej helyzetét is figyelembe veszi működése során. Az SSD-nél ennek nincsen értelme, így érdemes átállítani az ütemezőt Deadline, vagy Noop ütemezésre:
    printf 'ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"' | sudo tee /etc/udev/rules.d/60-ssd-scheduler.rules
  5. Néhány könyvtárat, amelyekbe nagyon gyakran történik írás, nem túl jó az SSD-n tárolni, hogy ne csökkenjen az SSD élettartama számottevően. Ezeket a könyvtárakat átmeneti fájlrendszerként érdemes felcsatolni, így ezek soha nem íródnak ki a lemezre, újraindításkor tartalmuk törlődik. Felcsatolásukhoz a /etc/fstab fájlba írjuk a következőket:
    tmpfs   /tmp       tmpfs   defaults,noatime,mode=1777   0  0
    tmpfs   /var/log   tmpfs   defaults,noatime,mode=0755   0  0
    tmpfs   /var/spool tmpfs   defaults,noatime,mode=1777   0  0
    tmpfs   /var/tmp   tmpfs   defaults,noatime,mode=1777   0  0
    Én a két tmp könyvtárat, a napló fájlok könyvtárát, és a futásra váró folyamatok könyvtárát helyeztem át a memóriába. Ezzel a konstrukcióval érdemes vigyázni, mert ha elfogy a hely a memóriából, akkor a swap-et fogja használni a rendszer, valamint egyes programok nem tudnak elindulni, ha nincsenek meg a /var/log-ban a saját mappáik.
    Egy megoldás ezen mappák létrehozására, ha a rendszer indulásakor elkészítjük ezeket egy init.d szkriptben. Egy majdnem jó megoldás található itt, azonban hiányoznak a függőség alapú bootolást segítő LSB mezők (itt írtam róluk). Helyesen:
    sudo touch /etc/init.d/make-tmpfs-dirs
    sudo gedit  /etc/init.d/make-tmpfs-dirs
    másoljuk be a szkriptet:
    #!/bin/sh

    ### BEGIN INIT INFO
    # Provides: make-tmpfs-dirs
    # Required-Start:
    # Required-Stop:
    # Default-Start:  2 
    # Default-Stop:
    # Short-Description: Create temporary directories on tmpfs.
    # Description: Create temporary directories for Debconf, Apache2, GDM, ATD
    ### END INIT INFO

    # Debconf
    mkdir /var/cache/debconf

    # Apache2
    sudo mkdir /var/log/apache2
    sudo chown root:adm /var/log/apache2
    sudo chmod 750 /var/log/apache2
    # GDM
    sudo mkdir -p /var/log/gdm

    # ATD
    sudo mkdir -p /var/spool/cron/atjobs
    exit 0
    majd állítsuk be a jogosultságokat, és a megfelelő runlevel-t:
    sudo chmod u+x /etc/init.d/make-tmpfs-dirs
    cd /etc/rc2.d
    sudo ln -s ../init.d/make-tmpfs-dirs S02make-tmpfs-dirs
  6. A gyakori írások nem túl jók az SSD-nek, általában egy böngésző cache-eléskor legtöbbször nagyon kis fájlokat ír ki. Ezt is érdemes a memóriába áthelyezni, mert ezzel még a böngészést is gyorsíthatjuk.
    Firefox-ban a következőt kell tennünk:
  • Írjuk be a böngésző címsorába a következőt: about:config
  • Jobb klikk -> New -> String
  • Névnek írjuk be a következőt: browser.cache.disk.parent_directory
  • Értéknek pedig: /tmp 
A további SSD optimalizációval kapcsolatos eredményekről is itt fogok írni.