Làm cách nào tôi có thể hoàn nguyên tệp cấu hình trở lại phiên bản đã cài đặt ban đầu sau khi tôi đã chỉnh sửa tệp?


24

Tôi muốn hoàn nguyên một tập tin /etc/trở lại hình thức cài đặt ban đầu của nó. Tôi đã chỉnh sửa các tập tin kể từ khi nó được cài đặt. Làm thế nào tôi có thể hoàn nguyên tập tin cấu hình này? Apt đủ thông minh để không ghi đè lên các tệp cấu hình đã chỉnh sửa, vậy làm thế nào để tôi nói với nó rằng tôi muốn nó làm như vậy?

Vì lý do, hãy nói rằng tôi muốn hoàn nguyên tệp /etc/foo.conftừ gói foo.


2
Đối với tất cả những người đề xuất thanh trừng và cài đặt lại foo, điều gì xảy ra nếu barphụ thuộc vào foovà tôi không muốn xóa bar?
Ryan C. Thompson

Câu trả lời:


15

Câu trả lời được cung cấp bởi Ryan Thomson đang đi đúng hướng. Tuy nhiên, nó sẽ không thể thực hiện công việc (Lý do chi tiết được đưa ra dưới đây).

Cách chính xác (và dễ nhất) là sử dụng -ovới aptđể vượt qua tùy chọn dpkg và buộc bạn dpkgphải hỏi liệu bạn có muốn giữ lại các tệp cấu hình đã sửa đổi hoặc các tệp gốc. Lệnh sẽ như thế này -

sudo apt-get --reinstall -o Dpkg::Options::="--force-confask" install foo

Điều này sẽ hỏi bạn một câu hỏi như

Configuration file '/etc/foo/foo.conf'
 ==> Modified (by you or by a script) since installation.
     Version in package is the same as at last installation.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** foo.conf (Y/I/N/O/D/Z) [default=N] ? 

Bạn phải nhấn Y hoặc I để cài đặt tệp cấu hình gốc của người bảo trì gói. Bạn thậm chí có thể nhấn D để xem những thay đổi hoặc bắt đầu một vỏ gốc với tùy chọn Z để tự khắc phục.

Lưu ý: Sau khi thay thế, bạn sẽ tìm thấy tệp đã sửa đổi của mình dưới dạngat /etc/foo/foo.conf.dpkg-old


Tại sao các tùy chọn khác sẽ không hoạt động?

Bởi vì các tùy chọn khác trong dpkg không hoạt động tốt. Các tùy chọn liên quan đến các tệp cấu hình của gói là

  • --force-confmiss
  • --force-confnew
  • --force-confold
  • --force-confdef

--force-confmisssẽ không hoạt động khi phiên bản gói không thay đổi. Từ trang nam

Nếu một conffile đã được sửa đổi và phiên bản trong gói đã thay đổi, hãy luôn cài đặt phiên bản mới mà không cần nhắc, trừ khi --force-confdef cũng được chỉ định, trong trường hợp đó, hành động mặc định được ưu tiên.

--force-confmisslàm việc với các conffiles mất tích. Nó cũng sẽ thất bại khi phiên bản không thay đổi. Trích dẫn man-page

confmiss: Nếu một conffile bị thiếu và phiên bản trong gói đã thay đổi, hãy luôn cài đặt conffile bị thiếu mà không cần nhắc. Điều này rất nguy hiểm, vì điều đó có nghĩa là không bảo toàn thay đổi (xóa) đối với tệp

--force-confoldsẽ chỉ giữ lại phiên bản sửa đổi nếu phiên bản được thay đổi . Đối với cùng một gói, nó cũng sẽ thất bại. Trích dẫn man-page

confold: Nếu một conffile đã được sửa đổi và phiên bản trong gói đã thay đổi, hãy luôn giữ phiên bản cũ mà không nhắc, trừ khi --force-confdef cũng được chỉ định, trong trường hợp đó, hành động mặc định được ưu tiên.

--force-confdefcũng sẽ thất bại vì hành động mặc định là giữ lại tệp cũ hơn (Được chỉ ra từ thông báo hiển thị với --force-confask. Nó có dòng (Y/I/N/O/D/Z) [default=N]có nghĩa là giữ lại là mặc định. Xem ở trên). Và nếu --force-confnewđược chỉ định nhưng phiên bản không thay đổi, điều đó cũng sẽ không hoạt động. Trích dẫn man-page

confdef: Nếu một conffile đã được sửa đổi và phiên bản trong gói đã thay đổi, luôn chọn hành động mặc định mà không cần nhắc. Nếu không có hành động mặc định, nó sẽ dừng lại để hỏi người dùng trừ khi - Force-confnew hoặc --force-confold cũng được đưa ra, trong trường hợp đó, nó sẽ sử dụng điều đó để quyết định hành động cuối cùng.

Chỉ --force-confaskhoạt động, bởi vì nó sẽ hỏi bạn câu hỏi ngay cả khi phiên bản giống nhau. Trích dẫn man-page

confask: Nếu một conffile đã được sửa đổi, luôn luôn cung cấp để thay thế nó bằng phiên bản trong gói, ngay cả khi phiên bản trong gói không thay đổi (kể từ dpkg 1.15.8). Nếu bất kỳ - Force-confmiss , --force-confnew , --force-confold , hoặc --force-confdef cũng được đưa ra, nó sẽ được sử dụng để quyết định hành động cuối cùng.

Hy vọng rằng sẽ giúp.


Câu trả lời của bạn rất toàn diện, cảm ơn. Có phải cũng có thể tự động trả lời câu hỏi bằng "y", tức là có hiệu quả --force-confnewkhông? Tôi đã thử apt-get […] -y, nhưng nó không hoạt động. (Nếu không thể, vui lòng chỉnh sửa câu trả lời để nói như vậy.)
Tim Landscheidt

@TimLandscheidt bạn đang hỏi liệu có thể sử dụng --force-confnewmà không cần hỏi không? Tôi nghĩ đó là trường hợp mặc định, có nghĩa là nó sẽ giữ lại những thay đổi của bạn. --force-confasklàm cho aptluôn luôn đặt câu hỏi, nếu không, bạn sẽ sử dụng các tùy chọn khác nếu bạn đã biết câu trả lời.
Anwar

1
Ha, tôi đã thử -o Dpkg::Options::=--force-confnewkhông thành công (như câu trả lời của bạn dự đoán) và không đọc thông báo lỗi khi tôi thử -o Dpkg::Options::="--force-confask --force-confnew". Tuy nhiên, apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $packageghi đè chính xác các tệp cấu hình thay đổi của $package. Cảm ơn!
Tim Landscheidt

12

Nếu tác hại đã được thực hiện, đây là cách dòng lệnh để lấy lại phiên bản chính thức của tệp cấu hình. Đầu tiên, tải xuống tệp gói ( apt-get --download-onlynhư với bên dưới hoặc từ trang gói trên gói.ubfox.com ), sau đó trích xuất nội dung của nó ở một vị trí tạm thời. Sau đó bạn có thể sao chép tệp vào /etc. Đảm bảo tôn trọng các quyền ban đầu (hầu hết các tệp trong /etcđược sở hữu bởi root và chế độ 644 (nghĩa là có thể đọc được từ và ghi được từ gốc), nhưng mỗi ngoại lệ đều có vì một lý do quan trọng).

sudo apt-get --download-only --reinstall install foo
mkdir /tmp/foo
dpkg-deb -x /var/cache/apt/archives/foo_VERSION_ARCH.deb /tmp/foo

Lưu ý rằng điều này không áp dụng cho các tệp cấu hình không phải từ một gói, chẳng hạn như /etc/fstabhoặc /etc/passwd. Nếu bạn mất những thứ này, bạn phải tự lo liệu. (Hầu hết đều phụ thuộc rất nhiều vào hệ thống.)


Đối với tương lai, tôi khuyên bạn nên sử dụng etckeeper Cài đặt v.v. . Cài đặt gói và chạy sudo etckeeper init. Điều này thiết lập kiểm soát phiên bản cho tất cả các tập tin trong /etc. Bạn không cần phải làm gì khác để quản lý người quản lý; bạn chỉ cần tương tác với nó khi bạn muốn thực hiện thao tác kiểm soát phiên bản, chẳng hạn như tham khảo các tệp cũ hơn. Các tệp được tự động cam kết trước và sau mỗi lần chạy apt và mỗi đêm (đây là cấu hình).

Theo mặc định, trên Ubuntu, etckeeper sử dụng Bazaar . Thay đổi cài đặt /etc/etckeeper/etckeeper.conftrước khi chạy etckeeper initnếu bạn thích Darcs, Git hoặc Mercury.

Với Bazaar, để trở lại /etc/foo.confphiên bản cam kết cuối cùng:

cd /etc
sudo bzr revert foo.conf

Nếu bạn muốn quay ngược thời gian hơn nữa, hãy sử dụng sudo bzr log foo.confđể xem lịch sử của tệp và sudo bzr revert -r 42 foo.confnếu bạn đã xác định đó revno: 42là bản sửa đổi mà bạn muốn hoàn nguyên.


7

Bạn có thể tải xuống gói thủ công từ gói.ubfox.com , giải nén tệp và thay thế phiên bản của bạn với nó.

Hoặc bạn có thể:

sudo rm /etc/foo.conf # just for good measure
sudo apt-get --purge --reinstall install foo

Thứ hai cảm thấy tàn bạo hơn rất nhiều. Nó cũng có thể xóa cấu hình khác nếu nó sử dụng nhiều hơn một tệp. Đầu tiên là nhấp chuột nhiều hơn và nỗ lực nhưng có vẻ an toàn hơn nhiều.

Lần thứ hai, bạn có thể chỉ cần xóa tệp và --reinstall có thể thay thế nó. Nếu vậy, điều đó sẽ an toàn hơn.


2
Không, xóa tệp cấu hình được coi là sửa đổi hợp lệ và được bảo toàn bởi apt.
Ryan C. Thompson

Có thể thanh lọc và cài đặt lại một gói nếu các gói được cài đặt khác phụ thuộc vào nó?
Ryan C. Thompson

@RyanThndry Vâng, apt-get --reinstall purge packagesẽ không làm tổn thương người phụ thuộc.
Oli

Thật không may, nó không hoạt động.
Anwar

1

Tùy thuộc vào gói, bạn có thể tìm thấy tệp cấu hình mặc định /usr/share/doc/foo/examples.


0

Sử dụng Synaptic (tinh chỉnh Ubuntu thậm chí còn tiện lợi hơn nhưng synaptic thì đơn giản hơn) và chọn "loại bỏ hoàn toàn gói". Thao tác này sẽ xóa tất cả các tệp cấu hình (bạn có thể muốn sao lưu các tệp này!).

Sau đó cài đặt lại. Bạn đã hoàn tất.

Với Ubuntu Tweak, bạn thậm chí còn có nhiều tùy chọn hơn để dọn dẹp, sao lưu và sao lưu cấu hình. Có lẽ bạn muốn cho nó một cái nhìn. Nó ở trong phần mềm.

ps: Synaptic cũng sử dụng tùy chọn "thanh lọc" (như được đề cập bởi Oli ở trên ...) - chỉ với GUI để xử lý thoải mái hơn.


Gói nào loại bỏ các tập tin trong thư mục nhà của bạn khi bạn loại bỏ nó? Tôi sẽ coi đây là một lỗi nghiêm trọng!
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Bạn nói đúng. Các thiết lập cá nhân trong thư mục nhà của bạn sẽ không bị chạm bởi thanh trừng. Tôi đã chỉnh sửa và sửa chữa những điều trên. sry
piedro

Thanh lọc gói có thể không phải là một lựa chọn nếu người khác phụ thuộc vào nó.
Ryan C. Thompson

0

Cuối cùng tôi đã tìm thấy câu trả lời mà tôi mơ hồ nhớ từ nhiều năm trước:

dpkg --force-confnew --force-confmiss -i PACKAGE.deb

Đối số "confnew" buộc dpkg thay thế các tệp cấu hình đã sửa đổi bằng các tệp được cung cấp gói và "confmiss" cũng tương tự với các tệp cấu hình đã bị xóa.

Theo chatlog này , bạn cũng có thể sử dụng các tùy chọn này thông qua apt-get theo cách sau:

apt-get -o DPkg::Options::="--force-confnew --force-confmiss" --reinstall install PACKAGE

giúp bạn không cần phải tìm tệp deb.

Rõ ràng, các tùy chọn này rất nguy hiểm và có khả năng thổi bay các tệp cấu hình hệ thống quan trọng nếu sử dụng sai.


Vấn đề --force-confnewlà nó sẽ chỉ cài đặt các tập tin cấu hình mới nếu phiên bản thay đổi. Nếu bạn đang cài đặt lại cùng một phiên bản, nó sẽ không cài đặt tệp cấu hình mới vì tôi đã kiểm tra nó một cách rõ ràng
Anwar

--force-confmisssẽ chỉ cài đặt tập tin cấu hình mới nếu phiên bản bị thay đổi và cấu hình bị thiếu. Như được mô tả trong trang người đàn ôngconfmiss: If a conffile is missing and the version in the package did change, always install the missing conffile without prompting. This is dangerous, since it means not preserving a change (removing) made to the file.
Anwar
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.