ฉันจะแปลงไฟล์กำหนดค่ากลับไปเป็นเวอร์ชันที่ติดตั้งไว้หลังจากที่ฉันแก้ไขได้อย่างไร


24

ฉันต้องการเปลี่ยนไฟล์/etc/กลับเป็นรูปแบบดั้งเดิมที่ติดตั้งไว้ ฉันแก้ไขไฟล์ตั้งแต่ติดตั้งแล้ว ฉันจะแปลงไฟล์ปรับแต่งนี้กลับคืนได้อย่างไร? Apt ฉลาดพอที่จะไม่เขียนทับไฟล์กำหนดค่าที่แก้ไขดังนั้นฉันจะบอกได้อย่างไรว่าฉันต้องการให้ทำเช่นนั้น

เพื่อประโยชน์ในการโต้แย้งของสมมุติว่าผมต้องการที่จะย้อนกลับไปไฟล์จากแพคเกจ/etc/foo.conffoo


2
สำหรับผู้ที่แนะนำกวาดล้างและการติดตั้งfooสิ่งที่ถ้าbarขึ้นอยู่กับfooและฉันไม่ต้องการที่จะลบbar?
Ryan C. Thompson

คำตอบ:


15

คำตอบที่ Ryan Thomson จัดหาให้นั้นถูกต้อง ถึงกระนั้นมันก็ไม่สามารถทำงานได้ (รายละเอียดมีเหตุผลด้านล่าง)

ที่ถูกต้อง (และที่ง่ายที่สุด) วิธีการทำเช่นนั้นจะใช้-oกับ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ทำงานร่วมกับ conffiles ที่ขาดหายไป มันจะล้มเหลวเช่นกันเมื่อเวอร์ชันไม่เปลี่ยนแปลง การอ้างถึงหน้าคน

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-confaskทำให้aptถามคำถามเสมอมิฉะนั้นคุณจะใช้ตัวเลือกอื่นถ้าคุณรู้คำตอบแล้ว
อันวาร์

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เป็นของ root และโหมด 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คุณไม่จำเป็นต้องทำสิ่งใดเพื่อจัดการตัวนับ คุณจะต้องโต้ตอบกับมันเมื่อคุณต้องการทำการควบคุมเวอร์ชันเช่นอ้างอิงไฟล์ที่เก่ากว่า ไฟล์จะถูกกำหนดโดยอัตโนมัติก่อนและหลังการเรียกใช้ apt และทุกคืน (นี่คือการกำหนดค่า)

โดยค่าเริ่มต้นบน Ubuntu, etckeeper ใช้ท์บาซาร์ เปลี่ยนการตั้งค่า/etc/etckeeper/etckeeper.confก่อนที่จะทำงานetckeeper initหากคุณต้องการ Darcs, Git หรือ Mercury

ด้วย 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

ที่สองรู้สึกโหดเหี้ยมมากขึ้น มันอาจล้างการกำหนดค่าอื่น ๆ เช่นกันหากใช้มากกว่าหนึ่งไฟล์ สิ่งแรกคือการคลิกและความพยายามมากขึ้น แต่ดูเหมือนปลอดภัยกว่ามาก

สำหรับวินาทีคุณอาจจะสามารถลบไฟล์และ - ติดตั้งใหม่อาจแทนที่มัน ถ้าเป็นเช่นนั้นจะปลอดภัยกว่า


2
ไม่การลบไฟล์การกำหนดค่านั้นถือว่าเป็นการดัดแปลงที่ถูกต้องและจะถูกสงวนไว้โดย apt
Ryan C. Thompson

เป็นไปได้หรือไม่ที่จะลบและติดตั้งแพ็กเกจใหม่หากแพ็คเกจอื่น ๆ ที่ติดตั้งนั้นขึ้นอยู่กับมัน?
Ryan C. Thompson

@ RyanThompson ใช่apt-get --reinstall purge packageจะไม่ทำร้ายผู้ติดตาม
Oli

น่าเสียดายที่มันไม่ทำงาน
อันวาร์

1

ทั้งนี้ขึ้นอยู่กับแพคเกจที่คุณอาจพบไฟล์ config /usr/share/doc/foo/examplesค่าเริ่มต้นใน


0

ใช้ Synaptic (การปรับแต่ง Ubuntu สะดวกยิ่งขึ้น แต่ synaptic ตรงไปข้างหน้ามากขึ้น) และเลือก "สมบูรณ์ลบแพคเกจ" จะเป็นการลบไฟล์ปรับแต่งทั้งหมด (คุณอาจต้องการสำรองไฟล์เหล่านี้!)

จากนั้นติดตั้งใหม่ คุณทำเสร็จแล้ว

ด้วย Ubuntu Tweak คุณจะได้รับตัวเลือกมากขึ้นสำหรับการล้างข้อมูลการทำซ้ำและการสำรองข้อมูลการกำหนดค่า บางทีคุณอาจต้องการให้มันดู มันอยู่ในศูนย์ซอฟต์แวร์

ป.ล. : Synaptic ยังใช้ตัวเลือก "กำจัด" (เช่นที่กล่าวถึงโดย Oli ข้างต้น ... ) - เพียงแค่มี GUI สำหรับการจัดการที่สะดวกสบายยิ่งขึ้น


แพคเกจใดจะลบไฟล์ในโฮมไดเร็กตอรี่ของคุณเมื่อคุณลบออก? ฉันคิดว่านี่เป็นข้อผิดพลาดร้ายแรง!
Gilles 'หยุดชั่วร้าย'

@Gilles: ถูกต้อง การตั้งค่าส่วนบุคคลในไดเรกทอรีบ้านของคุณจะไม่ถูกกำจัด ฉันแก้ไขและแก้ไขข้างต้น sry
piedro

การกวาดล้างแพ็กเกจอาจไม่ใช่ตัวเลือกหากคนอื่นใช้มัน
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จะติดตั้งไฟล์ปรับแต่งใหม่ก็ต่อเมื่อมีการเปลี่ยนเวอร์ชั่นและการกำหนดค่าหายไป ตามที่อธิบายไว้ใน man pageconfmiss: 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.