http://wikiability.abinsula.com/index.php?title=Corso_Linux_Torino&feed=atom&action=historyCorso Linux Torino - Revision history2024-03-28T20:00:08ZRevision history for this page on the wikiMediaWiki 1.25.1http://wikiability.abinsula.com/index.php?title=Corso_Linux_Torino&diff=3&oldid=prev80.21.33.250: Created page with "== Orario e Luogo == Tutti i mercoledì 18:30-21:00 - Ufficio Poli [https://maps.google.it/maps?f=d&source=s_d&saddr=&daddr=45.064291,7.659892&hl=it&geocode=&sll=45.062382,7...."2015-07-10T15:27:49Z<p>Created page with "== Orario e Luogo == Tutti i mercoledì 18:30-21:00 - Ufficio Poli [https://maps.google.it/maps?f=d&source=s_d&saddr=&daddr=45.064291,7.659892&hl=it&geocode=&sll=45.062382,7...."</p>
<p><b>New page</b></p><div>== Orario e Luogo ==<br />
<br />
Tutti i mercoledì 18:30-21:00 - Ufficio Poli [https://maps.google.it/maps?f=d&source=s_d&saddr=&daddr=45.064291,7.659892&hl=it&geocode=&sll=45.062382,7.658436&sspn=0.009442,0.019741&vpsrc=0&mra=mift&mrsp=1&sz=16&ie=UTF8&ll=45.065474,7.658436&spn=0.009442,0.019741&t=m&z=16&iwloc=ddw1 Mappa]<br />
<br />
== Programma ==<br />
Il programma e l'ordine delle lezioni del corso potrà variare a seconda degli argomenti richiesti dai partecipanti. Di seguito una bozza del programma<br />
<br />
<br />
<br />
<br />
<br />
=== Lezione 1: Overview e Comandi base ===<br />
<br />
In Linux '''everything is a file'''.<br />
<br />
'''Linux FileSystem''' -> insieme di file che genera il sistema operativo<br />
<br />
Non ci sono estensioni, i file non si distinguono tramite il nome, ma tramite il contenuto.<br />
<br />
Descrizione sommaria dei principali componenti del file system:<br />
<br />
/ (root)<br />
/bin (binary) <br />
/usr (user)<br />
/bin<br />
/sbin<br />
/var (variable (size))<br />
/home (users)<br />
/lib (libraries)<br />
/mnt (mount point (in Ubuntu spesso si trova come /media))<br />
/dev (devices (device drivers))<br />
/proc (file system virtuale, generato da OS)<br />
/sys (uguale a /proc, ma più settabile)<br />
/etc (configurazione)<br />
/opt (optional)<br />
/tmp (temporary, mount point per un fs che sta in RAM)<br />
<br />
==== MOUNT POINT ==== <br />
<br />
Il mount point è una folder a cui si aggancia un altro file system o un dispositivo esterno.<br />
<br />
Per esempio posso agganciare alla home l'hard disk principale:<br />
/ <== HARD DISK (PARTIZIONE) - HDA1<br />
<br />
Su /mnt posso agganciare una penna USB<br />
/mnt <== PENNINA USB<br />
<br />
Su /home posso agganciare un hard disk di rete.<br />
/home <== hd di rete<br />
<br />
La cosa figa è che l'apparenza è di navigare sul tuo fs, in realtà a seconda de mount point puoi utilizzare un diverso fs. <br />
In sostanza puoi usare un qualunque file come base per un fs intero.<br />
<br />
La memoria SWAP è una quantità di memoria RAM che viene messa su disco, all'occorrenza.<br />
<br />
Linux è '''multiuser''' e '''multigroup'''.<br />
Ogni user ha un UID, ogni gruppo ha un GID.<br />
<br />
'''Permessi''': sono del tipo R-W-X<br />
<br />
I comandi sono file con permessi di esecuzione.<br />
In genere i comandi, essendo eseguibili, sono dentro /bin.<br />
Per lanciare un comando da ogni parte della shell, devi avere nel path il file in questione. <br />
<br />
====Lista di comandi==== <br />
<br />
--help per avere una lista sommaria di opzioni per ogni comando:<br />
<br />
=====ls=====<br />
<br />
Lista dei file in una directory<br />
<br />
Esempio output: <br />
<br />
<pre><br />
drwxr-xr-x 7 andrea andrea 4096 feb 19 18:44 ./<br />
drwxr-xr-x 56 andrea andrea 4096 feb 18 15:50 ../<br />
-rw-rw-r-- 1 andrea andrea 777 feb 19 18:44 190214_corso<br />
-rw-rw-r-- 1 andrea andrea 417 feb 19 18:40 190214_corso~<br />
-rw------- 1 andrea andrea 84179 gen 29 11:35 acabriolu.pdf<br />
-rw-rw-r-- 1 andrea andrea 489213 feb 3 20:44 aug.jpg<br />
drwxrwxr-x 12 andrea andrea 4096 dic 16 01:38 BK_fabrizio/<br />
-rw-r--r-- 1 andrea andrea 1482528 feb 17 18:24 bk_pre_eqcheck.7z<br />
drwxrwxr-x 2 andrea andrea 4096 feb 17 20:04 build-pre_eqcheck-Desktop-Debug/<br />
</pre><br />
<br />
La prima colonna indica i permessi:<br />
<br />
<pre><br />
drwxr-xr-x <br />
<br />
d sta per "directory"<br />
<br />
rwx (111 = 7) Users<br />
r-x (101 = 5) Groups<br />
r-x (101 = 5) Others<br />
</pre><br />
<br />
Con ls -a, in genere aliasato con la, mostra pure i file nascosti.<br />
<br />
I FILE CHE INIZIANO con . sono nascosti. <br />
<br />
=====pwd=====<br />
<br />
Print working directory<br />
<br />
=====cd=====<br />
<br />
Change directory <br />
Cambia la directory in cui ci si trova.<br />
Molto importante il cd -, che stampa la directory precedente e ci torna.<br />
cd ~ torna alla home assoluta.<br />
<br />
=====man=====<br />
<br />
Manuale dei comandi<br />
man con un argomento numerico mostra diversi tipi di manuale. <br />
<br />
'''Questo comando è una man dal cielo. '''<br />
<br />
=====cat=====<br />
<br />
Visualizza l'interno di un file (codificato in ASCII)<br />
<br />
=====grep=====<br />
<br />
Pattern matching<br />
File README con questo contenuto:<br />
Andrea Cabriolu<br />
Andrea Sanna<br />
Paolo Doz<br />
<br />
Ex. <br />
<br />
<pre>grep "Andrea" README</pre><br />
<br />
Stampa solo le righe che matchano Andrea<br />
<br />
=====Pipe |=====<br />
<br />
Utilizza come input l'output di un comando<br />
<br />
Ex. <br />
<br />
<pre>cat README | grep Andrea </pre><br />
<br />
Stai passando l'output del cat al grep<br />
<br />
=====touch=====<br />
<br />
Crea un file<br />
<br />
* '''less''' <br />
<br />
Stampa un file a pagine<br />
Ex. <br />
<br />
<pre>dmesg | less</pre><br />
<br />
Passi a less una sfilza di messaggi, e lo stampa a pagine<br />
<br />
=====ps=====<br />
<br />
Mostra i processi attivi. <br />
Il vantaggio di ps rispetto a top è che posso usare grep. <br />
ps aux mostra tutti i processi, anche quelli non forkati dalla shell.<br />
<br />
=====kill=====<br />
<br />
Uccide un processo<br />
L'opzione -9 uccide di sicuro il processo. Il "-9" è un segnale indirizzato all'uccisione del processo.<br />
Processo in foreground -> ha il controllo dell'attività<br />
Processo in background -> non ha il controllo dell'attività, ma è attivo<br />
<br />
=====tac=====<br />
<br />
cat al contrario<br />
<br />
=====sort=====<br />
<br />
ordina<br />
<br />
=====du=====<br />
<br />
stima il disk usage<br />
<br />
=====chown=====<br />
<br />
cambia l'owner del file<br />
<br />
<pre><br />
chown utente:gruppo file<br />
</pre><br />
es.<br />
<pre><br />
chown root:www-data file<br />
</pre><br />
<br />
=====chmod=====<br />
<br />
Cambia i permessi di un file<br />
Us. chmod utenti(+-)permessi file<br />
Ex. chmod o-r README -> toglie i permessi di lettura agli altri utenti<br />
<br />
=====cp=====<br />
<br />
Copia un file in un'altra dir<br />
<br />
=====mv=====<br />
<br />
Sposta un file in un'altra dir<br />
<br />
=====mkdir=====<br />
<br />
Crea una directory<br />
mkdir -p -> permette di creare una cartella con già le sottodirectory<br />
<br />
=====tree=====<br />
<br />
Cisualizza l'alberazione delle cartelle come un tree<br />
<br />
=====ln=====<br />
<br />
Crea un link<br />
<br />
Es. <br />
<pre><br />
ln -s file pippo<br />
</pre><br />
Crea un link simbolico<br />
Se crei un sl pippo -> file, poi cancelli file, il link è sospeso, ma esiste. Se ricrei il file, il link torna a funzionare.<br />
L'hard link è diverso. <br />
Se crei un hl pippo -> file, poi cancelli file, il link non è sospeso, ma punta al file, se l'è copiato. Quel file sarà rimosso dal sistema quando cancelli l'hard link.<br />
<br />
* '''''IN UN SISTEMA LINUX UN FILE È RIMOSSO QUANDO TUTTI I RIFERIMENTI AL FILE SONO CANCELLATI.'''''<br />
<br />
===== > =====<br />
<br />
Redirige l'output di un comando, sovrascrivendo<br />
<br />
===== >> ===== <br />
<br />
Redirige l'output di un comando, appendendo<br />
<br />
===== echo===== <br />
<br />
Stampa sullo stdout<br />
<br />
* '''wc''' -> word counter, conta le parole<br />
<br />
Conta le righe:<br />
<pre><br />
wc -l <br />
</pre><br />
<br />
Conta il numero di file in una dir:<br />
<pre><br />
ls | wc<br />
</pre><br />
<br />
<br />
=====`===== <br />
<br />
Apice inverso, stampa l'output del comando. Trasforma l'output di un comandi in stringa<br />
<br />
es.<br />
<br />
<pre><br />
STRINGA=`ls`<br />
</pre><br />
<br />
Il comando `` può essere sostituito da $(comando)<br />
<br />
es<br />
<br />
<pre><br />
STRINGA=$(ls)<br />
</pre><br />
<br />
===== tar===== <br />
<br />
Manipola un archivio di file<br />
<br />
Creo un archivio:<br />
<pre><br />
tar cf archivio.tar <br />
</pre><br />
<br />
Estraggo un archivio:<br />
<pre><br />
tar xf archivio.tar.gz2 <br />
</pre><br />
<br />
Crea un archivio nominato con la data attuale (con j comprimi con bz2):<br />
<pre><br />
tar jcvf archivio_$(date +%Y%m%d).tar.bz2<br />
</pre><br />
<br />
===== file=====<br />
<br />
Identifica il tipo di file<br />
<br />
=====whoami=====<br />
<br />
Mostra il nome dell'utente che attualmente sta usando la console.<br />
<br />
=====export===== <br />
<br />
Salva una variabile<br />
<br />
Ex: aggiungi /home/andrea alla variabile $PATH<br />
<br />
<pre><br />
export PATH=$PATH:/home/andrea<br />
</pre><br />
<br />
=====history===== <br />
<br />
Sstampa tutti gli ultimi comandi lanciati<br />
Lo shortcut da tastiera è CTRL-R<br />
<br />
=====which===== <br />
Indica dove si trova il file, se sta nel PATH<br />
<br />
=====free===== <br />
Mostra la memoria libera<br />
<br />
=====mount=====<br />
Monta una partizione<br />
<br />
Mostra dove sono montate le partizioni:<br />
<pre><br />
$ mount<br />
<br />
/dev/sda1 on / type ext4 (rw,errors=remount-ro)<br />
proc on /proc type proc (rw,noexec,nosuid,nodev)<br />
</pre><br />
<br />
Si legge:<br />
* /dev/sda1 è montato su /, il fs è di tipo ext4<br />
* proc è montato su /proc, di tipo proc<br />
<br />
'''''SI PUÒ MONTARE UN DEVICE IN DUE POSTI'''''<br />
<br />
=====dmesg=====<br />
<br />
Stampa i messaggi dal kernel<br />
<br />
<br />
<br />
<br />
<br />
=== Lezione 2: Comandi avanzati e bash scripting ===<br />
<br />
<br />
==== cut ====<br />
split di una stringa<br />
<br />
<pre><br />
cat /etc/passwd | cut -d: -f1<br />
</pre><br />
<br />
divide la stringa in base a ":" e prende il primo campo.<br />
<br />
<br />
==== tr ====<br />
elimina dei caratteri all'interno della stringa<br />
<br />
<pre><br />
cat /etc/passwd | tr -d [a-z]<br />
</pre><br />
<br />
elimina le lettere dalla "a" alla "z"<br />
<br />
<br />
==== ssh ====<br />
permette di accede ad un server in ssh<br />
<br />
<pre><br />
ssh root@bool.abinsula.com<br />
</pre><br />
<br />
Usare un server pubblico per accedere ad una macchina dietro NAT<br />
<br />
dal pc dietro NAT<br />
<pre><br />
ssh -R 1208:0:22 root@boole.abinsula.com<br />
</pre><br />
<br />
dall'esterno<br />
<pre><br />
ssh root@boole.abinsula.com -p 1208<br />
</pre><br />
<br />
==== awk ====<br />
shell simile a bash, utile per il passaggio di file di testi<br />
<br />
<br />
==== wget ====<br />
scarica pagina http, https, ftp<br />
<br />
<br />
==== curl ====<br />
simile a wget<br />
<br />
<br />
==== netstat ====<br />
<pre><br />
netstat -autwp<br />
netstat -putan<br />
</pre><br />
danno informazioni sui socket aperti<br />
<br />
<br />
==== sed ====<br />
sostituisce dei caratteri o stringhe interne all'interno di una stringa.<br />
"s/" o "s#" è il carattere di inizio stringa da modificare mentre "/g" o "#g" è il carattere di fine stringa da modificare<br />
<br />
<pre><br />
echo "Ciao Andrea" | sed s/Andrea/Paolo/g<br />
<br />
--><br />
<br />
Ciao Paolo<br />
</pre><br />
<br />
<pre><br />
echo "Ciao An\drea" | sed s#A\ndrea#Paolo#g<br />
<br />
--><br />
<br />
Ciao Paolo<br />
</pre><br />
<br />
<pre><br />
echo "Ciao 079andrea079" | sed s#[0-9]#A#g<br />
<br />
--><br />
<br />
Ciao AAAandreaAAA<br />
</pre><br />
<br />
<br />
==== dd ====<br />
copia byte a byte<br />
<br />
<br />
==== diff&patch ====<br />
diff trova le differenze tra due file<br />
<br />
file1.txt<br />
<pre><br />
ciao<br />
mi chiamo<br />
Paola<br />
</pre><br />
<br />
file2.txt<br />
<pre><br />
ciao<br />
mi chiamo<br />
Francesca<br />
</pre><br />
<br />
<pre><br />
diff file1.txt file2.txt<br />
<br />
--><br />
<br />
3c3<br />
< Paola<br />
---<br />
> Francesca<br />
</pre><br />
trova le differenze tra i due file (al posto di "Paola" metti "Francesca" nella terza riga)<br />
<br />
<pre><br />
diff -rup file1.txt file2.txt > file.patch<br />
<br />
--><br />
<br />
--- file1.txt 2014-03-04 20:30:38.008641205 +0100<br />
+++ file2.txt 2014-03-04 20:29:06.808640126 +0100<br />
@@ -1,3 +1,3 @@<br />
ciao<br />
mi chiamo<br />
-Paola<br />
+Francesca<br />
</pre><br />
crea il file di patch per passare da file1.txt a file2.txt<br />
<br />
<pre><br />
patch file1.txt file.patch<br />
</pre><br />
applica la patch al file1.txt per trasformarlo nel file2.txt<br />
<br />
<br />
==== mknod ====<br />
Il chip può avere molte funzionalità, attraverso il driver si riesce a dargli la funzionalità desiderata<br />
I device driver possono essere:<br />
#a caratteri --> comunichi col driver passando dei caratteri (non puoi mai tornare indietro, seriale)<br />
#a blocchi --> accede blocchi di porzioni (dischi, usb, mmc)<br />
#di rete --> interfacce speciali come ad esempio wlan0, eth0, can0 etc.etc (queste interfacce non sono create tramite il comando mknod)<br />
<br />
I nodi sono file speciali che permettono di accedere al device driver e sono caratterizzati da due numeri:<br />
#major --> tipo di driver<br />
#minor --> istanza del device<br />
<br />
<pre><br />
sudo mknod pippopaperino b 8 17<br />
</pre><br />
creo il device pippopaperino di tipo a blocchi (b) con major number 8 (tipo sd)<br />
<br />
<pre><br />
sudo mount pippopaperino /mnt<br />
</pre><br />
Monto il device pippopaperino nella cartella /mnt<br />
<br />
<pre><br />
less /proc/devices<br />
</pre><br />
ti permette di vedere i driver abilitati nel sistema, riportando il major number<br />
<br />
==== sort ====<br />
ordina una lista<br />
lista.txt<br />
<pre><br />
vvv<br />
fff<br />
aaa<br />
ddd<br />
lll<br />
ccc<br />
vvv<br />
</pre><br />
<br />
<pre><br />
cat lista.txt | sort<br />
<br />
--><br />
<br />
aaa<br />
ccc<br />
ddd<br />
fff<br />
lll<br />
vvv<br />
vvv<br />
</pre><br />
<br />
<br />
==== uniq ====<br />
cancella due righe consecutive uguali<br />
<pre><br />
cat lista.txt | sort | uniq<br />
<br />
--><br />
<br />
aaa<br />
ccc<br />
ddd<br />
fff<br />
lll<br />
vvv<br />
</pre><br />
<br />
<br />
==== 01_script.sh ====<br />
<br />
<pre><br />
#!/bin/bash<br />
<br />
IP=$(ifconfig eth0 | grep inet | grep -v inet6 | cut -d':' -f2 | tr -d [a-zA-Z])<br />
echo "Ciao il mio IP e' $IP"<br />
</pre><br />
<br />
<br />
==== 02_script.sh ====<br />
<pre><br />
#!/bin/bash<br />
<br />
IP=$(ifconfig $1 | grep inet | grep -v inet6 | cut -d':' -f2 | tr -d [a-zA-Z])<br />
echo "Ciao il mio IP e' $IP"<br />
</pre><br />
<br />
<br />
==== 03_script.sh ====<br />
<pre><br />
#!/bin/bash<br />
<br />
for ((x=0;x<10;x++)); do<br />
echo "Numero: $x"<br />
done<br />
</pre><br />
<br />
<br />
==== 04_script.sh ====<br />
<pre><br />
#!/bin/bash<br />
<br />
for x in 0 1 2 3 4 5 6 7 8 9; do<br />
echo "Numero: $x"<br />
done<br />
</pre><br />
<br />
<br />
==== 05_script.sh ====<br />
<pre><br />
#!/bin/bash<br />
<br />
for x in $(seq 0 10 1); do<br />
echo "Numero: $x"<br />
done<br />
</pre><br />
<br />
<br />
==== 06_script.sh ====<br />
<pre><br />
#!/bin/bash<br />
<br />
for x in $(cat dipendenti.txt); do<br />
echo "$x sei licenziato"<br />
done</pre><br />
<br />
<br />
==== 07_script.sh ====<br />
<pre><br />
#!/bin/bash<br />
<br />
echo "Quanti anni hai?"<br />
read eta <br />
<br />
if [ $eta -gt 18 ]; then<br />
echo "Sei maggiorenne!";<br />
else<br />
echo "Sei minorenne!";<br />
fi<br />
</pre><br />
<br />
<br />
==== 08_script.sh ====<br />
<pre><br />
#!/bin/bash<br />
<br />
if [ -f dipendenti.txt ]; then<br />
for dipendente in $(cat dipendenti.txt); do<br />
echo "$dipendente e' licenziato";<br />
done<br />
else<br />
echo "Non dipendenti"<br />
fi<br />
</pre><br />
<br />
<br />
==== 09_rubrica.sh ====<br />
<pre><br />
#!/bin/bash<br />
<br />
FILE="/home/paola/Documenti/Corso/AbinsulaLinux/Lezione/elenco_telefonico.txt"<br />
<br />
function inserisci() {<br />
echo "nome"<br />
read NOME<br />
echo "cognome"<br />
read COGNOME<br />
echo "telefono"<br />
read TELEFONO<br />
echo "$NOME:$COGNOME:$TELEFONO" > $FILE<br />
<br />
clear<br />
<br />
echo "Contatto inserito:"<br />
echo "$NOME:$COGNOME:$TELEFONO"<br />
}<br />
<br />
<br />
function cerca_nome() {<br />
echo "nome"<br />
read NOME_UTENTE<br />
NOME=$(cat $FILE | grep $NOME_UTENTE | cut -d: -f1)<br />
COGNOME=$(cat $FILE | grep $NOME_UTENTE | cut -d: -f2)<br />
TELEFONO=$(cat $FILE | grep $NOME_UTENTE | cut -d: -f3)<br />
<br />
clear <br />
<br />
echo "Contatto:"<br />
echo "$NOME:$COGNOME:$TELEFONO"<br />
}<br />
<br />
<br />
function cancella() {<br />
echo "nome"<br />
read NOME_UTENTE<br />
NUOVO_FILE=$(mktemp)<br />
cat $FILE | grep -v $NOME_UTENTE > $NUOVO_FILE<br />
mv $NUOVO_FILE $FILE<br />
<br />
clear<br />
<br />
echo "Contatto eliminato!"<br />
}<br />
<br />
<br />
echo "Menu"<br />
echo "1 - Inserisci"<br />
echo "2 - Cerca per nome"<br />
echo "3 - Cancella"<br />
<br />
<br />
read SCELTA<br />
<br />
if [ $SCELTA = "1" ]; then<br />
inserisci<br />
fi<br />
<br />
if [ $SCELTA = "2" ]; then<br />
cerca_nome<br />
fi<br />
<br />
if [ $SCELTA = "3" ]; then<br />
cancella<br />
fi<br />
</pre><br />
<br />
<br />
==== 10_email.sh ====<br />
<pre><br />
#!/bin/bash<br />
<br />
NOME="Paola"<br />
BOSS="Andrea Sanna"<br />
DATA=$(date | cut -d, -f1)<br />
<br />
<br />
cat > email_licenziamento.txt << CABRIOULU<br />
<br />
<br />
Ciao $NOME,<br />
ti comunico che oggi $DATA tu sei licenziato,<br />
<br />
In fede,<br />
<br />
$BOSS<br />
<br />
CABRIOULU<br />
</pre><br />
<br />
Lo script crea un file email_licenziamento.txt tramite il comando cat. Il comando di "creazione file" termina quando su una linea singola si trova la parola CABRIOULU<br />
<br />
==== 11_export_variabili.sh ====<br />
<pre><br />
#!/bin/bash<br />
<br />
export CC="peppa"<br />
export LD="pig"<br />
</pre><br />
<br />
<pre><br />
source variabili.sh<br />
</pre><br />
<br />
Lo script esporta 2 variabili. Per renderle disponibili nella shell e quindi utilizzabili si usa il comando source<br />
<br />
=== Lezione 3: Linux boot, dal poweron alla shell ===<br />
Slide http://users.abinsula.com/~paolodoz/linux_day_2013/Fastboot.pdf<br />
versione ppt in macchina virtuale che si riavvia di continuo<br />
<br />
Nessuno ha preso appunti?<br />
<br />
<br />
<br />
<br />
<br />
=== Lezione 4: GIT ===<br />
<br />
- Visualizzare il branch direttamente nella PS1<br />
Aggiungere questo al .bashrc<br />
parse_git_branch() {<br />
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \[\1\]/'<br />
}<br />
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\[\033[00;32m\]$(parse_git_branch)\[\033[00m\] \$ '<br />
<br />
<br />
- Che cosa è un version control system e quali sono i più famosi (svn, git)?<br />
<br />
- Cosa è Git?<br />
<br />
- Come si crea un repo sul proprio pc (git init)?<br />
<br />
- Cosa è un commit (git commit e git add)<br />
<br />
- Cosa sono i branch (git branch)?<br />
<br />
- Come ci si sposta tra commit (git checkout)<br />
<br />
- Come si analizzano le modifiche (git diff e git status)<br />
<br />
- Cosa sono i repo origin e come si usano? (git push e git pull)<br />
<br />
- Come si scarica un repository (git clone)<br />
<br />
- Come si aggiorna la working copy (git fetch)<br />
<br />
- Tecniche di merge (git merge, git rebase, git cherrypick)<br />
<br />
- Come si prende la versione per un rilascio (git describe)<br />
<br />
- Come si risolvono errori comuni (git clean, git revert, git reset, git checkout)<br />
<br />
- Come si trova un bug (git bisect)<br />
<br />
- Cosa sono i tag (git tag)<br />
<br />
- Come si ignorano alcuni file (gitignore and keepdirectory)<br />
<br />
====Advanced====<br />
<br />
- Cosa sono i submodule e come si usano (git submodule, init, update, sync, summary)<br />
<br />
- Cosa sono gli stash (git stash save, pop, apply, drop)<br />
<br />
- Come si recupera un commit perso (git reflog)<br />
<br />
- vedere un repository git via http (git instaweb --httpd=webrick)<br />
<br />
- Git "grafico" (gitg, gitk)<br />
<br />
<br />
<br />
<br />
<br />
=== Lezione 5: Kernel ===<br />
Come configurare, compilare e avviare un nuovo kernel. Spiegazione delle principali sezioni<br />
<br />
Changes sulle new releases: http://kernelnewbies.org/Linux_3.14<br />
<br />
Link ufficiale: http://wiki.ubuntu-it.org/AmministrazioneSistema/CompilazioneKernel<br />
<br />
* Modulo -> porzione di codice caricata dinamicamente sul kernel<br />
* Driver -> porzione di codice caricata staticamente sul kernel <br />
<br />
Due modi per inserire i moduli:<br />
<br />
* Insmod -> non controlla le dipendenze<br />
* Modprobe -> le controlla<br />
<br />
<br />
<br />
<br />
<br />
<pre><br />
git://git.freescale.com/imx/linux-2.6-imx.git<br />
</pre><br />
kernel da scaricare<br />
<br />
<br />
<pre><br />
make menuconfig<br />
</pre><br />
configurare il kernel (lanciare il comando dalla root del kernel scaricato)<br />
<br />
<br />
<pre><br />
ncurses dev<br />
</pre><br />
possibili pacchetti da scaricare per visualizzare il menù di configurazione del kernel<br />
<br />
<br />
<pre><br />
*<br />
</pre><br />
driver build-in (compilati all'interno del kernel)<br />
<br />
<br />
<pre><br />
M<br />
</pre><br />
moduli (compilati successivamente e solo se vogliamo compilare anche i moduli)<br />
<br />
<br />
<pre><br />
insmod <filename.ko><br />
</pre><br />
inserisce il modulo per il kernel, ma non controlla eventuali dipendenze<br />
<br />
<br />
<pre><br />
modprobe <filename.ko><br />
</pre><br />
inserisce il modulo e eventuali altri moduli che sono dipendenze di quest'ultimo. Le dipendenze vengono impostate in fase di compilazione<br />
<br />
<br />
<pre><br />
shift + 7<br />
</pre><br />
cerca all'interno del menù di configurazione<br />
<br />
<br />
<pre><br />
shift + ?<br />
</pre><br />
help<br />
<br />
<br />
<br />
==== VOCI PRINCIPALI ====<br />
ogni voce identifica una sezione del kernel<br />
*General Setup<br />
<pre><br />
tipo di compressione<br />
supporto swap<br />
utilizzo system D --> abilitare code POSIX<br />
dimensione kernel log buffer size<br />
control group support --> System D<br />
ramdisk --> mount point, compressione<br />
optmize for size<br />
embedded system --> sempre abilitato nei sistemi embedded, apre nuovi menu<br />
kernel performance events and counters<br />
GCOV-based kernel profiling --> coverage - per capire con i test quanta porzioni di codice è stata utilizzata<br />
</pre><br />
*Enable Loadble Module Support<br />
*Devices Driver<br />
*Debugfs<br />
<pre><br />
interfaccia che mette a disposizione file e opzioni per debugare<br />
</pre><br />
*Firmware Devices<br />
<pre><br />
impostazioni del firmware<br />
</pre><br />
*File System<br />
*Kernel Hacking<br />
*Security Options<br />
*Virtualization<br />
<br />
<br />
<br />
==== DOMANDE ====<br />
Tutti i driver possono essere compilati come moduli?<br />
<br />
Sì, solo se al loro interno hanno init module ed exit module<br />
<br />
<br />
<br />
==== STEP ====<br />
# Salvare la configurazione effettuata (salvataggio nel file .config)<br />
# Spostare il file .config in /arch/x86/configs<br />
# make nomefile_defconfig (oppure make oldconfig)<br />
# make -j 6 zImage<br />
# make -j 6 modules<br />
# make -j 6 modules_install<br />
# sudo make install<br />
# sudo grub update<br />
<br />
<br />
<br />
----<br />
<br />
==== STEP V2 =) ====<br />
<br><br />
<br />
* Vedere il kernel attualmente in uso (e.g. Linux moody-xps13 3.11.0-15-generic #25-Ubuntu SMP Thu Jan 30 17:22:01 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux)<br />
$uname -a<br />
<br />
<br />
* Scaricare la propria versione del kernel da: https://www.kernel.org/pub/linux/kernel/ (e.g nel mio caso il kernel più simile era linux-3.11.1.tar.gz)<br />
<br />
<br />
* Estrarre l'archivio <br />
$tar -zxvf linux-3.11.1.tar.gz<br />
<br />
<br />
* Sotto /linux-3.11.1$ ll arch/x86/configs/ ho tre possibili file di configurazione<br />
$ls /linux-3.11.1$ ll arch/x86/configs/<br />
-rw-r--r-- 1 moody moody 7293 set 14 2013 i386_defconfig<br />
-rw-r--r-- 1 moody moody 539 set 14 2013 kvm_guest.config<br />
'''-rw-r--r-- 1 moody moody 7284 set 14 2013''' (*) più simile al mio <br />
<br />
<br />
* Scelto il file di configurazione lancio il make <br />
$make x86_64_defconfig<br />
Questo comando non fa altro che copiare il file '''x86_64_defconfig''' sotto '''.config''' quindi è equivalente a: <br />
$cp arch/x86/configs/x86_64_defconfig .config<br />
In teoria dovrei poi editare questo file per configurare il kernel da zero, in pratica è troppo complicato. Quindi uso il file di configurazione attualmente in uso dal mio kernel <br />
$cp /boot/config-3.11.0-15-generic .config<br />
<br />
<br />
* Aggiungo/tolgo le cose che mi servono dal mio file .config usando il menu di configurazione (potrei anche editarlo a mano)<br />
$make menuconfig<br />
<br />
<br />
* $make -j6 bzImage<br />
<br />
<br />
* $make -j6 modules<br />
<br />
<br />
* #make -j6 modules_install<br />
<br />
<br />
* #make install<br />
<br />
<br />
* #update-grub<br />
<br />
==== FILE IMPORTANTI ====<br />
* linux/drivers/input<br />
<pre><br />
kconfig<br />
Makefile<br />
MAINTAINERS<br />
</pre><br />
<br />
* linux<br />
<pre><br />
Documentation<br />
Makefile<br />
</pre><br />
<br />
<br />
<br />
==== COMANDI IMPORTANTI ====<br />
<pre><br />
cat /proc/cmdline<br />
</pre><br />
conoscere kernel usato<br />
<br />
<br />
<pre><br />
/boot/config-3-11-0-17-generic<br />
</pre><br />
file di configurazione del kernerl usato<br />
<br />
<br />
<pre><br />
lspci<br />
</pre><br />
conoscere hw<br />
<br />
<br />
<pre><br />
lsusb<br />
</pre><br />
conoscere hw<br />
<br />
<br />
<pre><br />
ls /lib/modules<br />
</pre><br />
elenco kernel<br />
<br />
<br />
<pre><br />
uname -a<br />
</pre><br />
kernel che gira in questo momento<br />
<br />
<br />
<pre><br />
cd /lib/modules/3.17-generic/kernel<br />
</pre><br />
E' la cartella dove si trovano i moduli del kernel con nome 3.17-generic. Per entrare nella cartella di quello che gira attualmente sul sistema, si può integrare il comando precedente in questo modo<br />
<pre><br />
cd /lib/modules/`uname -r`/kernel<br />
</pre><br />
<br />
=== Lezione 6: Yocto e Cross-compilazione ===<br />
<br />
La cross-compilazione serve a creare un binario che deve girare su un'architettura diversa da quella della macchina su cui si è lanciata la cross-compilazione.<br />
<br />
La toolchain è l'insieme delle librerie (già cross-compilate) da cross-compilare insieme al codice. Chain perchè l'output di uno dei tool è l'input del successivo.<br />
<br />
Yocto è uno strumento che genera toolchain.<br />
<br />
Yocto è una meta-distribuzione, da configurare per girare su un particolare hardware. <br />
Di base è un file di testo, a cui dare in pasto una recipe (ricetta), un'insieme di istruzioni ed elementi che permettono la customizzazione di Yocto.<br />
<br />
Recipe -> contiene diverse info. <br />
Prima di tutto come avverrà la compilazione, poi le dipendenze, etc.<br />
<br />
Esempio: devo compilare gstreamer, ma solo 3 pacchetti su 50. <br />
Quindi la recipe di gstreamer permette di dividere il compilato in pacchetti diversi, e poi caricare solo quelli che ti servono.<br />
<br />
C'è una ricetta speciale, "image", che dice quali pacchetti vuoi, e alla fine genera la core_image. <br />
<br />
Sopra le ricette ci sono i layer, chiamati meta.<br />
Raccolgono insiemi di ricette. <br />
Per esempio, meta-ability contiene le ricette per i pacchetti relativi solo ad Ability. <br />
Lo scopo finale è quello di raggruppare il lavoro, in qualche modo. Ottenuto un set di ricette interessante, si può radunare in un meta e clonare. <br />
<br />
C'è molto lavoro svolto su Yocto, per esempio se ti serve un meta per KDE, puoi rintracciarlo e scaricarlo. <br />
<br />
Le ricette hanno estensione ".bb" (bitbake). <br />
Il template del nome è "PN_PV.bb". E' una convenzione. PackageName, PackageVersion.<br />
Quindi una ricetta si può chiamare telemaco_3.0.bb.<br />
<br />
Scriptando un po', si possono creare ricette astrattissime. <br />
<br />
Ogni ricetta può essere chiamata per:<br />
<br />
- essere compilata<br />
- essere inclusa come pacchetto<br />
<br />
Passi durante la compilazione:<br />
<br />
do_fetch<br />
do_unpack<br />
do_configure<br />
do_compile<br />
do_install<br />
do_packages<br />
do_somethingelse<br />
<br />
=== Il processo di cross-compilazione ===<br />
=== Automatizzare una build (Ability) ===<br />
=== Remote debugging ===<br />
* gdb<br />
* gdbserver<br />
=== compito finale ===<br />
Realizzare una build yocto per replicare il filesystem della demo TATA<br />
<br />
== Esercizi ==<br />
=== ES 1: Connessione automatica ssh ===<br />
Realizzare un script per la connessione automatica ssh verso un host che espone un servizio su una porta specifica<br />
<br />
INPUT:<br />
* username connessione ssh<br />
* porta da cercare<br />
* interfaccia di rete su cui effettuare lo scan<br />
<br />
OUTPUT:<br />
* stampa a video degli IP che hanno il servizio cercato attivo<br />
* avvio automatico di connessione ssh verso il primo host che espone quel servizio<br />
<br />
BONUS:<br />
* lettura dei parametri in ordine casuale tramite -p -u<br />
* se non specificati parametri default<br />
<br />
Esempio pratico di utilizzo: Voglio connettermi al device Simpleaudio ma ad ogni avvio prende un IP diverso, espone il servizio sulla porta 50003<br />
<br />
Programmi da usare<br />
* ifconfig/ip<br />
* nmap (attenzione al range su cui viene lanciato lo scan)<br />
* grep<br />
* tr/sed<br />
<br />
Nota bene: lo stesso servizio può essere in esecuzione sulla macchina locale e l'ip deve escluso dalla lista di connessione<br />
<br />
=== ES 2: Ricompilazione kernel per il proprio pc ===<br />
Obiettivo dell'esercitazione è ricompilare e installare l'ultimo kernel disponibile su https://www.kernel.org/ (3.14 ad oggi) per il proprio notebook.<br />
<br />
Prestare particolare attenzione alla configurazione cercando di eliminare il supporto per i device non utilizzati e scegliere di quelli disponibili, quali includere come moduli e quali built-in.<br />
<br />
Consegna 16 aprile<br />
<br />
Se per la compilazione/installazione vi manca qualche pacchetto, riportatelo nel capitolo kernel qui sopra<br />
<br />
== Risorse ==<br />
<br />
* The Linux command line [http://it-ebooks.info/book/2012/]<br />
* The bash manual [http://www.gnu.org/software/bash/manual/bashref.html]<br />
* Bash reference card [http://tldp.org/LDP/abs/html/refcards.html]</div>80.21.33.250