vvTF napísal:Nazdar hosi narazil som na zaujimavy problem. Instaloval som gnome na debiane... Instalacia padla na neznamom probleme.
Nasledne kazda operacia s apt-get isla do haja, vypisovalo chybu v nejakych pkg.
Aplikoval som nasledujuci postup
1. v adresari /var/lib/dpkg/info som vymazal vsetko okolo pkg ktore robili problem
2. odinstaloval gnome, odinstaloval x-server
apt-get funguje v poriadku az na par malych veci
atd... takychto pck ktore robia problem je vela ... ide o to ze tie pck neexistuju len neviem co a zkade sa na nich stale dotazuje. skusal som dany zaznam vymazat z dpkg/status no viedlo to k tomu ze som to musel cez apt-get install -f opravit naspat.
Neviete pls ako to riesit, nechcem gnome ani ziadny x-server. Chcem to odstranit vsetko prec.
Dakujem ...
Toto je prave dosledok vymazania /var/lib/dpkg/info/*.list suborov, ktore su dolezite, lebo obsahuju zoznam suborov a ich umiestneni pre odinstalaciu. Takze teraz nastava to, ze v zozname nainstalovanych balikov je balik oznaceny ako nainstalovany ale neexistuje k nemu *.list subor a to chape tak, ze ten balik zrejme nainstalovany nie je. Zial, to je tak, ked riesis, co netreba. Lebo 100% ti dalo daku hlasku pri tom zlyhanom pokuse o instalaciu gnome, len sa jej bolo treba venovat. Ale zase, pokial nejde o produkcny system, tak si sa aspon priucil niecomu. Teraz som na ceste z prace, tak neskor dam postup, co by mohol pomoct.
//autoeditácia príspevku (13 Okt 2010, 21:23)
Tak, ako som slubil. Vcera na to cas nebol moc ...
Napisal som skript, ktory obnovuje chybajuce list subory v /var/lib/dpkg/info . Sam som ho niekolkokrat spustil po vymazani list suborov a subory boli obnovene. Nasledne prestal aj dpkg vypisovat upozornenia.
Je nutne mat nainstalovany apt-file, ostatne by si mal mat. Akokolvek, skript ta na to upozorni a je ho nutne spustat ako root. Nie je ziaden progress bar vytvoreny, takze sa nelakat, ak to akoze nic nerobi. Treba mat strpenie, najma ak ich je "vela" (hodne relativne, ja viem).
Kód: Vybrať všetko
#! /bin/bash
###############################################################################
# Author: Patrik Uhrak
# Email: [email protected]
# Licence : GPLv3 http://www.opensource.org/licenses/gpl-3.0.html
# Description: Easily fix missing list files in /var/lib/dpkg/info/ without
# downloading any content.
###############################################################################
### READONLY VARIABLES
readonly SUCCESS=0
readonly E_ROOT=1
readonly E_APPS=127
readonly E_KILL=3
readonly DPKGINFODIR='/var/lib/dpkg/info'
### VARIABLES
TMP="$(mktemp -d /tmp/dpkgfix_XXXXXXXXXX)"
INSTALLEDPKG="${TMP}/installedpkg.file"
MISSINGLISTPKG="${TMP}/missinglistpkg.file"
################## FUNCTIONS ##################################################
# Show help
#
Help()
{
cat <<_EOF
Author: Patrik Uhrak
Email: [email protected]
Licence : GPLv3 http://www.opensource.org/licenses/gpl-3.0.html
Description: Easily fix missing list files in /var/lib/dpkg/info/ without
downloading any content.
Options:
-h --help : Shows help
In case you have saved the script in your PATH, then just run:
${0##*\/}
otherwise
bash "$0"
Hope this script helps but NO WARRANTIES can be given !!!
_EOF
}
# Verify that script is running by root
#
VerifyUser()
{
if [[ $EUID -ne 0 ]]
then
echo 'This script must be run as root!'
exit "$E_ROOT"
else
trap 'CleanUp' SIGHUP SIGINT SIGTERM
fi
}
# This function checks whether you have installed all needed applications to
# run this script
#
CheckNeededApps()
{
local APPSTATUS
for APP in {dpkg,sed,apt-file,grep}
do
which "$APP" &>/dev/null
if [[ $? -ne 0 ]]
then
echo "Missing application: $APP"
APPSTATUS=1
fi
done
if [[ $APPSTATUS -eq 1 ]]
then
echo 'You must install all applications above!'
exit "$E_APPS"
fi
}
# Can take only -h or --help to invoke help
#
GetParameters()
{
if [[ "$1" == '-h' || "$1" == '--help' ]]
then
Help
exit "$SUCCESS"
fi
}
# Get list of all installed packages
#
GetListInstalledPkg()
{
dpkg -l | grep '^ii' | cut -d' ' -f 3 > "$INSTALLEDPKG"
}
# Get list of packages with missing list files in /var/lib/dpkg/info/
#
GetMissingListFiles()
{
local PKG
for PKG in $(cat "$INSTALLEDPKG")
do
if [[ ! -f "${DPKGINFODIR}/${PKG}.list" ]]
then
echo "$PKG" >> "$MISSINGLISTPKG"
fi
done
}
# Create new list files
#
CreateListFile()
{
local PKG LIST
if [[ ! -f $MISSINGLISTPKG ]]
then
echo "Directory $DPKGINFODIR contains a list file for every installed package!"
rm -rf "$TMP"
exit "$SUCCESS"
fi
for PKG in $(cat "$MISSINGLISTPKG")
do
LIST="${TMP}/${PKG}.list"
apt-file list --regexp "^${PKG}$" | cut -d' ' -f2 > "$LIST"
IncludeDirs "$LIST"
done
}
# APT-FILE doesn't show directories, only files, but list files contain and
# therefore we need to cover this situation as well.
#
IncludeDirs()
{
local LINE TMPLIST
# temporary list files, otherwise it would end up in neverending loop
TMPLIST="${1}_tmp"
for LINE in $(cat "$1")
do
while [[ $LINE != '' ]]
do
# LINE="$(echo "$LINE" | sed -e 's/\(^.*\)\/.*$/\1/')"
LINE="${LINE%/*}" # easier,faster and works ;)
if ! grep "^${LINE}$" "$TMPLIST" &>/dev/null
then
echo "$LINE" >> "$TMPLIST"
else
break 1
fi
done
done
# Remove all empty lines from $TMPLIST and add it to $LIST
echo $LIST
sed -e '/^$/d' "$TMPLIST" >> "$LIST"
# It is expected to be there as well
echo '/.' >> "$LIST"
}
# Copy all newly created list files back to /var/lib/dpkg/info
#
RecoverListFiles()
{
mv -i "$TMP"/*.list "$DPKGINFODIR"
}
CleanUp()
{
rm -rf "$TMP"
exit "$E_KILL"
}
####################### MAIN ##################################################
VerifyUser
CheckNeededApps
GetParameters "$1"
GetListInstalledPkg
GetMissingListFiles
CreateListFile
RecoverListFiles
rm -rf "$TMP"
exit "$SUCCESS"
//autoeditácia príspevku (13 Okt 2010, 21:27)
Este som chcel dodat, ze pokial si pomazal aj ostatne skripty k dotycnym balikom(pred instalacne, po instalacne, atd), tak zial necakaj, ze je sposob obnovy aj ostatnich. Jedine stiahnut kazdy jeden balik, rozbalit a nakopirovat tie skripty spat. To zial tiez nemusi byt tak jednoduche, pokial bola uvolnena aktualizacia daneho balicka a tym padom je mozne, ze aj skripty sa zmenili. Ale tento prispevok ber len ako poznamku/radu.