+++
title = 'To \...δικό μας Linux. Γιατί και πως'
date = '2000-10-01T00:00:00Z'
description = ''
author = 'Μιχάλης Καμπριάνης(mailto:kabrianis@hellug.gr)'
issue = ['Magaz 26']
issue_weight = 5
+++

----------------------------------------------------------------------------------------------------------------------------------------------------------------

*Αναρωτηθήκατε ποτέ πόσα \"άχρηστα\" προγράμματα βρίσκονται στον υπολογιστή σας; Εκνευριστήκατε ποτέ για τα αυτόματα scripts που τρέχουν χωρίς να τα βάλατε
εσείς; Εγώ ναι. Και αποφάσισα να το ξεπεράσω με τον πιο δραστικό (!!!) τρόπο. Φτιάχνοντας το δικό μου Linux.*

----------------------------------------------------------------------------------------------------------------------------------------------------------------

Κάθε φορά που στήνω ένα νέο μηχάνημα έχω το ίδιο πρόβλημα. Ποιο distribution να βάλω που:

-   Να μην θέλει πάνω από μισή ώρα για την εγκατάσταση
-   Να μην μου γεμίσει το δίσκο με άχρηστα προγράμματα
-   Να μην μου εγκαταστήσει τα προγράμματα που ούτως ή άλλως θα ξαναβάλω εγώ για να τα ρυθμίσω στα paths που θέλω, και ίσως και με κάποιες έξτρα παραμέτρους
    (πειραγμένα).
-   Να ακολουθεί ένα όσο το δυνατόν πιο ορθολογικό και standard τρόπο ρύθμισης αρχείων του συστήματος, τα οποία θέλω να βρίσκονται\... εκεί που θα τα βρω (ίσως
    εκεί που πρέπει να είναι καλύτερη έκφραση αλλά δεν ξέρω αν ισχύει :-)
-   Να μην περιμένει να κάνω όλες τις δουλειές μου στο σύστημα με το δικό του super-extra-duper πρόγραμμα διαχείρησης / εγκατάστασης πακέτων.
-   Να μην περιμένει να κάνω όλες τις ρυθμίσεις στο σύστημα από το δικό του super-extra-duper πρόγραμμα ρυθμίσεων που τροποποιεί το ειδικό αρχείο τρέχα-γύρευε
    το οποίο με τη σειρά του ρυθμίζει τα πάντα.

Ζόρικα τα πράγματα. Ειδικά το πρώτο είναι σχεδόν αδύνατο (σε συνδυασμό βέβαια με τα υπόλοιπα). Για να δούμε κάποιες προτάσεις για το πως θα προσεγγίσουμε όσο το
δυνατόν περισσότερα από τα παραπάνω.

**1. Εναλλακτικές προτάσεις**
---------------------------------------------------

**2. Τι είναι το Linux (πάααααλι;)**
----------------------------------------------------------

**3. Τι ακριβώς θα κάνουμε είπαμε;**
----------------------------------------------------------

**4. Βήμα 1ο: Προετοιμασία του συστήματος.**
------------------------------------------------------------------

**5. Βήμα 2ο: Δημιουργώντας το βασικό μας σύστημα**
-------------------------------------------------------------------------

**6. Βήμα 3ο: Διορθώνοντας τον Gerard**
-------------------------------------------------------------

**7. Επίλογος**
-------------------------------------


### [1. Εναλλακτικές προτάσεις]{#s1}

Οι λύσεις που ξέρω (και μπορεί να υπάρχουν κι άλλες που να μην τις ξέρω) είναι οι εξής:

**Πρώτη λύση**\
Χρησιμοποιούμε ένα RPM-based distribution (Caldera, Mandrake, TurboLinux, RedHat, SuSE ίσως και άλλα), κάνουμε την ελάχιστη δυνατή εγκατάσταση σε όσα από αυτά
γίνεται.\
Εγκαθιστούμε τα προγράμματα που ενημερώνουν την rpm database για όσα προγράμματα βάζουμε με το χέρι, κατεβάζουμε και κάνουμε compile όσα προγράμματα θέλουμε να
βάλουμε εμείς μετά, κάνοντας ταυτόχρονα και ένα upgrade στα προγράμματα που έχουμε ήδη εγκαταστήσει (και δεν γινόταν αλλιώς) και θέλουμε νεώτερες εκδόσεις.\
Ελέγχουμε **όλα** τα αρχεία στο /etc directory για να τα προσαρμόσουμε στις ανάγκες μας (και όχι αυτές που νομίζει ο εγκαταστάτης ότι είναι οι ανάγκες μας).\
Διαμορφώνουμε **σωστά** αυτή τη φορά τα runlevels τα οποία αν δεν μπορούν να ακολουθήσουν το Linuxbase, τουλάχιστον ας μοιάζουν με κάποιο από τα άλλα Unices που
δουλεύουμε.

**Δεύτερη λύση**\
Χρησιμοποιούμε το Slackware ή κάποιο άλλο tgz - based distribution (υπάρχει;) και ακολουθούμε την ίδια διαδικασία, απλά \"πηδώντας\" τα κομμάτια για το RPM που
είπαμε παραπάνω.\
Ή εναλλακτικά χρησιμοποιούμε κάποιο debian-based distribution (Corel, Debian, Storm κλπ) για τα οποία δεν ξέρω, αλλά φαντάζομαι ότι υπάρχει ένας τρόπος να
\"παρακάμψεις\" τον package manager και να ακολουθήσεις όλα τα βήματα που είπαμε παραπάνω για τις rpm-based distributions.

**Τρίτη λύση**\
Κατεβάζουμε ένα minimum distribution (Leetnux, Laonux, RockLinux, Trinux κλπ) ελπίζοντας ότι ο εγκαταστάτης έκανε καλή δουλειά και θα μας γλιτώσει από κάποιο
κόπο. Με βάση αυτό το distribution χτίζουμε το σύστημά μας, βγάζοντας και βάζοντας πακέτα, αλλάζοντας και τροποποιώντας scripts κ.ο.κ.

**Τέταρτη λύση**\
Πηγαίνουμε στο [Linux From the Scratch](http://www.linuxfromscratch.org), κατεβάζουμε τις οδηγίες, 70 Mb σε προγράμματα, οπλιζόμαστε με υπομονή και αρχίζουμε να
χτίζουμε το δικό μας Linux.

Όπως προείπα, όλες οι παραπάνω λύσεις θέλουν όχι λιγότερο από μισή ώρα που είπα στην αρχή, αλλά πολύ περισσότερο. Ίσως και να μιλάμε για καμιά-δυο μέρες ίσως
και πολύ περισσότερο (όπου μέρα == το τρίωρο που μας μένει ελεύθερο να ασχοληθούμε με το PC μας). Αλλά υπάρχουν κάποια κόλπα στην όλη υπόθεση\... Και θα δείτε
στη συνέχεια ότι το πράγμα γίνεται πολύ όμορφο.


### [2. Τι είναι το Linux (πάααααλι;)]{#s2}

Όχι, δεν θα πω πάλι τα βαρετά και ίδια πράγματα, απλά κάποιες ελάχιστες λεπτομέρειες.\
Πολλές φορές έχετε ακούσει ότι Linux τεχνικά είναι μόνο ο πυρήνας, και ότι όλα τα άλλα είναι GNU και OpenSource προγράμματα. Αυτό δεν είναι απόλυτα ακριβές
βέβαια. Linux, δεν είναι μόνο ο πυρήνας αλλά και πραγματάκια άλλα που καθορίζουν consortiums κλπ όπως το FHS (Filesystem Hierarchy Standard) το τι είναι τα
Runlevels σε ένα σύστημα που θέλει να λέγεται Linux, και διάφορα άλλα τέτοια.\
Όχι, δεν θέλω να πω ότι τα XFree86 είναι Linux, ούτε ότι το gcc είναι Linux, αλλά το ότι το runlevel 1 σημαίνει single user και το runlevel 6 σημαίνει reboot
κάποιος τα έχει πει, και αυτός ο κάποιος λέγεται Linuxbase. Και αν κάποιος θέλει να κάνει ένα distribution το οποίο θα λέγεται Linux, ε, καλά θα κάνει να τα
σεβαστεί αυτά. Όπως επίσης καλά θα κάνει να σεβαστεί και το ποια αρχεία θα βρίσκονται που (και όχι να πετάμε τα init scripts όπου και όπως μας βολεύει).\
Αν βέβαια έχουμε συνηθίσει κάποιο distribution και τις (τυχόν) παραξενιές του κανείς δεν μας απαγορεύει, στο δικό μας Linux, να ακολουθήσουμε τα γνωστά σε μας
από αυτό. Εγώ όμως, στην συγκεκριμένη περίπτωση, αποφάσισα να κάνω αυτό που θεωρώ σωστό. Όλα (ή μάλλον όσα μπορώ), να είναι by the book. Τα αρχεία θα βρίσκονται
εκεί που πρέπει, και τα runlevels θα είναι αυτά που πρέπει. Το μηχάνημα θα ανεβάζει μόνο τα services που πρέπει και θα έχει εγκατεστημένα μόνο τα πακέτα που
πρέπει\...

Ας ξεκαθαρίσω από την αρχή τα δεδομένα: Καμμία ευθύνη δεν φέρω σε περίπτωση που κάποιος καταστρέψει το σύστημά του διαβάζοντας αυτό το άρθρο. Σε καμία περίπτωση
δεν θα πρότεινα στους απλούς χρήστες μία τέτοια διαδικασία (κάτι ξέρουν που υπάρχουν οι Suse, Debian, κλπ κλπ κλπ). Τα όσα θα ακολουθήσουν είναι για ανθρώπους
αρκετά έμπειρους να κάνουν ένα custom compile κάνοντας override κάποια system-wide defaults και που ξέρουν κάποια πράγματα από την έννοια του multiuser
λειτουργικού συστήματος. Τα ίδια (περίπου) θα διαβάσετε και στις οδηγίες του Linux from the scratch. Πιστέψτε μας. Αν δεν ξέρετε που μπλέκετε, ΜΗΝ το κάνετε.


### [3. Τι ακριβώς θα κάνουμε είπαμε;]{#s3}

Η όλη ιδέα είναι να \"χτίσουμε\" ένα Linux σύστημα από την αρχή. Αφού ούτως ή άλλως, αν ξεκινήσουμε να χτίζουμε από κάποιο distribution θα φάμε και κανένα 4ωρο
να φέρουμε το σύστημα στα μέτρα μας, ας φάμε κανένα 10ωρο μιας εξαρχής να το απολαύσουμε κιόλας.

Το να χτίσουμε ένα Linux σύστημα βέβαια σημαίνει ότι δεν υπάρχει τίποτα. Ούτε πυρήνας, ούτε libc, ούτε compiler, ούτε boot manager, ούτε shell\... τίποτα. Το
λέω και το ξαναλέω για να μην ξεκινήσετε κάτι που δεν πρόκειται να τελειώσετε ποτέ και να χάσετε τόσο χρόνο. Όταν αυτή η διαδικασία τελειώσει, δεν θα δουλεύει
τίποτα. Ούτε services θα σηκώνονται, ούτε init scripts θα υπάρχουν, ούτε το bash θα είναι ρυθμισμένο (εκείνα τα χρωματάκια στο ls και εκείνα τα παράξενα aliases
του τύπου \"rm=\'rm -i\'\" ξεχάστε τα). Αλλά θα είναι το δικό σας linux σύστημα, και θα μάθετε τόσα πολλά για το linux (και πολλά άλλα προγράμματα) κάνοντας
αυτή τη διαδικασία που δεν θα τα μάθετε σχεδόν με κανέναν άλλο τρόπο.

Θα ακολουθήσουμε τη διαδικασία που περιγράφει στο πολύ καλό βιβλίο του ο Gerard Beekmans και το έχει για όλους εμάς τους υπόλοιπους στο [site
του](http://www.linuxfromscratch.org). Σε μερικά σημεία, η δικιά μου διαδικασία διαφοροποιήθηκε λίγο. Θα δείτε γιατί και είστε ελεύθεροι ή να την ακολουθήσετε,
ή όχι.

Εγώ ας πούμε έχω τελικά κρατήσει τρία snapshots του συστήματος, για να μπορώ ανά πάσα στιγμή να ξεκινήσω ξανά την διαδικασία από όπου θέλω (πρέπει) ούτως ώστε
να ξαναφτιάξω ακριβώς το ίδιο σύστημα.

Ας ξεκινήσουμε.


### [4. Βήμα 1ο: Προετοιμασία του συστήματος.]{#s4}

Η διαδικασία του Gerard Beekmans είναι απλή (στη σύλληψη) αλλά και ταυτόχρονα δύσκολη (στην εφαρμογή). Ο Gerard μας έκανε τη χάρη να μας το κάνει λίγο πολύ
τυφλοσούρτη. Να πως έχει:\
Πρέπει στο μηχάνημα που θα χτίσουμε το Linux, να υπάρχει ήδη ένα Linux προεγκατεστημένο (θυμάστε; χρειαζόμαστε έναν compiler). Αφού φτιάξουμε λοιπόν ένα
partition (το οποίο τελικά θα είναι το root partition του τελικού μας συστήματος) ξεκινάμε να κάνουμε compile εκεί μέσα κάποια προγράμματα. Όλα statically
linked (γιατί κάποια στιγμή θα αποκοπούν από το παλιό σύστημα) εκτός από ένα. Ναι σωστά μαντέψατε, τη glibc.\
Εγώ προετοίμαζα (αρχικά) το linux μου για ένα μηχανάκι K6-200. Επειδή φαντάστηκα (και δεν είχα άδικο :-) ότι η διαδικασία σε αυτό το μηχάνημα θα ήταν αρκετά
αργή, αποφάσισα να την κάνω σε ένα άλλο μηχάνημα που έχω, έναν Athlon-500.\
Δημιουργούμε ένα ψευτο-σύστημα στο οποίο δεν μπορούμε να κάνουμε boot (γιατί θα λείπουν κάποια βασικά πράγματα όπως η εντολή mount και το lilo) μπορούμε όμως να
κάνουμε chroot σε αυτό και να δουλέψουμε σαν να είναι πραγματικό σύστημα. Εδώ, σε περίπτωση που κάνετε κάτι παρόμοιο με μένα, θα πρέπει να προσέξετε το εξής: Αν
και ο Gerard δεν το αναφέρει πουθενά, καλό είναι να χρησιμοποιηθούν compiler directives για compilation το οποίο να μπορεί να μεταφερθεί σε χαμηλότερο σύστημα.
Αν άφηνα το compile να ακολουθήσει την πορεία του, θα έπαιρνα ένα σύστημα optimized για i686, το οποίο βέβαια σε έναν K6 θα \"έσκαγε\" με invalid instruction.
Χρησιμοποίησα λοιπόν την παράμετρο -mcpu=i486 στον gcc και έδωσα και την παράμετρο \--host=i486-pc-linux στο configure οποιουδήποτε προγράμματος εγκαθιστούσα
(όχι ότι έχει σημασία σε αυτό το στάδιο, μια που όλα θα αντικατασταθούν εκτός από την glibc. Για αυτήν **πρέπει υποχρεωτικά** να χρησιμοποιηθεί η παράμετρος
αυτή).\
Το αποτέλεσμα (ναι, ακολουθήστε τα βήματα του Gerard, τα λέει πολύ αναλυτικά, δεν θα ξαναμπω στην ίδια διαδικασία) είναι ένα mini-σύστημα το οποίο μπορεί να
κάνει μόνο compile. Και μπορεί να τρέξει σε οποιοδήποτε μηχάνημα κλάσης 486 και πάνω (άρα και στον ταπεινό μου Κ6). Άφησα κάποια πακέτα του Gerard έξω από την
διαδικασία (όπως ας πούμε το bzip2) αν και αυτό δεν είναι απαραίτητο. Θα έλεγα μάλλον ότι είναι μη-προτεινόμενο :-)\
Στο σημείο αυτό, παίρνω ένα backup του συστήματος. Τι είναι; ένα 200 Mb (περίπου) tar file το οποίο άν συμπιεστεί (bzip2) πέφτει στα 40 Mb. Ας το κρατήσουμε σε
μία άκρη λοιπόν. Αν αύριο θελήσουμε να φτιάξουμε ένα σύστημα optimized για 686 μπορούμε να ξεκινήσουμε από αυτό, και συγκεκριμένα από το σημείο που εγκαθίσταται
η glibc και κάτω. Αν και, να παρατηρήσουμε, ότι το README της glibc λέει ότι κανένα optimization δεν θα κάνει διαφορά στην απόδοση, άρα μπορούμε να
αποσυμπιέσουμε απλά αυτό το tar και να συνεχίσουμε από το επόμενο στάδιο, χωρίς να χάσουμε τίποτα.

Μόλις έχουμε γλιτώσει 2 με 3 ώρες από την επόμενη εγκατάστασή μας (ανάλογα με το μηχάνημα στο οποίο κάνουμε το compile). Επειδή λοιπόν κρατάω αυτό το αρχείο ως
\"βάση\", κάνω στον εαυτό μου μία χάρη και κάνω strip όλα τα debugging symbols από τα static binaries (τα οποία ούτως ή άλλως θα αντικατασταθούν) για να μικρύνω
ακόμα περισσότερο το αρχείο που θα κρατήσω. Επίσης, κάνω compile με -O3 (εκτός από την glibc που την προτιμώ unoptimised εφόσον την κάνω compile σε άλλη CPU).


### [5. Βήμα 2ο: Δημιουργώντας το βασικό μας σύστημα]{#s5}

Ακολουθώντας για άλλη μία φορά τις οδηγίες του Gerard, αρχίζουμε να χτίζουμε το σύστημά μας. Όλα τα πακέτα εκτός από την glibc θα αντικατασταθούν όπως είπαμε
από άλλα, dynamically linked αυτή τη φορά. Εδώ έχουν μεγάλη σημασία και τα optimizations του compiler όπως λέει και ο Gerard, αλλά και το directive
\--host=\.... στην περίπτωση που κάνουμε το compile σε άλλο μηχάνημα από το τελικό. Εγώ για να γλιτώσω χρόνο (πάλι) συνέχισα και αυτό το στάδιο στον Αthlon,
αλλά έδωσα παραμέτρους για τον k6 μου και με υψηλό optimization, χωρίς debugging information (μια που δεν υπάρχει περίπτωση να κάτσω να κάνω debugging). Δηλαδή
-mcpu=k6 -march-k6 -O3 όπως προτείνει και ο Gerard (προσοχή, είναι το ίδιο που κάναμε και στο 1ο βήμα, αλλά για άλλο λόγο). Από τις παραμέτρους -mcpu και -march
η μία από τις δύο είναι άχρηστη, αλλά επειδή δεν ξέρουμε ποιο πρόγραμμα θα σεβαστεί ποια παράμετρο, τις βάζουμε και τις δύο να είμαστε σίγουροι. Βέβαια το
\--host μου στο configure ήταν i586-pc-linux (ναι, ο k6 είναι σαν 586).

Στο συγκεκριμένο σημείο ξαναπαίρνω ένα backup του συστήματος. Το σύστημα αυτή τη στιγμή είναι έτοιμο να κάνει boot και μπορεί να ξεκινήσει τον k6 μου κανονικά.
τώρα το σύστημα είναι 200 Mb σε tar (και 55 Mb συμπιεσμένα με bzip2) και ανά πάσα στιγμή θέλω, το \"πετάω\" σε έναν δίσκο, κάνω ένα chroot σε αυτό το δίσκο,
τρέχω το lilo και είμαι έτοιμος. Γιατί έκανα αυτά τα δύο backup; Γιατί το μεν πρώτο θα το χρησιμοποιήσω για να \"χτίσω\" οποιοδήποτε άλλο μηχάνημα (όπου να\'ναι
ξεκινάω και τον Athlon) ενώ το δεύτερο είναι ένα αρχικό working snapshot του K6.


### [6. Βήμα 3ο: Διορθώνοντας τον Gerard]{#s6}

Όπως προείπα, εγώ σε κάποια σημεία διαφοροποιήθηκα από τον Gerard είτε κατ\' επιλογή, είτε από ανάγκη.\
Κατ\' επιλογή λοιπόν κατέβασα από το <http://www.iro.umontreal.ca/contrib/po/trans/el> όλες τις νεώτερες ελληνικές μεταφράσεις και αντικατέστησα αυτές που είχαν
μέσα τα πακέτα (όχι όλα τα πακέτα, αλλά αρκετά).\
Κατ\' επιλογή πρόσθεσα και τις συμβουλές του Σίμου Ξενιτέλλη από την Linux-greek-users για ελληνικά στην κονσόλα.\
Κατ\' επιλογή αποφάσισα αντί να εγκαταστήσω το netkit-base που προτείνει ο Gerard να εγκαταστήσω κομμάτια του netkit-combo (ένα υπερσύνολο των διαφόρων netkit
utilities) μια που ούτως ή άλλως θα τα εγκαταστούσα.\
Κατ\' επιλογή αποφάσισα να εγκαταστήσω τα νεώτερα shadow tools από εκείνα που προτείνει ο Gerard και κατ\' ανάγκη άλλαξα το format του αρχείου /etc/consoles που
περιμένουν τα shadow tools να βρουν (έχω την εντύπωση ότι έχουν αλλάξει format μεταξύ των δύο εκδόσεων της shadow αλλά δεν το έχω ψάξει πολύ για να το πω με
σιγουριά). Έπρεπε πάντως αντί για το device name που έγραφα μέχρι τώρα να γράψω το full path για το device file (αντί για tty1 δηλαδή, /dev/tty1). Κατ\' επιλογή
αποφάσισα να \"πειράξω\" το αρχείο src/feature.h για το vim ούτως ώστε να ενεργοποιήσω την επιλογή για το langmap (χωρίς όλες τις άλλες που έρχονται μαζί της).
Κατ\' ανάγκη άλλαξα την εντολή του για το defkeymap και αποσυμπίεσα το συγκεκριμένο αρχείο, γιατί μόνο έτσι το δεχόταν.\
Κατ\' ανάγκη έκανα αυτό που δεν ανέφερε ο Gerard, να εκτελέσω δηλαδή την εντολή mkswap στο swap partition που είχα στο δίσκο μου, μια που αυτό το βήμα είναι

### [7. Επίλογος]{#s7}

Τι κατάφερα; Έχω ένα μηχάνημα το οποίο κάνει boot και έχει δίκτυο, telnet, ftp, compiler (και όλα τα απαιτούμενα tools για compile) και τα sources του πυρήνα.
Το σύστημα τρέχει σε οποιοδήποτε μηχάνημα από 486 και πάνω και μπορεί να χρησιμοποιηθεί σαν βάση για ένα νέο σύστημα από το μηδέν.\
Είπα προηγουμένως ότι πήρα τρία backup. Στο τρίτο backup δεν φτάσαμε ακόμα (το τρίτο backup έγινε στο live σύστημα με όλα τα προγράμματα επάνω χωρίς δεδομένα).
Στο τρίτο backup θα φτάσουμε στο επόμενο τεύχος, όταν θα αναλυσουμε όλες τις δικτυακές ρυθμίσεις που κάνουμε, και τα νέα αρχεία ρυθμίσεων που δημιουργούμε για
να φτάσουμε να έχουμε ένα μηχάνημα που θα έχει την ίδια λειτουργικότητα με οποιοδήποτε distribution, προσαρμοσμένη όμως στις ανάγκες μας και τις απαιτήσεις μας.

