구성 파일을 편집 한 후 구성 파일을 원래 설치된 버전으로 되돌리려면 어떻게해야합니까?


24

파일을 /etc/원래 설치된 양식 으로 되돌리려 고합니다 . 파일이 설치된 후 편집했습니다. 이 구성 파일을 어떻게 되돌릴 수 있습니까? Apt는 편집 된 구성 파일을 덮어 쓰지 않을 정도로 똑똑하기 때문에 원하는 파일인지 어떻게 알 수 있습니까?

인수를 위해 /etc/foo.conf패키지 에서 파일을 되돌리고 싶다고 가정 해 봅시다 foo.


2
제거 및 재설치를 제안하는 모든 사람들에게 foo어떤 경우에 bar따라 foo제거하고 싶지 bar않습니까?
라이언 C. 톰슨

답변:


15

Ryan Thomson이 제공 한 답변 은 올바른 방향으로 향하고있었습니다. 여전히 작업을 수행 할 수 없습니다 (자세한 이유는 아래에 나와 있습니다).

올바른 (그리고 가장 쉬운) 방법은 -owith apt를 사용하여 dpkg 옵션을 전달 dpkg하고 수정 된 구성 파일을 유지할 것인지 또는 원래 구성 파일을 유지할 것인지를 강제 로 묻는 것입니다. 명령은 다음과 같습니다-

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

이것은 당신에게 같은 질문을 할 것입니다

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] ? 

패키지 관리자의 원래 구성 파일을 설치하려면 Y 또는 I 을 눌러야 합니다. D를 눌러 변경 내용을 보거나 Z 옵션으로 루트 셸을 시작하여 자신을 해결할 수도 있습니다.

참고 : 교체 후 수정 된 파일은 다음과 같습니다.at /etc/foo/foo.conf.dpkg-old


다른 옵션이 작동하지 않는 이유는 무엇입니까?

dpkg의 다른 옵션이 제대로 작동하지 않기 때문입니다. 패키지의 설정 파일을 다루는 옵션은 다음과 같습니다.

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

--force-confmiss패키지 버전이 변경되지 않으면 작동하지 않습니다. 맨 페이지에서

conffile이 수정되었고 패키지의 버전이 변경된 경우 --force-confdef 도 지정 하지 않은 경우 프롬프트없이 새 버전을 설치하십시오 .이 경우 기본 조치가 선호됩니다.

--force-confmiss누락 된 conffile과 함께 작동합니다. 버전이 변경되지 않은 경우에도 실패합니다. 인용 맨 페이지

confmiss : conffile이없고 패키지의 버전이 변경된 경우, 프롬프트없이 항상 누락 된 conffile을 설치하십시오. 파일에 대한 변경 (제거)을 유지하지 않음을 의미하므로 위험합니다.

--force-confold버전이 변경된 경우에만 수정 된 버전을 유지 합니다. 동일한 패키지의 경우에도 실패합니다. 인용 맨 페이지

confold : conffile이 수정되었고 패키지의 버전이 변경된 경우 --force-confdef 도 지정 하지 않은 한 프롬프트없이 항상 이전 버전을 유지하십시오 .이 경우 기본 조치가 선호됩니다.

--force-confdef기본 작업은 이전 파일을 유지하는 것이므로 실패합니다 (로 표시된 메시지에 표시됩니다 --force-confask.이 줄 (Y/I/N/O/D/Z) [default=N]은 유지가 기본값임을 의미합니다. 위 참조). 그리고 --force-confnew가 지정되었지만 버전이 변경되지 않으면 작동하지 않습니다. 인용 맨 페이지

confdef : conffile이 수정되었고 패키지의 버전이 변경된 경우, 프롬프트없이 항상 기본 조치를 선택하십시오. 기본 작업이 없으면 --force-confnew 또는 --force-confold 도 지정 하지 않으면 사용자에게 물어 보지 않습니다 .이 경우 최종 작업을 결정하는 데 사용됩니다.

--force-confask버전이 동일 할 때 명시 적으로 당신에게 질문도 물어 때문에, 작동합니다. 인용 맨 페이지

confask : conffile이 수정 된 경우 패키지의 버전이 변경되지 않았더라도 (dpkg 1.15.8 이후) 항상 패키지의 버전으로 바꾸도록 제안하십시오. 어떤 경우 --force-confmiss , --force-confnew , --force-confold , 또는 --force-confdef이 또한 제공됩니다, 최종 조치를 결정하는 데 사용됩니다.

도움이 되길 바랍니다.


귀하의 답변은 매우 포괄적이었습니다. 감사합니다. "y"로 자동으로 질문에 대답 할 수 --force-confnew있습니까? 나는 시도 apt-get […] -y했지만 작동하지 않았다. (가능하지 않다면, 답변을 편집하십시오.)
Tim Landscheidt

@TimLandscheidt 묻지 --force-confnew않고 사용할 수 있는지 묻고 있습니까? 이것이 기본 사례라고 생각합니다. 즉, 변경 사항이 유지됩니다. --force-confaskapt항상 당신이 이미 답을 알고, 그렇지 않으면, 당신은 다른 옵션을 사용하십시오, 질문을.
Anwar

1
하, 나는 -o Dpkg::Options::=--force-confnew(당신의 대답이 예측 한대로) 성공적으로 시도 하지 않았으며 시도했을 때 오류 메시지를 읽지 않았습니다 -o Dpkg::Options::="--force-confask --force-confnew". 그러나 apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $package의 변경 구성 파일을 올바르게 덮어 썼습니다 $package. 감사!
Tim Landscheidt

12

피해가 이미 발생한 경우 공식 버전의 구성 파일을 다시 가져 오는 명령 줄 방법이 있습니다. 먼저 패키지 파일 ( apt-get --download-only아래와 같이 또는 packages.ubuntu.com 의 패키지 페이지에서 )을 다운로드 한 다음 임시 위치에 내용을 추출하십시오. 그런 다음 파일을에 복사 할 수 있습니다 /etc. 원래 권한 (대부분의 파일은 /etc루트 및 모드 644 (예 : 단어 읽기 가능 및 루트 쓰기 가능)이 소유하지만 각 예외는 중요한 이유가 있습니다) 을 존중해야합니다 .

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

이는 패키지가 아닌 구성 파일 (예 : /etc/fstab또는) 에는 적용되지 않습니다 /etc/passwd. 당신이 이것들을 잃으면, 당신은 스스로입니다. (대부분 시스템에 매우 의존적입니다.)


앞으로는 etckeeper 사용하는 것이 좋습니다 etckeeper를 설치하십시오. 패키지를 설치하고 실행하십시오 sudo etckeeper init. 의 모든 파일에 대한 버전 제어가 설정됩니다 /etc. etckeeper를 관리하기 위해 다른 작업을 수행 할 필요가 없습니다. 이전 파일 참조와 같은 버전 제어 작업을 수행하려는 경우에만 상호 작용하면됩니다. 파일은 apt를 실행하기 전과 밤마다 자동으로 커밋됩니다 (이 구성 가능).

기본적으로 Ubuntu에서 etckeeper는 Bazaar를 사용합니다 . Darcs, Git 또는 Mercury를 선호 /etc/etckeeper/etckeeper.conf하는 etckeeper init경우 실행하기 전에 설정을 변경하십시오 .

Bazaar /etc/foo.conf를 사용하면 마지막 커밋 된 버전 으로 되돌릴 수 있습니다.

cd /etc
sudo bzr revert foo.conf

시간을 거슬러 되돌아 가려면 sudo bzr log foo.conf파일 기록 을보고을 사용하여 되돌리려는 버전 sudo bzr revert -r 42 foo.conf인지 확인한 revno: 42후을 사용하십시오.


7

packages.ubuntu.com 에서 수동으로 패키지를 다운로드하고 파일을 추출하여 버전을 바꿀 수 있습니다.

또는 당신은 할 수 있습니다 :

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

두 번째는 훨씬 더 잔인한 느낌입니다. 둘 이상의 파일을 사용하는 경우 다른 구성도 지울 수 있습니다. 첫 번째는 더 많은 클릭과 노력이지만 훨씬 안전합니다.

두 번째로 파일을 삭제하고 --reinstall이이를 대체 할 수 있습니다. 그렇다면 더 안전 할 것입니다.


2
아니요, 구성 파일을 삭제하는 것은 올바른 수정으로 간주되며 apt에 의해 보존됩니다.
Ryan C. Thompson

설치된 다른 패키지가 종속 된 경우 패키지를 제거하고 다시 설치할 수 있습니까?
Ryan C. Thompson

@RyanThompson 그래, apt-get --reinstall purge package의존 자들을 해치지 않을 거야 .
Oli

불행히도 작동하지 않습니다.
Anwar

1

패키지에 따라에서 기본 구성 파일을 찾을 수 있습니다 /usr/share/doc/foo/examples.


0

시냅틱을 사용하고 (우분투 비틀기는 훨씬 편리하지만 시냅틱은 더 간단합니다) "완전히 패키지 제거"를 선택하십시오. 모든 구성 파일이 삭제됩니다 (이 파일을 백업 할 수도 있습니다).

그런 다음 다시 설치하십시오. 끝났습니다.

Ubuntu Tweak을 사용하면 정리, 재 롤링 및 구성 백업을위한 더 많은 옵션이 제공됩니다. 어쩌면 당신은 그것을보고 싶어. 소프트웨어 센터에 있습니다.

ps : 시냅틱은 "퍼지"옵션 (위의 Oli에서 언급 한 것처럼 ...)을 사용하는데,보다 편안한 조작을 위해 GUI 만 있습니다.


홈 디렉토리에서 파일을 제거하면 어떤 패키지가 제거됩니까? 나는 이것을 중대한 버그라고 생각합니다!
Gilles 'SO- 악 그만

@Gilles : 네 말이 맞아. 제거해도 홈 디렉토리 내의 개인 설정은 변경되지 않습니다. 위의 내용을 편집하고 수정했습니다. sry
piedro 2018

다른 사용자가 의존하는 경우 패키지를 제거하는 것이 옵션이 아닐 수 있습니다.
Ryan C. Thompson

0

나는 마침내 몇 년 전에 막연하게 기억했던 답을 찾았습니다.

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

"confnew"인수는 dpkg가 수정 된 구성 파일을 패키지 제공 파일로 대체하도록하고, "confmiss"는 삭제 된 구성 파일과 마찬가지로 수행합니다.

이 chatlog 에 따르면 다음과 같은 방식으로 apt-get을 통해 이러한 옵션을 사용할 수도 있습니다.

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

deb 파일을 직접 찾을 필요가 없습니다.

분명히 이러한 옵션은 위험하며 잘못 사용하면 중요한 시스템 구성 파일을 날려 버릴 수 있습니다.


문제 --force-confnew는 버전이 변경되면 새 구성 파일 만 설치한다는 것입니다. 동일한 버전을 다시 설치하는 경우 명시 적으로 테스트 한대로 새 구성 파일을 설치하지 않습니다
Anwar

그리고 --force-confmiss버전이 변경 될 경우에만 새로운 설정 파일을 설치하고 설정이 없습니다. 매뉴얼 페이지에 설명 된confmiss: 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.