Skip to content

System Setup (Customization)

Salih Emin edited this page Oct 8, 2015 · 1 revision

Περιεχόμενα


Εισαγωγή

Η τροποποίηση (customisation) μιας υπάρχουσας διανομής (distribution) για κάποιο board είναι μια διαδικασία που μπορείτε να κάνετε σε περίπτωση που θέλετε να προσθέσετε-αφαιρέσετε κάποια πακέτα του συστήματος, να αλλάξετε λειτουργίες, να προσθέσετε-αφαιρέσετε κάποια αρχεία και γενικά αν θέλετε να δημιουργήσετε μια δικιά σας εκδοχή της διανομής πριν την εγκαταστήσετε στο board σας.

Περιπτώσεις που μπορεί να είναι χρήσιμο αυτό είναι σε σχολεία, ιδρύματα, επιχειρήσεις κλπ όπου ο υπεύθυνος των πληροφοριακών συστημάτων θέλει να δημιουργήσει μια τροποποιημένη και εμπλουτισμένη εκδοχή μιας διανομής που θα χρησιμοποιηθεί σε κάποιο Singel Board Computer.

Η μεθοδολογία που θα παρουσιαστεί είναι ο τρόπος με τον οποίο φτιάχτηκε η διανομή του έργου BusinessPi και μπορεί να φανεί χρήσιμη για όποιον θέλει να κάνει το ίδιο ανεξαρτήτως του board που διαθέτει.

Εργαλεία και Μεθοδολογία

Σε γενικά πλαίσια θα χρειαστεί να προετοιμάσουμε τον υπολογιστή στον οποίο θα δουλέψουμε για να προσομοιώσει ένα περιβάλλον εντολών για ARM αρχιτεκτονική. Ο υπολογιστής θα πρέπει να έχει λειτουργικό σύστημα Linux. Έπειτα θα χρειαστούμε μια βάση ως σημείο εκκίνησης, το οποίο είναι μια διανομή ειδικά φτιαγμένη για το board που διαθέτουμε. Τέλος προσαρτούμε την διανομή που κατεβάσαμε και κάνουμε εγκατάσταση η αφαίρεση των στοιχείων που θέλουμε.

Προετοιμασία του υπολογιστή

Θα χρειαστεί να εγκαταστήσουμε κάποια πακέτα για να μπορέσουμε να εκτελέσουμε εντολές που θα μεταφράζονται σε ARM περιβάλλον

  • qemu
  • qemu-user-static
  • binfmt-support
  • unzip

Ανάλογα με την διανομή του υπολογιστή σας το όνομα των πακέτων μπορεί να διαφέρει. Εδώ θα δούμε πως γίνεται η εργασία σε Debian/Ubuntu συστήματα

sudo apt-get install qemu qemu-user-static binfmt-support unzip

Το qemu είναι ένας εξομοιωτής ARM ενώ τα qemu-user-static και binfmt-support μας επιτρέπουν να τρέξουμε εκτελέσιμα αρχεία ARM χωρίς να χρειάζεται να προσομοιώσουμε και πυρήνα ARM. Το unzip θα το χρειαστούμε για να αποσυμπιέσουμε το στιγμιότυπο που θα κατεβάσουμε.

Λήψη βάσης

Ανάλογα με το μοντέλο του Board μας θα πρέπει να επισκεφτούμε την αντίστοιχη ιστοσελίδα της κοινότητας η του κατασκευαστή και να κατεβάσουμε μια έτοιμη για το board μας διανομή.

Διαλέξτε μια διανομή που σας ενδιαφέρει και προτιμήστε αυτήν για την οποία γνωρίζετε το σύστημα πακέτων που χρησιμοποιεί για να μπορέσετε εύκολα και γρήγορα να διαμορφώσετε το τελικό προϊόν. Επίσης πριν διαλέξετε μια διανομή, συμβουλευτείτε τον οδηγό, για να προσέξετε κάποια σημεία τα οποία θα πρέπει η διανομή της επιλογής σας να πληροί κάποιες προϋποθέσεις : System Setup (Build)

Ως παράδειγμα θα χρησιμοποιήσουμε το Bananian το οποίο χρησιμοποιήθηκε για την δημιουργία της διανομής του BusinessPi. Παρόλα αυτά η μεθοδολογία παραμένει ίδια για όποια διανομή και αν είναι συμβατή με το board σας.

mkdir -p images/bananian-os
wget "http://dl.bananian.org/releases/bananian-15.04.zip" -O "images/bananian-os.zip"
unzip "images/bananian-os.zip" -d images/bananian-os
rm images/bananian-os.zip

Έτσι λοιπόν θα έχουμε ένα αρχείο .img στον φάκελο bananian-os το οποίο και θα τροποποιήσουμε για να φτιάξουμε την δική μας εκδοχή της διανομής.

ls images/bananian-os
bananian-1504.img

Εύρεση κατατμήσεων

Το αρχείο .img στον φάκελο bananian-os στην πραγματικότητα είναι ένας δίσκος ο οποίος έχει προεγκατασταθεί το λειτουργικό σύστημα και έχει χωριστεί σε κατατμήσεις. Σκεφτείτε το ως ένα στιγμιότυπο μιας χρονικής στιγμής του λειτουργικού συστήματος σε έναν σκληρό δίσκο. Θα πρέπει λοιπόν να δούμε που γίνεται η μετατόπιση (offset) των κατατμήσεων ήτοι που ξεκινάνε και που τελειώνουν. Αυτό γίνεται με τις παρακάτω εντολές:

cd images/bananian-os
sudo fdisk -lu bananian-1504.img

η τελευταία θα μας δώσει ένα αποτέλεσμα όπως το παρακάτω

Disk bananian-1504.img: 1.8 GiB, 1899999744 bytes, 3710937 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9f732a23

Device             Boot Start     End Sectors  Size Id Type
bananian-1504.img1       2048   43007   40960   20M 83 Linux
bananian-1504.img2      43008 3710936 3667929  1.8G 83 Linux

από το παραπάνω αποτέλεσμα χρειαζόμαστε τα εξής:

  • Sector size (logical/physical): 512 bytes / 512 bytes
  • Η ριζική κατάτμηση (/) ξεκινάει στους: 43008 τομείς
  • Η κατάτμηση εκκίνησης (/boot) ξεκινάει στους: 2048 τομείς

Κάθε τομέας είναι 512 bytes, έτσι ώστε η μετατόπιση της ριζικής κατάτμησης να είναι είναι 43008 * 512 = 22020096 bytes ενώ η μετατόπιση της κατάτμησης εκκίνησης είναι 2048 * 512 = 1048576 bytes

Κρατάμε λοιπόν τους δύο αριθμούς:

  • Partition / offset: 22020096
  • Partition /boot offset: 1048576

Προσάρτηση ως σύστημα αρχείων

Στη συνέχεια, θα πρέπει να προσαρτήσουμε το στιγμιότυπο .img ως ένα σύστημα αρχείων. Αυτό μπορεί να γίνει χρησιμοποιώντας μια συσκευή loopback. Εδώ θα χρησιμοποιούμε και την τιμή του offset από την προηγούμενη ενότητα για να πούμε στην εντολή mount που θα προσαρτήσει το στιγμιότυπο και από που θα ξεκινάνε οι κατατμήσεις.

Η σειρά αυτών των εντολών είναι σημαντική.

sudo mount -o loop,offset=22020096 "bananian-1504.img" /mnt
sudo mount -o loop,offset=1048576 "bananian-1504.img" /mnt/boot

Προετοιμασία του συστήματος αρχείων

Τώρα θα πρέπει να αντιγράψουμε τον εξομοιωτή στο προσαρτημένο σύστημα αρχείων

sudo cp /usr/bin/qemu-arm-static /mnt/usr/bin/

Επίσης θα χρειαστεί να παρέχουμε στο προσαρτημένο σύστημα αρχείων κάποια στοιχεία του λειτουργικού συστήματος του υπολογιστή μας

sudo mount --rbind /dev /mnt/dev
sudo mount -t proc none /mnt/proc
sudo mount -o bind /sys /mnt/sys

Είσοδος στο απομονωμένο περιβάλλον

Το σύστημα μας είναι έτοιμο και μπορούμε να εισέλθουμε σε αυτό κάνοντας χρήση του περιβάλλοντος chroot

sudo chroot /mnt

Με την είσοδό σας σε αυτό το απομονωμένο περιβάλλον θα παρατηρήσετε ότι άλλαξε το τερματικό σας και πλέον είστε root και μπορείτε να εκτελέσετε εντολές που θα εκτελούσατε σε μια διανομή που είναι εγκατεστημένη σε υπολογιστή.

root@debian / #
root@debian / # ls
bin/   etc/   lost+found/  opt/   run/      srv/       tmp/
boot/  home/  media/       proc/  sbin/     swapfile1  usr/
dev/   lib/   mnt/         root/  selinux/  sys/       var/

Τώρα μπορείτε να κάνετε εγκατάσταση η αφαίρεση πακέτων και ότι άλλο χρειάζεστε να έχει η τελική σας διανομή. Συμβουλευτείτε τον οδηγό System Setup (Build) για να δείτε πως μπορείτε π.χ. να εγκαταστήσετε το εταιρικό λογισμικό VtigerCRM.

Ολοκλήρωση

Αφού έχετε τελειώσει με την διαμόρφωση της διανομής μπορείτε να κάνετε έξοδο από το περιβάλλον με δυο τρόπους:

  • exit
  • CTRL+D

Τώρα διαγράψτε το αρχείο qemu-user-static που είχαμε αντιγράψει πριν.

sudo rm /mnt/usr/bin/qemu-arm-static

Τέλος οπό-πορσαρτήστε το σύστημα αρχείων των δυο κατατμήσεων

sudo umount /mnt
sudo umount /mnt/boot

Η διανομή σας πλέον είναι έτοιμη και μπορείτε να την εγκαταστήσετε όπως διαβάσατε στον οδηγό System Setup.

Αντιμετώπιση σφαλμάτων

Σε περίπτωση που στην προσπάθεια από-προσάρτησης λάβετε ένα μήνυμα όπως παρακάτω

umount: /mnt: target is busy
        (In some cases useful info about processes that
         use the device is found by lsof(8) or fuser(1).)

Τότε σημαίνει ότι κάποια υπηρεσία που εκτελείται στο προσαρτημένο σύστημα αρχείων αποτρέπει την από-προσάρτηση. Σε αυτή την περίπτωση μπορείτε να εντοπίσετε την υπηρεσία που εκτελείται και να την τερματίσετε με

Λύση 1

sudo lsof /mnt
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    16715 user    cwd  DIR   8,81  16384    6931 /mnt
cat     33753 root    1w   REG   8,81      0  6944 /mnt

kill -9 16715 33753
lsof /mnt
sudo umount /mnt

Λύση 2

showmount -e
Export list for alpha:
/mnt/ 192.168.1.200
/etc/init.d/nfs-kernel-server stop
umount /mnt/

Λύση 3

losetup -a
/dev/loop0: [0851]:6983 (/mnt/disk.img)
/dev/loop1: [0851]:6986 (/mnt/boot/disk2.img)
umount /mnt/disk.img
umount /mnt/boot/disk2.img
umount: /mnt/boot/disk2.img: not mounted
losetup -d /dev/loop1
umount /mnt/boot

Λύση 4

cat /proc/swaps
Filename                   Type            Size    Used    Priority
/mnt/swapfile              file            95480   0       -2
# swapoff /mnt/swapfile
# umount /mnt/

Λύση 5

dmesg

[.] lost page write due to I/O error on md0
[.] Buffer I/O error on device md0, logical block 16804
[.] INFO: task cp:27736 blocked for more than 120 seconds.
[.] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[.] cp  D ffff88053fdd39c0 0 27736  27734 0x00000004

umount -l /mnt

Λύση 6

Δημιουργείστε ένα bash script με περιεχόμενα τον παρακάτω κώδικα και εκτελέστε το.

#!/usr/bin/env bash
ls -l /proc/*/root | grep -v "\-[>] /$"

for procpid in /proc/*/root; do
  linktarget=$(readlink ${procpid})
  if [ "${linktarget}" != "/" ]; then
  echo "${procpid} chrooted to ${linktarget}"
  fi
done
Clone this wiki locally