Εισαγωγή
Η τροποποίηση (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 μας διανομή.
Διαλέξτε μια διανομή που σας ενδιαφέρει και προτιμήστε αυτήν για την οποία γνωρίζετε το σύστημα πακέτων που χρησιμοποιεί για να μπορέσετε εύκολα και γρήγορα να διαμορφώσετε το τελικό προϊόν. Επίσης πριν διαλέξετε μια διανομή, συμβουλευτείτε τον οδηγό, για να προσέξετε κάποια σημεία τα οποία θα πρέπει η διανομή της επιλογής σας να πληροί κάποιες προϋποθέσεις : Δημιουργία εταιρικού διακομιστή σε Singel Board Computer
Ως παράδειγμα θα χρησιμοποιήσουμε το 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/
Τώρα μπορείτε να κάνετε εγκατάσταση η αφαίρεση πακέτων και ότι άλλο χρειάζεστε να έχει η τελική σας διανομή. Συμβουλευτείτε τον οδηγό Δημιουργία εταιρικού διακομιστή σε Singel Board Computer για να δείτε πως μπορείτε π.χ. να εγκαταστήσετε το εταιρικό λογισμικό VtigerCRM.
Ολοκλήρωση
Αφού έχετε τελειώσει με την διαμόρφωση της διανομής μπορείτε να κάνετε έξοδο από το περιβάλλον με δυο τρόπους:
- exit
- CTRL+D
Τώρα διαγράψτε το αρχείο qemu-user-static
που είχαμε αντιγράψει πριν.
sudo rm /mnt/usr/bin/qemu-arm-static
Τέλος οπό-πορσαρτήστε το σύστημα αρχείων των δυο κατατμήσεων
sudo umount /mnt
sudo umount /mnt/boot
Η διανομή σας πλέον είναι έτοιμη και μπορείτε να την εγκαταστήσετε όπως διαβάσατε στον οδηγό εγκατάστασης σε προηγούμενο άρθρο.
Αντιμετώπιση σφαλμάτων
Σε περίπτωση που στην προσπάθεια από-προσάρτησης λάβετε ένα μήνυμα όπως παρακάτω
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
Πείτε την γνώμη σας στα σχόλια