Wenn Sie ein Paket mit aktualisieren oder neu installieren dpkg
(und letztendlich mit allem, was es verwendet, wie z. B. apt-get usw.), werden die vorhandenen Dateien gesichert, indem vor dem Ersetzen ein fester Link zu der Datei erstellt wird. Wenn das Entpacken fehlschlägt, können die vorhandenen Dateien problemlos wiederhergestellt werden. Das ist großartig, da es das Betriebssystem vor schlechten Dingen schützt.
Außer ... es funktioniert nur, wenn Ihr Dateisystem feste Links unterstützt . Nicht alle Dateisysteme - wie z. B. FAT-Dateisysteme.
Ich arbeite an einer Debian-Distribution für eine bestimmte eingebettete ARM-Plattform, und die Boot-Umgebung erfordert, dass sich bestimmte Dateien (einschließlich des Kernels) auf einem FAT-Dateisystem befinden, damit der Boot-Code sie finden und laden kann.
Wenn Sie das Kernel-Paket (oder ein anderes Paket, das Dateien in dieser FAT-Partition enthält) aktualisieren, schlägt die Installation fehl mit:
dpkg: error processing archive linux-image3.18.11+_3.18.11.2.armadillian_armhf.deb (--install):
unable to make backup link of `./boot/vmlinuz-3.18.11+' before installing new version: Operation not permitted
Und das ganze Upgrade schlägt fehl.
Ich habe das Web durchsucht und die einzigen Referenzen, die ich finden kann, sind bestimmte Personen mit bestimmten Problemen bei bestimmten Upgrades. Die Antwort lautet normalerweise "Delete /boot/vmlinuz-3.18.11+ and try again" und ja, das behebt dieses spezifische Problem.
Aber das ist nicht die Antwort für mich. Ich bin ein OS-Distributor und kein OS-Benutzer. Daher benötige ich eine Möglichkeit, dies zu beheben, bei der der Endbenutzer seine Kerneldateien nicht manuell löscht, bevor er ein Upgrade durchführt. Ich brauche eine Möglichkeit, dpkg anzuweisen, Dateien unter / boot "zu kopieren, nicht fest zu verknüpfen" (oder alle Dateien, obwohl dies den Aktualisierungsvorgang etwas verlangsamen würde), oder noch besser "Wenn ein fester Link fehlschlägt, beschwere dich nicht, kopiere es stattdessen ".
Ich habe solche Dinge wie die --force-unsafe-io
und sogar --force-all
Flaggen ausprobiert dpkg
, aber nichts hat irgendeinen Effekt.
Antworten:
Das Verhalten, das Sie sehen, ist
archives.c
in derdpkg
Quelle, Zeile 1030 (für Version 1.18.1) implementiert:Es scheint mir, dass Sie den Verbindungsfehler behandeln könnten, indem Sie auf das Umbenennungsverhalten zurückgreifen, das in den Zeilen 1003 und den folgenden verwendet wird. so etwas wie (das ist ungetestet):
Ich bin allerdings kein
dpkg
Experte ... (Und es gibt noch keine Optiondpkg
, um dieses Verhalten bereitzustellen.)quelle
preinst
Skript des Pakets. Da der Kernel jedoch aus den Standard-Kernel-Paketskripten besteht, bin ich mir nicht sicher, wie ich das ändern würde. Es würde auch keine automatische Rollback-Funktion geben.dpkg
Hooks (dpkg --pre-invoke=
) untersuchen.dpkg
Experte, wenn du das weißt?