Debian, apt i błąd Seccomp prevented execution of syscall 0000000089 on architecture amd64

Podczas aktualizacji systemu Debian zobaczyłem następujący komunikat:

root@dom:/home/mirek# apt-get update
...
Pobieranie:15 http://ftp.pl.debian.org/debian buster/non-free Sources 2018-01-13-0228.07.pdiff [386 B]                           
93% [15 Sources rred 0 B] [19 Sources 33,2 kB/34,5 kB 96%]                                                           46,8 kB/s 0s
 **** Seccomp prevented execution of syscall 0000000089 on architecture amd64 ****
Czytanie list pakietów... Gotowe                                                                                                 
E: Method rred has died unexpectedly!
E: Podproces rred zwrócił kod błędu (31)

i proces aktualizacji został zatrzymany.

Powodem tego błędu jest umieszczenie programu apt w piaskownicy.

Opiszę tutaj dwa rozwiązania. Pierwsze z nich to wyłączenie apt z piaskownicy. Aby to zrobić tworzymy dodatkowy plik w katalogu /etc/apt/aptitude.conf.d

touch /etc/apt/aptitude.conf.d/999seccomp

w którym wpisujemy następujące polecenie

apt::seccomp::enable "false";

Drugi sposób do dodanie wymaganych przez apt funkcji do wyjątków.

Zaczynamy od analizy komunikatu o błedzie:

 **** Seccomp prevented execution of syscall 0000000089 on architecture amd64 ****

Widzimy tutaj błąd w wywołaniu funkcji systemowej 89. Aby znaleźć jaka funkcja odpowiada danej wartości należy posłużyć się programem scmp_sys_resolver z pakietu seccomp.

Wpisujemy polecenie:

scmp_sys_resolver 89

i otrzymujemy nazwę funkcji systemowej o podanym kodzie.  W moim przypadku jest to funkcja readlink.

Mając nazwę funkcji dodajemy ją do wyjątków.

Tworzymy plik 999seccomp (nazwa jest dowolna) w katalogu /etc/apt/apt.conf.d

Następnie do tego pliku dodajemy następujący kod:

apt::sandbox::seccomp::allow { "readlink" };

Po dodaniu powyższej konfiguracji i wydaniu polecenia apt-get update możemy otrzymać kolejny błąd z innym numerem wywołania systemowego. Powtarzamy operację, tj. szukamy nazwę funkcji systemowej o podanym kodzie i dodajemy ją do wyjątków w konfiguracji apt. W moim przypadku skończyło się na dodaniu wyjątków do dwóch funkcji:  readlink oraz shmget.

Po wykonaniu tych czynności apt-get update wykonuje się poprawnie.