dpkg thay thế các tập tin trên một hệ thống tập tin FAT


22

Khi bạn nâng cấp hoặc cài đặt lại gói với dpkg(và cuối cùng là bất cứ thứ gì sử dụng nó, như apt-get, v.v.), nó sẽ sao lưu các tệp hiện có bằng cách tạo liên kết cứng tới tệp trước khi thay thế. Theo cách đó, nếu giải nén thất bại, nó có thể dễ dàng đặt lại các tệp hiện có. Điều đó thật tuyệt, vì nó bảo vệ hệ điều hành khỏi những điều xấu xảy ra.

Ngoại trừ ... nó chỉ hoạt động nếu hệ thống tập tin của bạn hỗ trợ các liên kết cứng . Không phải tất cả các hệ thống tập tin đều làm - chẳng hạn như hệ thống tập tin FAT.

Tôi đang làm việc trên một bản phân phối Debian cho một nền tảng ARM nhúng cụ thể và môi trường khởi động yêu cầu một số tệp nhất định (bao gồm kernel) nằm trên hệ thống tệp FAT để mã khởi động có thể định vị và tải chúng.

Khi bạn nâng cấp gói kernel (hoặc bất kỳ gói nào khác có tệp trong phân vùng FAT đó), cài đặt không thành công với:

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

Và toàn bộ nâng cấp thất bại.

Tôi đã lướt web và các tài liệu tham khảo duy nhất tôi có thể tìm thấy là những người cụ thể có vấn đề cụ thể khi thực hiện nâng cấp cụ thể, câu trả lời thường là "Xóa /boot/vmlinuz-3.18.11+ và thử lại", và vâng, đó là khắc phục vấn đề cụ thể đó.

Nhưng đó không phải là câu trả lời cho tôi. Tôi là nhà phân phối HĐH, không phải người dùng HĐH, vì vậy tôi cần một cách để khắc phục điều này không liên quan đến việc người dùng cuối xóa thủ công các tệp kernel của họ trước khi thực hiện nâng cấp. Tôi cần một cách để bảo dpkg "sao chép, không liên kết cứng" cho các tệp trên / boot (hoặc tất cả các tệp cho tất cả những gì tôi quan tâm, mặc dù điều đó sẽ làm chậm hoạt động nâng cấp phần nào) hoặc tốt hơn là "Nếu một liên kết cứng bị lỗi," đừng phàn nàn, thay vào đó hãy sao chép nó ".

Tôi đã thử những thứ như cờ --force-unsafe-iovà thậm chí , nhưng không có tác dụng gì.--force-alldpkg


Âm thanh như thời gian cho một lỗi danh sách mong muốn. :-)
Faheem Mitha

Câu trả lời:


13

Hành vi mà bạn đang nhìn thấy được thực hiện trong archives.ctrong dpkgnguồn, dòng 1030 (đối với phiên bản 1.18.1):

debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf))
  ohshite(_("unable to make backup link of '%.255s' before installing new version"),
          ti->name);

Dường như với tôi rằng bạn có thể xử lý lỗi liên kết bằng cách quay lại hành vi đổi tên được sử dụng các dòng 1003 và sau đây; một cái gì đó như (điều này chưa được kiểm tra):

debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf)) {
  debug(dbg_eachfiledetail,"link failed, nonatomic");
  nifd->namenode->flags |= fnnf_no_atomic_overwrite;
  if (rename(fnamevb.buf,fnametmpvb.buf))
    ohshite(_("unable to move aside '%.255s' to install new version"),
            ti->name);
}

Tôi không phải là dpkgchuyên gia mặc dù ... (Và không có tùy chọn nào có sẵn dpkgđể cung cấp hành vi này.)


Chắc chắn đóng gói phiên bản dpkg của riêng tôi là một khả năng, mặc dù tôi không muốn có chi phí theo dõi các thay đổi ngược dòng trong phiên bản của mình.
Majenko

Ok, tôi có thể xác nhận rằng điều này hoạt động tốt, vì vậy nó chắc chắn là một lựa chọn. Một tùy chọn khác có thể xảy ra với tôi có thể là di chuyển thủ công các tệp vi phạm trong preinsttập lệnh của gói , nhưng vì kernel được tạo bởi các tập lệnh đóng gói kernel tiêu chuẩn nên tôi không chắc tôi sẽ sửa đổi điều đó như thế nào. Ngoài ra, sẽ không có một cơ sở rollback tự động.
Majenko

1
Thật vậy, điều đó sẽ làm việc; bạn cũng có thể điều tra dpkghook ( dpkg --pre-invoke=).
Stephen Kitt

+1 Làm thế nào bạn không phải là một dpkgchuyên gia khi bạn biết điều này!
nikhil

1
kernel raspberrypi cũng được cập nhật thông qua một thủ thuật tương tự, sử dụng dpkg-redirect. Lấy từ raspberrypi.stackexchange.com/questions/51410/... ,
akarapatis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.