సిస్టమ్ కాన్ఫిగరేషన్ ఫైల్లో "మూలాన్ని కనుగొనడం"కి సంబంధించి డెబియన్/ఉబుంటులో డీబగ్గింగ్ టెక్నిక్ని చూపించడం ఈ పోస్ట్ యొక్క ఉద్దేశ్యం.
పరీక్ష ఉదాహరణ: ఇన్స్టాల్ చేయబడిన OS యొక్క tar.gz కాపీని చాలా అపహాస్యం చేసిన తర్వాత మరియు దాన్ని పునరుద్ధరించి, అప్డేట్లను ఇన్స్టాల్ చేసిన తర్వాత, మేము సందేశాన్ని అందుకుంటాము:
update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: initramfs-tools configuration sets RESUME=/dev/mapper/U1563304817I0-swap
W: but no matching swap device is available.
I: The initramfs will attempt to resume from /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Set the RESUME variable to override this.
లక్ష్యం: ఈ విలువ (U1563304817I0) ఎక్కడ నుండి వచ్చిందో మరియు దానిని సరిగ్గా ఎలా మార్చాలో అర్థం చేసుకోండి. ఇది అంతటా వచ్చిన మొదటి ఉదాహరణ, దానిలో ప్రత్యేకంగా ఆసక్తికరంగా లేదు, కానీ Linuxతో పనిచేసే ఆచరణాత్మక పద్ధతులను చూపించడానికి అనుకూలమైనది.
దశ సంఖ్య 1: RESUME ఎక్కడ నుండి వచ్చింది?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap
మేము పునరావృతంగా (-r
) /etc డైరెక్టరీలో ఈ వేరియబుల్ ప్రస్తావన కోసం చూడండి (ఎక్కువగా కాన్ఫిగర్లు ఉన్నాయి). మేము conf.d స్నిప్పెట్ని కనుగొంటాము, ఇది initramfs-tools ప్యాకేజీ ద్వారా స్పష్టంగా ఉపయోగించబడింది.
ఈ స్నిప్పెట్ ఎక్కడ నుండి వచ్చింది?
మూడు ఎంపికలు ఉన్నాయి:
- మేజిక్ ఆర్టిఫ్యాక్ట్ (ఎవరో పెట్టి మరిచిపోయారు)
- ప్యాకేజీ నుండి కాన్ఫిగర్ చేయండి
- సిస్టమ్ ప్యాకేజీల నుండి కొంత స్క్రిప్ట్ ద్వారా కాన్ఫిగర్ రూపొందించబడింది
సంఖ్య 2 (సరళమైనదిగా) తనిఖీ చేద్దాం:
dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*
dpkg -S
ఇన్స్టాల్ చేయబడిన ఫైల్ల డేటాబేస్ను శోధించడానికి మరియు ఫైల్ ఏ ప్యాకేజీకి చెందినదో కనుగొనడానికి మమ్మల్ని అనుమతిస్తుంది. విజయవంతమైన శోధనకు ఇక్కడ ఉదాహరణ:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.conf
మన పనికి తిరిగి వెళ్దాం: ఫైల్ initramfs-tools/conf.d/resume
ప్యాకేజీ నుండి సిస్టమ్లో ఇన్స్టాల్ చేయబడలేదు. బహుశా ఇది ప్యాకేజీ యొక్క postinst/preinst స్క్రిప్ట్లో రూపొందించబడిందా? సంస్కరణ సంఖ్య 3ని తనిఖీ చేద్దాం.
# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm: rm -f /etc/initramfs-tools/conf.d/resume
కేటలాగ్లో /var/lib/dpkg/info/
ప్యాకేజీల యొక్క అన్ని "మెటాఫైల్స్" (ఇన్స్టాలేషన్/తొలగింపు స్క్రిప్ట్లు, ప్యాకేజీ వివరణలు మొదలైనవి) యొక్క ప్యాక్ చేయని సంస్కరణలు ఉన్నాయి. ఆశ్చర్యకరంగా, initramfs-tools-core ప్యాకేజీ యొక్క postrm (అన్ఇన్స్టాల్లో) ఈ ఫైల్ తీసివేయబడింది. దాని postinst కంటెంట్లను చూద్దాం... conf.d డైరెక్టరీకి సంబంధించి ఏదీ లేదు.
ప్యాకేజీలో చేర్చబడిన ఫైళ్ళను చూద్దాం initramfs-tools-core
.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...
జట్టు dpkg -L
పేర్కొన్న ప్యాకేజీ నుండి సిస్టమ్లో ఉన్న అన్ని ఫైల్లను వీక్షించడానికి మిమ్మల్ని అనుమతిస్తుంది. నేను అధ్యయనం కోసం ఆసక్తికరమైన ఫైల్ను హైలైట్ చేసాను. ఫైల్ను పరిశీలిస్తే ఈ వేరియబుల్ ఎలా ఉపయోగించబడుతుందో చూపిస్తుంది, కానీ అది ఎక్కడ నుండి వచ్చిందో చెప్పలేదు.
debconf
ఇది ఒకరి కళాఖండమని తేలింది. ఎవరిది? ఇన్స్టాలర్లోకి ప్రవేశించే ముందు, మరొక ముఖ్యమైన డెబియన్ ఇన్ఫ్రాస్ట్రక్చర్ని పరిశీలిద్దాం - ప్రశ్నలకు సమాధానాలు. ప్యాకేజీ ప్రశ్న అడిగిన ప్రతిసారీ, మరియు చాలా సందర్భాలలో అది ప్రశ్న అడగకుండా డిఫాల్ట్ ఎంపికను ఉపయోగించినప్పుడు, ప్రశ్న మరియు సమాధానం రెండూ డెబియన్లోని debconf అనే ప్రత్యేక డేటాబేస్లో రికార్డ్ చేయబడతాయి. మేము సమాధానాల డేటాబేస్ను చూడవచ్చు (మరియు ప్యాకేజీని ఇన్స్టాల్ చేసే ముందు వాటిని కూడా సెట్ చేయవచ్చు - debconf-set-selections
), దీని కోసం మనకు యుటిలిటీ అవసరం debconf-get-selections
కూర్పు నుండి debconf-utils
. దురదృష్టవశాత్తు, ఆసక్తికరమైన ఏమీ కనుగొనబడలేదు :(debconf-get-selections |grep -i resume
ఖాళీగా తిరిగి వచ్చింది).
డెబియన్-ఇన్స్టాలర్
ఇన్స్టాలర్ ప్రశ్నలకు సమాధానాల యొక్క స్వంత డేటాబేస్ను కలిగి ఉన్నారు: /var/log/installer/cdebconf/questions.dat
. దురదృష్టవశాత్తు, మా రెజ్యూమ్ గురించి ఒక్క మాట కూడా లేదు.
కానీ సమీపంలో లాగ్లు ఉన్నాయి, సహా. syslog, ఇక్కడ మొత్తం ఇన్స్టాలేషన్ లాగ్ వ్రాయబడుతుంది. బేస్-ఇన్స్టాలర్ ప్యాకేజీ అక్కడ మరియు దానిపై పేర్కొనబడింది
వాటి లోపల మన ప్రశ్నకు సమాధానాన్ని సులభంగా కనుగొనవచ్చు:
resume="$(mapdevfs "$resume_devfs")"; then
...
if [ "$do_initrd" = yes ]; then
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconf
mapdevfs అనేది స్పష్టమైన ప్రయోజనంతో కూడిన యుటిలిటీ, మరియు మనకు ఆసక్తి ఉన్న ఫంక్షన్ get_resume_partition
, ఇది /proc/swaps అని చదివి, అక్కడ అతిపెద్దదాన్ని ఎంచుకుంటుంది. స్వాప్ పార్ట్మ్యాన్ నుండి వస్తుంది.
మా పరీక్ష విధికి సమాధానం: ఫైల్ ఇన్స్టాలేషన్ సమయంలో /టార్గెట్లో ఇన్స్టాలర్ ద్వారా సృష్టించబడుతుంది, అనగా. మేము బాగా తెలిసిన, కానీ ఒక కళాఖండం గురించి మాట్లాడుతున్నాము. సిస్టమ్లోని ప్రస్తుత ప్యాకేజీలలో ఈ ఫైల్ను మార్చగల ఏదీ లేదా ఏదీ లేదు.
సంగ్రహించేందుకు
- ఫైల్ ప్రొవైడర్లను కనుగొనడానికి dpkg మరియు debconf ప్రధాన పద్ధతులు.
- /var/lib/dpkg/infoలో శోధించడం వలన మీరు ఇన్స్టాలేషన్ దశలో ఫైల్లపై కార్యకలాపాలను చూడగలుగుతారు.
- ఇన్స్టాలర్ ఆర్టిఫ్యాక్ట్ ఫైల్లను సృష్టించగలదు, వాటిని ఎవరూ (యూజర్ మినహా) మార్చలేరు మరియు ఇది ఇన్స్టాలర్ కోడ్లో చూడవచ్చు.
మూలం: www.habr.com