Πάμε λοιπόν να εγκαταστήσουμε τον κλειστό driver της AMD για την κάρτα μας. Όλα πάνε καλά μέχρι που στην κονσόλα βλέπουμε το εξής error:
Error! Bad return status for module build on kernel: 3.17-1-amd64 (x86_64)
Consult /var/lib/dkms/fglrx/14.9+ga14.201/build/make.log for more information.
ή κάποιο παρόμοιο ανάλογα με την έκδοση του kernel και τη διανομή που χρησιμοποιούμε
Τι σημαίνει αυτό το error ακριβώς; Για να παίξει ο driver χρειάζεται ένα module που θα φτιαχτεί για τον kernel που χρησιμοποιούμε και που θα φορτώνεται με την εκκίνηση.
Απότι φαίνεται κατά το "χτίσιμο" (build) του module από τον πηγαίο κώδικα, κάποιο λάθος συνέβη το οποίο εμπόδισε το module από το να φτιαχτεί με το πρόγραμμα dkms (dynamic kernel module support) το οποίο καταγράφηκε σε κάποιο αρχείο log.
Αν πάμε όντως να δούμε τι λέει το build log του module, θα δούμε κάποιο προγραμματιστικό λάθος του c compiler (o κώδικας του fglrx module είναι σε C γλώσσα) που λέει πως το struct ‘acpi_device_flags’ has no member named ‘no_hotplug’ στο αρχείο kcl_acpi.c. Δε θα επεκταθούμε στο γιατί συμβαίνει αυτό, είναι ένα γνωστό bug.
Πως το φτιάχνουμε:
1) βρίσκουμε τα sources του module. Στη δική μου περίπτωση είναι στο
/usr/src/fglrx-14.9+ga14.201
μπορείτε να βρείτε το εν λόγω αρχείο είτε με find, είτε με locate.
Στην περίπτωση που βρείτε 2 αρχεία, αυτό που θα χρειαστούμε είναι στον φάκελο /usr/src/...
2) ανοίγουμε το αρχείο kcl_acpi.c (με δικαιώματα root)
3) βρίσκουμε τη γραμμή που λέει:
if LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,7)
και βεβαιωνόμαστε πως είναι κάτω από το
static acpi_status KCL_ACPI_Slot_No_Hotplug(KCL_ACPI_DevHandle handle, u32 lvl, void *data, void **rv)
{
4) σβήνουμε το
if LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,7)
και βάζουμε στη θέση του το
if LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,7) && LINUX_VERSION_CODE < KERNEL_VERSION(3,17,0)
5) κοιτάμε τις επόμενες 3εις γραμμές κώδικα και προσέχουμε να είναι ίδιες με τις παρακάτω:
struct acpi_device *tdev = NULL;
struct pci_dev *pdev = (struct pci_dev *)data;
int device = 0;
6) σώζουμε το αρχείο
7) κανονικά χρειάζεται πρώτα να κάνουμε dkms add -m module -v ώστε να προστεθεί το module στο kernel tree. Παρόλο όμως που η αρχική μας προσπάθεια ήταν αποτυχημένη -κατά την πρώτη εγκατάσταση-, το module έχει ήδη προστεθεί απλά απέτυχε το build. Εν πάση περιπτώσει, δε χρειάζεται να κάνουμε το βήμα αυτό
8) κάνουμε compile το module
dkms build -m fglrx -v 14.9+ga14.201
(την ακριβή έκδοσή σας θα την βρείτε από το πακέτο του driver, είτε από το /usr/share/fglrx-VERSION/)
Θα πρέπει να δουμε στο τέλος το μήνυμα
DKMS: build completed.
9) κάνουμε εγκατάσταση το module
dkms install -m fglrx -v 14.9+ga14.201
θα πρέπει να δούμε το μήνυμα
DKMS: install completed.
10) τώρα είμαστε έτοιμοι με το ati-config να φτιάξουμε ένα καλό αρχείο για τον x.org (ή το κάνουμε manual αν το'χουμε!)
Εάν έχετε την ατυχία να δείτε το μήνυμα
Command: MLSD Error: Connection timed out Error: Failed to retrieve directory listing
σημαίνει πως ο client που χρησιμοποιείτε (πχ filezilla) προσπαθεί να ανοίξει κάποιες πόρτες για να επικοινωνήσει με τον server και δεν τα καταφέρνει.
Η λύση λοιπόν είναι να πούμε στον ftp server να ακούει σε συγκεκριμένο port range για passive connections.
Βήματα:
1) Ανοίγουμε το αρχείο /etc/pure-ftpd.conf
2) Ψάχνουμε για τη γραμμή που γράφει “PassivePortRange 30000 35000″
3) Βγάζουμε το comment "#" και αλλάζουμε τις πόρτες σε αυτές που θέλουμε (πχ 6000 6100)
4) Σώζουμε το αρχείο
5) Κάνουμε restart τον pure ftp server
Αν ακόμη έχετε πρόβλημα, τσεκάρετε μήπως σας κόβει κάποιο firewall
Κι όμως..ακόμη και ένας απλός χρήστης όταν κάνει login μπορεί να δει την admin bar πάνω πάνω. Θα μου πείτε ε και; Ε και αν ο τάδε πελάτης το θεωρεί απαράδεκτο, οτι μπερδεύει τους χρήστες μπλα μπλα, πριν αρχίσετε να τραβάτε τα μαλλιά σας, είναι πιο εύκολο να κάνετε στα γρήγορα αυτό που ζητά και να είναι και αυτός ευτυχισμένος και εσείς ήρεμοι άνθρωποι!
Ο Παρακάτω κώδικας πετυχαίνει αυτό που θέλουμε και μπαίνει στο function.php του theme που χρησιμοποιείτε:
/* gdimi remove admin bar except for admins */
add_action('after_setup_theme', 'remove_admin_bar');
//
function remove_admin_bar() {
if (!current_user_can('administrator') && !is_admin()) {
show_admin_bar(false);
}
}
Υπάρχουν μερικές περιπτώσεις όπου είναι χρήσιμο όταν κάνουν login οι χρήστες να τους κάνουμε redirect στην αρχική σελίδα και όχι αυτόματα να πηγαίνουν στο "admin" περιβάλλον.
Αυτό γίνεται πολύ εύκολα βάζοντας τον παρακάτω κώδικα στο functions.php του theme που χρησιμοποιούμε.
/**
* Redirect non-admins to the homepage after logging into the site.
* gdimi
*/
function gdimi_login_redirect( $redirect_to, $request, $user ) {
return ( is_array( $user->roles ) && in_array( 'administrator', $user->roles ) ) ? admin_url() : site_url();
} // end login_redirect
add_filter( 'login_redirect', 'gdimi_login_redirect', 10, 3 );
Ας υποθέσουμε πως για κάποιον λόγο χρειάζεται να σταματήσουμε τον postfix από το να στέλνει email αλλά θέλουμε να λαμβάνουμε (πχ μας έχουν χακέψει τον server και τέτοια ωραία).
Είναι πολύ εύκολο:
1) κάνουμε edit το main.cf
2) προσθέτουμε τη γραμμή: default_transport = error: Local delivery only!
3) πατάμε στην κονσόλα ένα postfix check έτσι για να αποφύγουμε δυσάρεστες εκπλήξεις με τυχόν σφάλμα στο configuration
Χιουμοριστικό βίντεο για το τέλος του κόσμου που θα έρθει όταν η java ξαφνικά θα σταματήσει να χρησιμοποιείται!
http://youtu.be/_9oq475Ndu8
Τώρα που αρκετά ύποπτα το truecrypt έχει πάψει να υφίσταται (βλ.http://truecrypt.sourceforge.net/ και οδηγίες εκεί για migrate σε..bitlocker!!) σκέφτηκα κάποιος τρόπος θα υπάρχει για να χρησιμοποιώ τα υπάρχοντα containers που έχω.
Ε λοιπόν, με βασικά εργαλεία του linux, γίνεται η δουλειά:
0) γινόμαστε root ή αποκτάμε τα κατάλληλα priviledges
1) καταρχήν θα κάνουμε attach το container σε μια loopback device
losetup /dev/loop0 /path/to/truecrypt.file
2) ώρα να κάνουμε decrypt το containerdecrypt/open the truecrypt container
cryptsetup --type tcrypt open /dev/loop0 Container
3)δίνουμε το password όταν ζητηθεί. Όπου Container βάζουμε ότι όνομα θέλουμε
4)κάνουμε mount το container σε κάποιον φάκελο που έχουμε φτιάξει
mount /dev/mapper/myContainer /mnt/somefolder
Τώρα τα περιεχόμενα θα πρέπει να είναι εμφανή στο /mnt/somefolder/ ή σε όποιο mountpoint έχουμε επιλέξει!
Για να κάνουμε unmount και γενικώς να κλείσουμε ότι ανοίξαμε:
1) umount /mnt/somefolder
2) cryptsetup --type tcrypt close container
3) losetup -d /dev/loop0
Υπάρχει και μια εφαρμογή η zuluCrypt η οποία απλοποιεί την παραπάνω διαδικασία με ένα frontend που δίνει, αλλά δεν την έχω δοκιμάσει
Gzip compresses by replacing text with pointers to earlier parts of the text. Here’s a visualization of what actually happens when you decompress “The Raven”. It highlights the bits of text that are copied from previously in the poem.
δείτε το AWESOME βιντεάκι που δείχνει πως δουλεύει πάνω σε ένα ποίημα το gzip :D
Original blog post: http://jvns.ca/blog/2013/10/24/day-16-gzip-plus-poetry-equals-awesome/
youtube link: https://www.youtube.com/watch?v=SWBkneyTyPU
Ποιος linuxας δεν έχει ονειρευτεί να κάνει build τον δικό του linux kernel? Ευτυχώς τα πράγματα δεν είναι τόσο δύσκολα όσο παλιότερα και με μερικές εντολές μπορούμε να κάνουμε το όνειρο πραγματικότητα!
χρειαζόμαστε καταρχήν τα παρακάτω
apt-get install libncurses5-dev gcc make git exuberant-ctags
φτιάχνουμε έναν φάκελο στο /usr/src ή όπου θέλουμε και κάνουμε clone το kernel tree κατευθείαν από τον linus
git clone https://github.com/torvalds/linux.git
μπορούμε να δούμε πληροφορίες για τα τελευταία commits και τα περιεχόμενα του tree με τις παρακάτω git εντολές
git tag -l | less
git show
σε περίπτωση που χρειαστεί να ενημερώσουμε το tree, αρκεί να κάνουμε ένα pull ενώ είμαστε στον φάκελο που φτιάξαμε
git pull
με το git log, βλέπουμε τις τελευταίες αλλαγές πχ το τελευταίο commit που έγινε
git log
χρειάζεται τώρα να κάνουμε ένα checkout στην έκδοση του kernel που θέλουμε να ετοιμάσουμε ώστε να μη γίνει compile όλο το tree :)
git checkout -v3.15-rc4
οι επιλογές για το compilation του kernel είναι..1652(!!) οπότε μπορούμε να αντιγράψουμε το υπάρχον working configuration από το σύστημά μας. Καταρχήν εάν είναι ρυθμισμένος ο kernel να κάνει output στο proc το configuration, εύκολα μπορούμε να το πάρουμε κάνοντας:
zcat /proc/config.gz > .config
αν τώρα αυτό δεν υπάρχει, μπορούμε πάντα να το πάρουμε από το /boot/
cp /boot/config-`uname -r` .config
το uname -r το χρησιμοποιούμε για να δούμε την έκδοση kernel που τρέχουμε και το όνομα του config αρχείου είναι απαραίτητα το
.config
σε περίπτωση που θέλουμε να αλλάξουμε ρυθμίσεις όπως πχ να προσθέσουμε μια custom string στο όνομα του kernel, πατάμε nconfig και εξερευνούμε τις ρυθμίσεις
make nconfig
για να γίνει το compilation αρκεί ένα απλό make. Αν τώρα έχουμε πολυπύρηνο επεξεργαστή, μπορούμε να αφιερώσουμε παραπάνω πυρήνες με το -jX όπου Χ o αριθμός πυρήνων. Αν έχουμε 4-πύρηνο επεξεργαστή μπορούμε να βάλουμε οποιονδήποτε αριθμό μεταξύ 2 και 5 (ναι είναι +1 το maximum). Φυσικά αν ταυτόχρονα έχουμε σχέδια όπως να σερφάρουμε για περάσει η ώρα, βάζουμε μικρότερο αριθμό από τον διαθέσιμο.
make -jX
αφού το compilation τελειώσει και το οποίο θα πάρει κάποια ώρα οπότε φτιάξτε κανένα καφέ, φάτε τίποτα κ.ο.κ, ήρθε η στιγμή να κάνουμε στο σύστημα install τα modules του kernel στο /lib/modules/.
Ευτυχώς είναι πολύ εύκολο:
make modules_install
και μετά κάνουμε install τον kernel που περιλαμβάνει αντιγραφή του στο /boot/ αντιγραφή του config, update τον grub και πάει λέγοντας. Μπορείτε να το κάνετε manual όλο αυτό αλλά καλύτερα να πατήσετε:
make install
θα δείτε διάφορα όπως:
sh /media/shared/linux/kernel/linus/linux/arch/x86/boot/install.sh 3.15.0-rc4gdimi-2bab43e2528f arch/x86/boot/bzImage \ System.map "/boot"
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 3.15.0-rc4gdimi-2bab43e2528f /boot/vmlinuz-3.15.0-rc4gdimi-2bab43e2528f
run-parts: executing /etc/kernel/postinst.d/dkms 3.15.0-rc4gdimi-2bab43e2528f /boot/vmlinuz-3.15.0-rc4gdimi-2bab43e2528f
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.15.0-rc4gdimi-2bab43e2528f /boot/vmlinuz-3.15.0-rc4gdimi-2bab43e2528f
update-initramfs: Generating /boot/initrd.img-3.15.0-rc4gdimi-2bab43e2528f
κλπ κλπ
Είμαστε έτοιμοι, κάνουμε reboot και παρακολουθούμε χαροπά τον kernel μας να φορτώνει κατά την εκκίνηση :D
Πάμε τώρα να εγκαταστήσουμε το snmp σε έναν centos server, ώστε με κάποιο cacti πχ να κάνουμε monitoring εκ του μακρώθεν...
Αρχίζουμε με τα βασικά, δηλαδή να εγκαταστήσουμε τα απαραίτητα πακέτα στο σύστημα:
yum install net-snmp net-snmp-utils
αφού μπούν τα πακέτα και κάνα δυο εξαρτήσεις, πάμε να βάλουμε τον snmp daemon να ξεκινά με την κάθε εκκίνηση του συστήματος:
chkconfig snmpd on
τώρα στα ενδιαφέροντα πράγματα, το configuration. Χωρίς πολλά πολλά αυτό είναι ένα minimal configuration:
rwuser noauth
rouser noauth
rocommunity mycommunity 8.8.8.8
syslocation "datacenter"
proc init 1 1
proc httpd 10 1
disk /
load 12 12 12
Όπως λοιπόν είναι προφανές:
- δεν έχουμε authentication
- βάλαμε μια community read-only η οποία είναι συγκεκριμένη ip και της δώσαμε το όνομα mycommunity
- και καλά το location είναι το "datacenter", προφανώς μπορεί να έχει κάποιο όνομα με ..νόημα!
- τσεκάρουμε την init process ώστε να ξέρουμε αν τρέχει ο server
- τσεκάρουμε την process του web server και βάζουμε όρια να τρέχουν 10 το πολύ και μία το λιγότερο processes
- τσεκάρουμε το μέγεθος του root partition, προφανώς μπορούμε να προσθέσουμε και άλλα partions/δισκους/arrays σε ανάλογες directives
- και τέλος τσεκάρουμε το load με 1minute, 5minutes, 15minutes max averages
μετά από αυτά, κάνουμε restart τον snmpd και βλέπουμε αν όλα παίζουν καλά από το remote cacti μας
προφανώς πρέπει να έχουμε ανοίξει την 161 udp port για να παίξει το οτιδήποτε!