Linux Tutorial – Puntata 14

di jolek78

Care/i fruitrici e fruitori del blog, in questi post – ogni domenica mattina – si parlerà del sistema operativo GNU/Linux e degli strumenti per utilizzarlo al massimo delle potenzialità. Cercheremo di spiegare come funziona, cosa è il kernel, come costruirsi una vpn, come settare un firewall e giocare col terminale, usare adb e altro. Se il capitalismo della sorveglianza ci vuole passivi consumatori-consumatrici di servizi noi si risponde con un po’ di “cultura informatica” e un MARAMEO (quasi affettuoso). Buona lettura!

Buona domenica a tutti e bentornati nel nostro viaggio all’interno del sistema operativo Gnu/Linux. Come avrete notato, siamo ancora fermi al FHS e dopo aver esplorato la scorsa settimana la directory /home questa settimana è la volta di quella dedicata alle librerie, ovvero la /lib. Vedremo che non è propriamente una directory ma una subdirectory posizionata da un link simbolico, e vedremo che è ricchissima d’informazioni essenziali per far funzionare qualsiasi applicazione installata sul nostro sistema operativo, incluso il kernel. Sedetevi comodi, prendetevi la vostra tazza di the. Si comincia con un altro viaggio.


/LIB

 bottega@bottegadelbarbieri  /  ls -lh
total 80K
lrwxrwxrwx 1 root root 7 Feb 27 08:53 bin -> usr/bin
drwxr-xr-x 5 root root 4.0K Jun 5 12:43 boot
drwxrwxr-x 2 root root 4.0K Feb 27 08:56 cdrom
drwxr-xr-x 20 root root 4.2K Jun 5 10:24 dev
-rw-r--r-- 1 root root 0 Apr 25 07:26 dmraid-map
drwxr-xr-x 143 root root 12K Jun 5 12:44 etc
drwxr-xr-x 4 root root 4.0K Apr 29 17:29 home
lrwxrwxrwx 1 root root 7 Feb 27 08:53 lib -> usr/lib        <<<<<
lrwxrwxrwx 1 root root 9 Feb 27 08:53 lib32 -> usr/lib32    <<<<<
lrwxrwxrwx 1 root root 9 Feb 27 08:53 lib64 -> usr/lib64    <<<<<
lrwxrwxrwx 1 root root 10 Feb 27 08:53 libx32 -> usr/libx32 <<<<<
drwx------ 2 root root 16K Feb 27 08:53 lost+found
drwxr-xr-x 3 root root 4.0K May 5 20:31 media
drwxr-xr-x 2 root root 0 Jun 5 10:24 mnt
-rw-r--r-- 1 root root 63 Apr 25 07:26 mounted-map
drwxr-xr-x 2 root root 4.0K Feb 9 18:48 opt
dr-xr-xr-x 236 root root 0 Jun 5 10:24 proc
-rw-r--r-- 1 root root 0 Apr 25 07:26 raided-map
drwx------ 3 root root 4.0K Apr 25 07:00 root
drwxr-xr-x 34 root root 1.2K Jun 5 12:43 run
lrwxrwxrwx 1 root root 8 Feb 27 08:53 sbin -> usr/sbin
drwxr-xr-x 2 root root 4.0K Feb 27 09:10 snap
drwxr-xr-x 2 root root 4.0K Feb 9 18:48 srv
-rw-r--r-- 1 root root 15 Apr 25 07:26 swaps-map
dr-xr-xr-x 13 root root 0 Jun 5 10:24 sys
drwxrwxrwt 15 root root 4.0K Jun 5 12:46 tmp
drwxr-xr-x 14 root root 4.0K Feb 9 18:52 usr
drwxr-xr-x 14 root root 4.0K Feb 9 19:08 var

Intanto, come potete vedere, le tre directory

lrwxrwxrwx   1 root root    7 Feb 27 08:53 lib -> usr/lib   <<<<<<<<<<<<< 
lrwxrwxrwx 1 root root 9 Feb 27 08:53 lib32 -> usr/lib32    <<<<<<<<<<<<< 
lrwxrwxrwx 1 root root 9 Feb 27 08:53 lib64 -> usr/lib64    <<<<<<<<<<<<< 
lrwxrwxrwx 1 root root 10 Feb 27 08:53 libx32 -> usr/libx32 <<<<<<<<<<<<<

sono semplicemente dei link simbolici alle dir /usr/lib*.

l    << link
rwx
rwx
rwx

Questo è un punto a favore perché vuol dire che lo standard FHS fornisce semplicemente un riferimento comodo dentro la / (root) dir dove poter trovare quello che stiamo cercando. Ma cosa contiene /lib (o meglio /usr/lib/)? Beh in sostanza contiene tutte le librerie condivise del kernel e dei programmi che lavorano nel sistema. Una divisione molto essenziale quindi di modo che i programmi che stanno in /bin e /sbin (li abbiamo visti in una puntata precedente) sappiano dove andare a prendere le proprie risorse per poter eseguire i propri task. Ma ci sono delle piccole differenze:

/usr/lib:
total 3.3M          <<<<<<
drwxr-xr-x 116 root root 4.0K Apr  8 06:30 .
drwxr-xr-x  14 root root 4.0K Feb  9 18:52 ..

/usr/lib32:
total 8.0K          <<<<<<
drwxr-xr-x  2 root root 4.0K Feb  9 18:48 .
drwxr-xr-x 14 root root 4.0K Feb  9 18:52 ..

/usr/lib64:
total 8.0K          <<<<<<
drwxr-xr-x  2 root root 4.0K Feb  9 18:50 .
drwxr-xr-x 14 root root 4.0K Feb  9 18:52 ..

/usr/libx32:
total 8.0K          <<<<<<
drwxr-xr-x  2 root root 4.0K Feb  9 18:48 .
drwxr-xr-x 14 root root 4.0K Feb  9 18:52 ..

Innanzitutto, come si può vedere, più del 99% delle librerie è dentro /lib. Le subdir /lib32 /lib64 e /libx64 sono praticamente vuote. L’idea che sta alla base della creazione strutturata delle dir addizionali è nel tentativo di dividere le librerie che contenevano le risorse per i programmi a 32 e 64 bit durante il periodo di transizione da 32 a 64. C’e’ stata un’epoca storica infatti in cui tutti i sistemi operativi, incluso linux, stavano transitando dai 32 ai 64 bit, e avere directory aggiuntive era essenziale per far funzionare differenti programmi per differenti infrastrutture.

Ergo, possiamo soffermarci essenzialmente dentro /lib.

bottega@bottegadelbarbieri  /lib  ls -d */
accountsservice/  engrampa/                   init/               modprobe.d/           pppd/                       tc/
apparmor/         environment.d/              initramfs-tools/    modules/              pulse-13.99.1/              terminfo/
apt/              file/                       ispell/             modules-load.d/       purple-2/                   thunderbird/
aspell/           firefox/                    kernel/             netplan/              python2.7/                  thunderbird-addons/
atril/            firefox-addons/             klibc/              networkd-dispatcher/  python3/                    tmpfiles.d/
binfmt.d/         firmware/                   language-selector/  NetworkManager/       python3.8/                  ubiquity/
blueman/          gcc/                        libmbim/            nvidia/               python3.9/                  ubuntu-release-upgrader/
bluetooth/        ghostscript/                libqmi/             openssh/              recovery-mode/              udev/
bolt/             gimp/                       libreoffice/        open-vm-tools/        rsyslog/                    udisks2/
brltty/           girepository-1.0/           lightdm/            os-prober/            sasl2/                      ufw/
console-setup/    git-core/                   linux/              os-probes/            snapd/                      unity-settings-daemon-1.0/
crda/             gnome-settings-daemon-3.0/  linux-boot-probes/  p7zip/                software-properties/        update-notifier/
cryptsetup/       gnupg/                      linux-sound-base/   packagekit/           speech-dispatcher-modules/  upower/
cups/             gnupg2/                     locale/             pcmciautils/          ssl/                        valgrind/
dbus-1.0/         groff/                      lp_solve/           pidgin/               sudo/                       X11/
debug/            grub/                       lsb/                pkgconfig/            sysctl.d/                   x86_64-linux-gnu/
dpkg/             grub-legacy/                man-db/             pm-utils/             sysstat/                    xfce4/
eject/            gvfs/                       memtest86+/         policykit-1/          systemd/                    xorg/
emacsen-common/   hdparm/                     mime/               policykit-1-gnome/    sysusers.d/                 xserver-xorg-video-intel/

Quelle che vedete sono le directory all’interno delle quali sono posizionate le librerie. Per verificare quello che ci siamo detti, e cioè che i programmi siano in /bin o /sbin e che le librerie siano in /lib, facciamo giusto alcuni esempi. Prendiamo i programmi ssl e git:

– dove sono gli eseguibili?

bottega@bottegadelbarbieri  /lib  which openssl
/usr/bin/openssl

bottega@bottegadelbarbieri  /lib  which git
/usr/bin/git

– dove sono le librerie?

bottega@bottegadelbarbieri  /lib  ldd /usr/bin/openssl
	linux-vdso.so.1 (0x00007ffcd35d5000)
	libssl.so.1.1 => /lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f93da5bb000)
	libcrypto.so.1.1 => /lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f93da2e5000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f93da2c2000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f93da0d0000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f93da0ca000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f93da71e000)

bottega@bottegadelbarbieri  /lib  ldd /usr/bin/git
	linux-vdso.so.1 (0x00007fffc76a6000)
	libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007ffa2a55f000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ffa2a543000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ffa2a520000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffa2a32e000)
	/lib64/ld-linux-x86-64.so.2 (0x00007ffa2a93c000)

– come e’ composto un file di libreria?

bottega@bottegadelbarbieri  /proc  objdump -T  /lib/x86_64-linux-gnu/libssl.so.1.1 |head -n 15

/lib/x86_64-linux-gnu/libssl.so.1.1:     file format elf64-x86-64

DYNAMIC SYMBOL TABLE:
0000000000000000      DF *UND*	0000000000000000  OPENSSL_1_1_0 EVP_camellia_128_cbc
0000000000000000      DF *UND*	0000000000000000  OPENSSL_1_1_0 CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE
0000000000000000      DF *UND*	0000000000000000  OPENSSL_1_1_0 ENGINE_load_ssl_client_cert
0000000000000000      DF *UND*	0000000000000000  OPENSSL_1_1_0 OCSP_response_get1_basic
0000000000000000      DF *UND*	0000000000000000  OPENSSL_1_1_0 OPENSSL_sk_value
0000000000000000      DF *UND*	0000000000000000  OPENSSL_1_1_0 HMAC_CTX_new
0000000000000000      DF *UND*	0000000000000000  OPENSSL_1_1_0 EVP_PKEY_get0
0000000000000000      DF *UND*	0000000000000000  OPENSSL_1_1_0 EVP_MD_type
0000000000000000      DF *UND*	0000000000000000  OPENSSL_1_1_0 d2i_PrivateKey
0000000000000000      DF *UND*	0000000000000000  OPENSSL_1_1_0 EVP_aes_256_ccm
0000000000000000      DF *UND*	0000000000000000  OPENSSL_1_1_0 EVP_DigestInit_ex

bottega@bottegadelbarbieri  /proc  objdump -T  /lib/x86_64-linux-gnu/libpcre2-8.so.0 |head -n 15

/lib/x86_64-linux-gnu/libpcre2-8.so.0:     file format elf64-x86-64

DYNAMIC SYMBOL TABLE:
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3   __ctype_toupper_loc
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 free
0000000000000000  w   D  *UND*	0000000000000000              _ITM_deregisterTMCloneTable
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strlen
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.4   __stack_chk_fail
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 mmap
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strchr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memset
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memchr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memcmp
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.4 __memcpy_chk

Vorrei farvi notare una cosa interessante.
Se notate, sia in ssl che in git e’ presente la libreria:

/lib64/ld-linux-x86-64.so.2

Nella fattispecie questa libreria e’ parte di un pacchetto che si chiama glibc -librerie C per GNU- ed e’ una libreria condivisa, cioe’ viene utilizzata da vari programmi allo stesso modo. Ergo: se un domani dovessimo installare un nuovo pacchetto che ha bisogno delle glibc per funzionare, il sistema fara’ riferimento a quelle gia’ presenti senza installarle nuovamente. Intelligente vero?

Alla prossima settimana!
jolek78

>> Indice <<
Puntata 13 < > Puntata 15

Il logo “tux-linux-by-deiby-ybied” e’ stato realizzato da laboratoriolinux in licenza Creative Commons BY-NC-SA 2.0

Fabio
Un tizio che pensava di essere uno scienziato. Si ritrovò divulgatore scientifico. Poi si addormentò e si svegliò informatico. Ma era sempre lui.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *