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” e’ stato realizzato e distribuito dall’artista deiby-ybied su Deviantart in licenza Creative Commons BY-NC-SA 3.0