답변:
Ryan Thomson이 제공 한 답변 은 올바른 방향으로 향하고있었습니다. 여전히 작업을 수행 할 수 없습니다 (자세한 이유는 아래에 나와 있습니다).
올바른 (그리고 가장 쉬운) 방법은 -o
with 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이 또한 제공됩니다, 최종 조치를 결정하는 데 사용됩니다.
도움이 되길 바랍니다.
--force-confnew
있습니까? 나는 시도 apt-get […] -y
했지만 작동하지 않았다. (가능하지 않다면, 답변을 편집하십시오.)
--force-confnew
않고 사용할 수 있는지 묻고 있습니까? 이것이 기본 사례라고 생각합니다. 즉, 변경 사항이 유지됩니다. --force-confask
수 apt
항상 당신이 이미 답을 알고, 그렇지 않으면, 당신은 다른 옵션을 사용하십시오, 질문을.
-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
. 감사!
피해가 이미 발생한 경우 공식 버전의 구성 파일을 다시 가져 오는 명령 줄 방법이 있습니다. 먼저 패키지 파일 ( 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 사용하는 것이 좋습니다 . 패키지를 설치하고 실행하십시오 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
후을 사용하십시오.
packages.ubuntu.com 에서 수동으로 패키지를 다운로드하고 파일을 추출하여 버전을 바꿀 수 있습니다.
또는 당신은 할 수 있습니다 :
sudo rm /etc/foo.conf # just for good measure
sudo apt-get --purge --reinstall install foo
두 번째는 훨씬 더 잔인한 느낌입니다. 둘 이상의 파일을 사용하는 경우 다른 구성도 지울 수 있습니다. 첫 번째는 더 많은 클릭과 노력이지만 훨씬 안전합니다.
두 번째로 파일을 삭제하고 --reinstall이이를 대체 할 수 있습니다. 그렇다면 더 안전 할 것입니다.
apt-get --reinstall purge package
의존 자들을 해치지 않을 거야 .
시냅틱을 사용하고 (우분투 비틀기는 훨씬 편리하지만 시냅틱은 더 간단합니다) "완전히 패키지 제거"를 선택하십시오. 모든 구성 파일이 삭제됩니다 (이 파일을 백업 할 수도 있습니다).
그런 다음 다시 설치하십시오. 끝났습니다.
Ubuntu Tweak을 사용하면 정리, 재 롤링 및 구성 백업을위한 더 많은 옵션이 제공됩니다. 어쩌면 당신은 그것을보고 싶어. 소프트웨어 센터에 있습니다.
ps : 시냅틱은 "퍼지"옵션 (위의 Oli에서 언급 한 것처럼 ...)을 사용하는데,보다 편안한 조작을 위해 GUI 만 있습니다.
나는 마침내 몇 년 전에 막연하게 기억했던 답을 찾았습니다.
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
는 버전이 변경되면 새 구성 파일 만 설치한다는 것입니다. 동일한 버전을 다시 설치하는 경우 명시 적으로 테스트 한대로 새 구성 파일을 설치하지 않습니다
--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.
foo
어떤 경우에bar
따라foo
제거하고 싶지bar
않습니까?