Tips en Trucs 2021

Ongeldige symbolische koppelingen opsporen

Symbolische koppelingen (symlinks) of software koppelingen (soft links) worden gebruikt als snelkoppelingen naar bestanden. Symlinks worden veel gebruik om te verwijzen naar bibliotheken (libraries) voor programma's.

Bij het verwijderen van het originele bestand waarnaar de symlink wijst, blijft deze verweest achter. Zo'n koppelingen houden is geen goed idee.

Maar hoe vindt je niet werkende symlinks? Sommige distributies geven niet werkende symlinks weer in een opvallende kleur, maar zo vind je ze niet allemaal.

Symlinks

Gebruik find

De fantastische find opdracht kan niet werkende symlinks opsporen. Recente find versies hebben er zelfs een speciale optie voor.

Om alle niet werkende symlinks in de huidige map en al zijn submappen op te sporen, gebruik je:

dany@pindabook:~> find . -xtype l

Geen uitvoer betekent geen niet werkende symlinks en dus is alles OK.

Om het volledige systeem te doorzoeken, start je find als root gebruiker en vertrek je vanaf de root map (/):

dany@pindabook:~> sudo find / -xtype l
[sudo] wachtwoord voor root: 
/usr/share/licenses/libxslt-tools/COPYING
/usr/share/doc/packages/hunspell/README
/usr/share/doc/packages/groff/pdf/mom-pdf.pdf
/usr/share/man/man8/named-compilezone.8.gz
find: ‘/usr/share/groff/1.22.3/current’: Te veel niveaus van symbolische koppelingen -- vermoedelijk een lus
find: ‘/run/user/1000/gvfs’: Toegang geweigerd
/run/udev/watch/8
/run/udev/watch/7
/run/udev/watch/6
/run/udev/watch/4
/run/udev/watch/3
/run/udev/watch/1
/proc/2/task/2/exe
/proc/2/exe
/proc/3/task/3/exe
/proc/3/exe
...
/proc/4840/task/4840/exe
/proc/4840/exe
find: ‘/proc/5763/task/5763/fd/6’: Bestand of map bestaat niet
find: ‘/proc/5763/task/5763/fdinfo/6’: Bestand of map bestaat niet
find: ‘/proc/5763/fd/5’: Bestand of map bestaat niet
find: ‘/proc/5763/fdinfo/5’: Bestand of map bestaat niet
/var/agentx
/var/cache/zypp/raw/openSUSE-Leap-15.2-1/.repo_gpgcheck
/var/cache/zypp/raw/google-chrome/.repo_gpgcheck
/var/cache/zypp/raw/repo-update/.repo_gpgcheck
/var/cache/zypp/raw/repo-oss/.repo_gpgcheck
/var/cache/zypp/raw/http-download.opensuse.org-e13e5001/.repo_gpgcheck
/var/cache/zypp/raw/repo-update-non-oss/.repo_gpgcheck
/var/cache/zypp/raw/repo-non-oss/.repo_gpgcheck
/var/cache/zypp/raw/packman-essentials/.repo_gpgcheck
/var/cache/zypp/raw/teams/.repo_gpgcheck

Oeps, nu krijgen we een massa niet werkende symlinks voorgeschoteld. De virtuele map /proc/ bevat echter niet werkende koppelingen naar processen die reeds afgesloten werden. Dus op zich geen probleem. Bovendien is het een virtuele map die bij het afsluiten van het systeem wordt verwijderd en bij de volgende start opnieuw wordt aangemaakt. De lijst bevat ook veel foutmeldingen zoals find: ‘/run/user/1000/gvfs’: Toegang geweigerd. Om als gewone gebruiker alle toegankelijke niet werkende symlinks op te sporen, gebruik je beter:

dany@pindabook:~> find / -xtype l 2> /dev/null
/usr/share/licenses/libxslt-tools/COPYING
/usr/share/doc/packages/hunspell/README
/usr/share/doc/packages/groff/pdf/mom-pdf.pdf
/usr/share/man/man8/named-compilezone.8.gz
/run/udev/watch/8
/run/udev/watch/7
/run/udev/watch/6
/run/udev/watch/4
/run/udev/watch/3
/run/udev/watch/1
/var/agentx
/var/cache/zypp/raw/openSUSE-Leap-15.2-1/.repo_gpgcheck
/var/cache/zypp/raw/google-chrome/.repo_gpgcheck
/var/cache/zypp/raw/repo-update/.repo_gpgcheck
/var/cache/zypp/raw/repo-oss/.repo_gpgcheck
/var/cache/zypp/raw/http-download.opensuse.org-e13e5001/.repo_gpgcheck
/var/cache/zypp/raw/repo-update-non-oss/.repo_gpgcheck
/var/cache/zypp/raw/repo-non-oss/.repo_gpgcheck
/var/cache/zypp/raw/packman-essentials/.repo_gpgcheck
/var/cache/zypp/raw/teams/.repo_gpgcheck

De optie 2> /dev/null zorgt ervoor dat alle foutmeldingen niet worden weergegeven.

Gebruik symlinks

De opdracht symlinks is speciaal ontwikkeld om symbolische koppelingen te beheren.

Installatie van symlinks

Symlinks is niet opgenomen in de standaard softwarebronnen van openSUSE Leap 15.2. Om dit hulpprogramma's te installeren, voeg je als volgt de extra softwarebron Utilities toe aan het softwarebeheer:

dany@pindabook:~> sudo zypper addrepo -f https://download.opensuse.org/repositories/utilities/openSUSE_Leap_15.2/ utilities
[sudo] wachtwoord voor root: 
Opslagruimte 'utilities' wordt toegevoegd ...................................................................................[gereed]
Opslagruimte 'utilities' is toegevoegd

URI                    : https://download.opensuse.org/repositories/utilities/openSUSE_Leap_15.2/
Ingeschakeld           : Ja
GPG-controle           : Ja
Automatisch vernieuwen : Ja
Prioriteit             : 99 (standaard prioriteit)

Prioriteiten van opslagruimtes hebben geen effect. Alle ingeschakelde opslagruimtes delen dezelfde prioriteit.

Daarna kunnen we het symlinks softwarepakket installeren. Tegelijkertijd importeren we met de optie --gpg-auto-import-keys de GPG-sleutels waarmee we aangeven dat de softwarebron te vertrouwen is:

dany@pindabook:~> sudo zypper --gpg-auto-import-keys install symlinks
Ophalen van metagegevens uit opslagruimte 'utilities' ----------------------------------------------------------------------------[\]

De volgende sleutel wordt automatisch geïmporteerd:

  Opslagruimte:              utilities
  Sleutelnaam:               utilities OBS Project 
  Vingerafdruk van sleutel:  8B007963 8DF609E2 FD8B8CCE 7CD94DEB 9056621D
  Sleutel aangemaakt:        wo 17 jul 2019 14:52:30 CEST
  Sleutel verloopt op:       vr 24 sep 2021 14:52:30 CEST
  Rpm-naam:                  gpg-pubkey-9056621d-5d2f1a0e


Ophalen van metagegevens uit opslagruimte 'utilities' .......................................................................[gereed]
Cache van opslagruimte 'utilities' wordt gebouwd ............................................................................[gereed]
Gegevens van opslagruimte laden...
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

Het volgende NIEUWE pakket zal worden geïnstalleerd:
  symlinks

1 nieuw te installeren pakket.
Totale downloadgrootte: 14,8 KiB. Reeds in de cache: 0 B. Na de bewerking zal aanvullend 16,4 KiB worden gebruikt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
pakket symlinks-1.4-lp152.1.1.x86_64 wordt opgehaald                                           (1/1),  14,8 KiB ( 16,4 KiB uitgepakt)
Ophalen: symlinks-1.4-lp152.1.1.x86_64.rpm ..................................................................................[gereed]

Controleren op conflicten tussen bestanden: .................................................................................[gereed]
(1/1) Installeren van: symlinks-1.4-lp152.1.1.x86_64 ........................................................................[gereed]

Niet werkende symlinks opsporen

Om problematische symbolische koppelingen met de symlinks opdracht op te sporen, gebruik je:

dany@pindabook:~> symlinks .
other_fs: /home/dany/Afbeeldingen -> /usr/home/Documents/Afbeeldingen/
other_fs: /home/dany/Openbaar -> /usr/home/Documents/Openbaar/
other_fs: /home/dany/Sjablonen -> /usr/home/Documents/Sjablonen/
other_fs: /home/dany/Muziek -> /usr/home/Documents/Muziek/
other_fs: /home/dany/Documenten -> /usr/home/Documents/
other_fs: /home/dany/Video's -> /usr/home/Documents/Video's/

De hier weergegeven koppelingen zijn problematisch omdat ze verwijzen naar een andere schijf. Dit heb ik echter bewust gedaan om de gegevens te scheiden van het systeem waardoor ik eenvoudiger back-ups kan maken en het systeem kan upgraden. Laten we het volledige systeem eens onder de loep nemen:

dany@pindabook:~> symlinks -r / 2> /dev/null | grep dangling
dangling: /usr/share/licenses/libxslt-tools/COPYING -> ./Copyright
dangling: /usr/share/doc/packages/hunspell/README -> README.md
dangling: /usr/share/doc/packages/groff/pdf/mom-pdf.pdf -> ../examples/mom/mom-pdf.pdf
dangling: /usr/share/man/man8/named-compilezone.8.gz -> named-checkzone.8.gz
dangling: /usr/share/groff/1.22.3/current -> current
dangling: /var/agentx -> /run/agentx
dangling: /var/cache/zypp/raw/openSUSE-Leap-15.2-1/.repo_gpgcheck -> ./true
dangling: /var/cache/zypp/raw/google-chrome/.repo_gpgcheck -> ./true
dangling: /var/cache/zypp/raw/repo-update/.repo_gpgcheck -> ./true
dangling: /var/cache/zypp/raw/repo-oss/.repo_gpgcheck -> ./true
dangling: /var/cache/zypp/raw/http-download.opensuse.org-e13e5001/.repo_gpgcheck -> ./true
dangling: /var/cache/zypp/raw/repo-update-non-oss/.repo_gpgcheck -> ./true
dangling: /var/cache/zypp/raw/repo-non-oss/.repo_gpgcheck -> ./true
dangling: /var/cache/zypp/raw/packman-essentials/.repo_gpgcheck -> ./true
dangling: /var/cache/zypp/raw/utilities/.repo_gpgcheck -> ./true
dangling: /var/cache/zypp/raw/teams/.repo_gpgcheck -> ./false

De optie -r zorgt dat ook alle submappen doorzocht worden. Daarna halen we de resultaten door een een grep filter (| grep dangling) waardoor alleen niet werkende koppelingen worden weergegeven.

De symlink opdracht kan eventueel opgespoorde niet werkende symlinks automatisch verwijderen, omzetten naar relatieve koppelingen, koppelingen inkorten, enz. Maar wees daar toch voorzichtige mee, m.a.w. zorg voor dat je zulke met mogelijks zware gevolgen opdrachten uitvoert, voor een degelijke reservekopie.

dany@pindabook:~> symlinks --help
symlinks: scan/change symbolic links - v1.4 - by Mark Lord

Usage:  symlinks [-cdorstv] dirlist

Flags:  -c == change absolute/messy links to relative
        -d == delete dangling links
        -o == warn about links across file systems
        -r == recurse into subdirs
        -s == shorten lengthy links (displayed in output only when -c not specified)
        -t == show what would be done by -c
        -v == verbose (show all symlinks)

De symlinks opdracht volledig van de computer verwijderen

Het softwarepakket symlinks met al de niet door andere pakketten gebruikte afhankelijke pakketten (-u optie) kan je verwijderen met:

dany@pindabook:~> sudo zypper remove -u symlinks
[sudo] wachtwoord voor root: 
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

Het volgende pakket zal worden VERWIJDERD:
  symlinks

1 te verwijderen pakket.
Na de bewerking zal 16,4 KiB worden vrijgemaakt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
(1/1) Verwijderen van symlinks-1.4-lp152.1.1.x86_64 .........................................................................[gereed]

Om de toegevoegde softwarebron en bijhorende GPG-sleutel te verwijderen, moet je eerst de bij de softwarebron horende sleutel opsporen. Een lijst met GPG-sleutels die door het softwarebeheer gebruikt worden, vraag je op met de opdracht:

dany@pindabook:~> rpm -q gpg-pubkey --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{SUMMARY}\n'
gpg-pubkey-307e3d54-5aaa90a5    gpg(SuSE Package Signing Key )
gpg-pubkey-39db7c82-5847eb1f    gpg(SuSE Package Signing Key )
gpg-pubkey-3dbdc284-53674dd4    gpg(openSUSE Project Signing Key )
gpg-pubkey-1abd1afb-54176598    gpg(PackMan Project (signing key) )
gpg-pubkey-9056621d-5d2f1a0e    gpg(utilities OBS Project )

De GPG-sleutel voor de utilities softwarebron staat in het voorbeeld als laatste en heeft als referentie gpg-pubkey-9056621d-5d2f1a0e. Deze referentie heb je nodig om de GPG-sleutel te verwijderen met:

dany@pindabook:~> sudo rpm -e gpg-pubkey-9056621d-5d2f1a0e

Door het verwijderen van de GPG-sleutel vertrouw je de softwarebron niet langer. De softwarebron utilities zelf, verwijder je met de opdracht:

dany@pindabook:~> sudo zypper removerepo utilities
Opslagruimte 'utilities' wordt verwijderd ...................................................................................[gereed]
Opslagruimte 'utilities' is verwijderd.

Zo is alles netjes opgeruimd.