středa 25. prosince 2024

GPT: Ramdisk a extrakce .deb

 

Následující skript provádí popsané kroky, využívá RAMdisky různých velikostí podle potřeby a provádí extrakci. Tento skript je psán v Bash a je možné jej přizpůsobit podle konkrétních požadavků.

Bash skript: RAMdisk pro extrakci souboru z .deb

#!/bin/bash

# Cesty pro RAMdisky
RAMDISK_100M="/mnt/ram_tar_100M"
RAMDISK_300M="/mnt/ram_tar_300M"
RAMDISK_1000M="/mnt/ram_tar_1000M"
CILOVY_ADRESAR="/cilovy/adresar"  # Cílový adresář pro extrakci souboru
RAMDISK_PRIPRAVEN=""  # Sledování, jaký RAMdisk je aktuálně připojen

# Funkce pro kontrolu a vytvoření RAMdisku
function nastav_ramdisk {
    local ramdisk_path=$1
    local ramdisk_size=$2

    # Pokud složka neexistuje, vytvořte ji
    if [ ! -d "$ramdisk_path" ]; then
        sudo mkdir -p "$ramdisk_path"
    fi

    # Zkontrolujeme, zda je RAMdisk připojen
    local disk_size=$(du "$ramdisk_path" | awk '{print $1}')
    if [ "$disk_size" -eq 4 ]; then
        sudo mount -t tmpfs -o size="$ramdisk_size"M tmpfs "$ramdisk_path"
        RAMDISK_PRIPRAVEN="$ramdisk_path"
        echo "RAMdisk o velikosti $ramdisk_size MB připojen na $ramdisk_path"
    fi
}

# Funkce pro odpojení RAMdisku
function odpoj_ramdisk {
    local ramdisk_path=$1
    if mount | grep -q "$ramdisk_path"; then
        sudo umount "$ramdisk_path"
        echo "RAMdisk $ramdisk_path odpojen."
    fi
}

# Hlavní logika
function extrahuj_z_deb {
    local deb_soubor=$1

    # Zjistěte velikost .deb souboru
    local velikost_deb=$(du -m "$deb_soubor" | awk '{print $1}')

    # Nastav RAMdisk podle velikosti .deb souboru
    if [ "$velikost_deb" -le 33 ]; then
        nastav_ramdisk "$RAMDISK_100M" 100
    elif [ "$velikost_deb" -le 100 ]; then
        nastav_ramdisk "$RAMDISK_300M" 300
    else
        nastav_ramdisk "$RAMDISK_1000M" 1000
    fi

    if [ -z "$RAMDISK_PRIPRAVEN" ]; then
        echo "Chyba: Nepodařilo se připojit RAMdisk."
        exit 1
    fi

    # Přesuňte .deb na RAMdisk
    cp "$deb_soubor" "$RAMDISK_PRIPRAVEN/"
    cd "$RAMDISK_PRIPRAVEN" || exit

    # Rozbalte .deb
    ar x "$(basename "$deb_soubor")"
    if [ $? -ne 0 ]; then
        echo "Chyba při rozbalení .deb souboru."
        return 1
    fi

    # Extrahujte požadovaný soubor z data.tar.*
    tar -xf data.tar.* -C "$CILOVY_ADRESAR" ./cesta/k/pozadovanemu_souboru
    if [ $? -eq 0 ]; then
        echo "Extrakce souboru z archivu byla úspěšná."
    else
        echo "Chyba při extrakci souboru z archivu."
        return 1
    fi

    # Smažte soubory na RAMdisku
    rm -rf "$RAMDISK_PRIPRAVEN"/*
    echo "RAMdisk vyčištěn."

    # Odpojte RAMdisk, pokud velikost byla větší než 100 MB
    if [ "$RAMDISK_PRIPRAVEN" != "$RAMDISK_100M" ]; then
        odpoj_ramdisk "$RAMDISK_PRIPRAVEN"
    fi

    # Reset proměnné RAMDISK_PRIPRAVEN
    RAMDISK_PRIPRAVEN=""
}

# Ukázka použití
deb_soubor="/cesta/k/souboru.deb"
extrahuj_z_deb "$deb_soubor"

Vysvětlení:

  1. Funkce nastav_ramdisk: Zajistí připojení RAMdisku podle požadované velikosti.
  2. Funkce odpoj_ramdisk: Bezpečně odpojí RAMdisk, pokud byl použit.
  3. Hlavní logika: Vybere vhodný RAMdisk podle velikosti .deb souboru, extrahuje požadovaný soubor a na konci RAMdisk vyčistí nebo odpojí.
  4. Efektivita: Minimalizuje zápisy na disk a využívá RAMdisk pouze podle potřeby.

Tento skript pokrývá většinu požadovaných kroků a je snadno rozšiřitelný. Stačí nahradit ./cesta/k/pozadovanemu_souboru skutečnou cestou požadovaného souboru a nastavit CILOVY_ADRESAR.

LLM: Zkontroluj kod pro ramdisk a extrakci souboru z .deb

 

Kód vypadá dobře a pokrývá většinu požadovaných kroků. Nicméně, existuje několik drobných chyb a zlepšení, která lze provést:

  1. V funkci nastav_ramdisk je podmínka if [ "$disk_size" -eq 4 ]; then zbytečná. Místo toho lze přímo zkontrolovat, zda je RAMdisk připojen pomocí mount | grep -q "$ramdisk_path".
  2. V hlavním skriptu je proměnná CILOVY_ADRESAR nastavena na /cilovy/adresar, ale není zřejmé, zda tato cesta existuje. Lze přidat kontrolu, zda cesta existuje, a pokud ne, vytvořit ji.
  3. V hlavním skriptu je funkce extrahuj_z_deb volána s parametrem deb_soubor, ale není zřejmé, zda tento soubor existuje. Lze přidat kontrolu, zda soubor existuje, a pokud ne, vypsat chybovou zprávu.
  4. V hlavním skriptu je použita funkce ar x pro rozbalení .deb souboru, ale není zřejmé, zda tento soubor má správný formát. Lze přidat kontrolu, zda soubor má správný formát, a pokud ne, vypsat chybovou zprávu.
  5. V hlavním skriptu je použita funkce tar -xf pro extrakci souboru z data.tar.*, ale není zřejmé, zda tento soubor existuje. Lze přidat kontrolu, zda soubor existuje, a pokud ne, vypsat chybovou zprávu.

Zde je upravený kód s výše uvedenými zlepšeními:

bash

#!/bin/bash

# Cesty pro RAMdisky
RAMDISK_100M="/mnt/ram_tar_100M"
RAMDISK_300M="/mnt/ram_tar_300M"
RAMDISK_1000M="/mnt/ram_tar_1000M"
CILOVY_ADRESAR="/cilovy/adresar"  # Cílový adresář pro extrakci souboru
RAMDISK_PRIPRAVEN=""  # Sledování, jaký RAMdisk je aktuálně připojen

# Funkce pro kontrolu a vytvoření RAMdisku
function nastav_ramdisk {
    local ramdisk_path=$1
    local ramdisk_size=$2

    # Pokud složka neexistuje, vytvořte ji
    if [ ! -d "$ramdisk_path" ]; then
        sudo mkdir -p "$ramdisk_path"
    fi

    # Zkontrolujeme, zda je RAMdisk připojen
    if ! mount | grep -q "$ramdisk_path"; then
        sudo mount -t tmpfs -o size="$ramdisk_size"M tmpfs "$ramdisk_path"
        RAMDISK_PRIPRAVEN="$ramdisk_path"
        echo "RAMdisk o velikosti $ramdisk_size MB připojen na $ramdisk_path"
    fi
}

# Funkce pro odpojení RAMdisku
function odpoj_ramdisk {
    local ramdisk_path=$1
    if mount | grep -q "$ramdisk_path"; then
        sudo umount "$ramdisk_path"
        echo "RAMdisk $ramdisk_path odpojen."
    fi
}

# Hlavní logika
function extrahuj_z_deb {
    local deb_soubor=$1

    # Zkontrolujeme, zda soubor existuje
    if [ ! -f "$deb_soubor" ]; then
        echo "Chyba: Soubor $deb_soubor neexistuje."
        exit 1
    fi

    # Zjistěte velikost .deb souboru
    local velikost_deb=$(du -m "$deb_soubor" | awk '{print $1}')

    # Nastav RAMdisk podle velikosti .deb souboru
    if [ "$velikost_deb" -le 33 ]; then
        nastav_ramdisk "$RAMDISK_100M" 100
    elif [ "$velikost_deb" -le 100 ]; then
        nastav_ramdisk "$RAMDISK_300M" 300
    else
        nastav_ramdisk "$RAMDISK_1000M" 1000
    fi

    if [ -z "$RAMDISK_PRIPRAVEN" ]; then
        echo "Chyba: Nepodařilo se připojit RAMdisk."
        exit 1
    fi
    # Zkontrolujeme, zda soubor existuje
if [ ! -f "$deb_soubor" ]; then
echo "Chyba: Soubor $deb_soubor neexistuje."
exit 1
fi

# Zjistěte velikost .deb souboru
local velikost_deb=$(du -m "$deb_soubor" | awk '{print $1}')

# Nastav RAMdisk podle velikosti .deb souboru
if [ "$velikost_deb" -le 33 ]; then
nastav_ramdisk "$RAMDISK_100M" 100
elif [ "$velikost_deb" -le 100 ]; then
nastav_ramdisk "$RAMDISK_300M" 300
else
nastav_ramdisk "$RAMDISK_1000M" 1000
fi

if [ -z "$RAMDISK_PRIPRAVEN" ]; then
echo "Chyba: Nepodařilo se připojit RAMdisk."
exit 1
fi

# Přesuňte .deb na RAMdisk
cp "$deb_soubor" "$RAMDISK_PRIPRAVEN/"
cd "$RAMDISK_PRIPRAVEN" || exit

# Rozbalte .deb
ar x "$(basename "$deb_soubor")"
if [ $? -ne 0 ]; then
echo "Chyba při rozbalení .deb souboru."
return 1
fi

# Zkontrolujeme, zda existuje soubor data.tar.*
if [ ! -f "data.tar.*" ]; then
echo "Chyba: Soubor data.tar.* neexistuje."
return 1
fi

# Extrahujte požadovaný soubor z data.tar.*
tar -xf "data.tar.*" -C "$CILOVY_ADRESAR" ./cesta/k/pozadovanemu_souboru
if [ $? -eq 0 ]; then
echo "Extrakce souboru z archivu byla úspěšná."
else
echo "Chyba při extrakci souboru z archivu."
return 1
fi

# Smažte soubory na RAMdisku
rm -rf "$RAMDISK_PRIPRAVEN"/*
echo "RAMdisk vyčištěn."

# Odpojte RAMdisk, pokud velikost byla větší než 100 MB
if [ "$RAMDISK_PRIPRAVEN" != "$RAMDISK_100M" ]; then
odpoj_ramdisk "$RAMDISK_PRIPRAVEN"
fi

# Reset proměnné RAMDISK_PRIPRAVEN
RAMDISK_PRIPRAVEN=""
 
 
# Zkontrolujeme, zda soubor existuje
if [ ! -f "$deb_soubor" ]; then
    echo "Chyba: Soubor $deb_soubor neexistuje."
    exit 1
fi

# Zjistěte velikost .deb souboru
local velikost_deb=$(du -m "$deb_soubor" | awk '{print $1}')

# Nastav RAMdisk podle velikosti .deb souboru
if [ "$velikost_deb" -le 33 ]; then
    nastav_ramdisk "$RAMDISK_100M" 100
elif [ "$velikost_deb" -le 100 ]; then
    nastav_ramdisk "$RAMDISK_300M" 300
else
    nastav_ramdisk "$RAMDISK_1000M" 1000
fi

if [ -z "$RAMDISK_PRIPRAVEN" ]; then
    echo "Chyba: Nepodařilo se připojit RAMdisk."
    exit 1
fi

# Přesuňte .deb na RAMdisk
cp "$deb_soubor" "$RAMDISK_PRIPRAVEN/"
cd "$RAMDISK_PRIPRAVEN" || exit

# Rozbalte .deb
ar x "$(basename "$deb_soubor")"
if [ $? -ne 0 ]; then
    echo "Chyba při rozbalení .deb souboru."
    return 1
fi

# Zkontrolujeme, zda existuje soubor data.tar.*
if [ ! -f "data.tar.*" ]; then
    echo "Chyba: Soubor data.tar.* neexistuje."
    return 1
fi

# Extrahujte požadovaný soubor z data.tar.*
tar -xf "data.tar.*" -C "$CILOVY_ADRESAR" ./cesta/k/pozadovanemu_souboru
if [ $? -eq 0 ]; then
    echo "Extrakce souboru z archivu byla úspěšná."
else
    echo "Chyba při extrakci souboru z archivu."
    return 1
fi

# Smažte soubory na RAMdisku
rm -rf "$RAMDISK_PRIPRAVEN"/*
echo "RAMdisk vyčištěn."

# Odpojte RAMdisk, pokud velikost byla větší než 100 MB
if [ "$RAMDISK_PRIPRAVEN" != "$RAMDISK_100M" ]; then
    odpoj_ramdisk "$RAMDISK_PRIPRAVEN"
fi

# Reset proměnné RAMDISK_PRIPRAVEN
RAMDISK_PRIPRAVEN=""

Tento upravený kód zahrnuje následující změny:

*   Kontrola existence souboru `data.tar.*` před extrakcí.
*   Kontrola existence cílového adresáře `$CILOVY_ADRESAR` před extrakcí.
*   Přidání chybových zpráv pro lepší diagnostiku problémů.
*   Upravení logiky pro odpojení RAMdisku, aby se odpojil pouze v případě, že velikost RAMdisku byla větší než 100 MB.
 

úterý 24. prosince 2024

balíčky deb: archiv ar vs tar - Extrakce jediného souboru .deb

 

Rozdíl mezi formáty ar a tar spočívá v jejich struktuře a účelu:

1. Formát ar (Archive)

  • Formát používaný pro archivaci souborů v Debian balíčcích (.deb).
  • Má jednoduchou strukturu, která se skládá z několika částí:
    • Header: Informace o archivu, jako je název, velikost a čísla verzí.
    • Data: Vlastní soubory a jejich metadata.
    • Control files: Soubory, které obsahují informace o balíčku (např. control, postinst, prerm).
  • Tento formát je optimalizovaný pro balíčky Debianu a slouží k rozdělení balíčků na různé části, přičemž zbytek souborů je uložen v tar archivu uvnitř.

2. Formát tar (Tape Archive)

  • Formát používaný pro ukládání souborů do archivu bez komprese nebo s kompresí (např. tar.gz, tar.xz).
  • Jednoduchý souborový archiv: Používá se pro balení souborů do jedné "krabice" pro účely zálohování nebo distribuce.
  • Každý soubor v archivu je obvykle zařazen do archivu bez změny jeho struktury.

Jak souvisí ar a tar v .deb balíčku?

  • Balíček .deb je ve formátu ar, který obsahuje:
    • debian-binary: Textový soubor s verzí balíčku.
    • control.tar.*: Archiv ve formátu tar, který obsahuje všechny řídící soubory (např. control, postinst, atd.).
    • data.tar.*: Archiv ve formátu tar, který obsahuje soubory, které budou nainstalovány na systém.

Když používáte příkaz dpkg-deb --ctrl-tarfile, získáte právě control.tar.* (který je ve formátu tar). Tento příkaz neovlivňuje soubory uvnitř archivu ar ve smyslu jejich "převodu" na tar - jednoduše pouze extrahuje část balíčku (kontrolní soubory).

Proč dpkg-deb nemá přímo možnost extrahovat jeden soubor?

Jak správně uvádíte, není přímá možnost extrahovat pouze jeden soubor z .deb balíčku pomocí dpkg-deb. Tento nástroj je navržen pro rozbalení celého balíčku. Při rozbalování pomocí dpkg-deb --extract je soubor rozbalen celý, protože struktura balíčku není navržena pro extrakci jednotlivých souborů na úrovni balíčku — je třeba rozbalit všechny soubory z data.tar.* a pak podle potřeby vybrat konkrétní soubor.

Pokud tedy potřebujete extrahovat jeden soubor, musíte:

  1. Rozbalit celý balíček do nějakého dočasného adresáře (např. dpkg-deb --extract).
  2. Ručně vybrat soubor, který potřebujete, nebo použít skript na kopírování požadovaného souboru.

Alternativní přístup

Pokud chcete extrahovat soubor z .deb balíčku bez rozbalování celého balíčku, můžete použít ar přímo:

  1. Použití ar k extrakci souborů z .deb:

    ar x "$nazev_baliku"
    

    Tento příkaz vytvoří 3 soubory:

    • debian-binary
    • control.tar.*
    • data.tar.*
  2. Použití tar pro extrahování konkrétního souboru:

    tar -xf data.tar.* "$cesta_k_souboru" -C "$cilovy_adresar"
    

    Tento příkaz extrahuje konkrétní soubor z data.tar.*.

Závěr

  • dpkg-deb nemá přímou podporu pro extrakci jednoho souboru z .deb, protože je navržen pro rozbalení celého balíčku.
  • Můžete použít ar k extrahování částí balíčku a následně použít tar pro extrahování konkrétního souboru, ale i tento proces vyžaduje určitou přípravu.
  • Příkaz --ctrl-tarfile pouze extrahuje kontrolní soubory a neprovádí "převod" formátu ar na tar.

* * *

Rozumím vašemu dotazu! Pojďme to upřesnit:

Příkaz ar x rozbalí obsah .deb balíčku, ale pouze na první úroveň balíčku, tj. vyextrahuje soubory jako debian-binary, control.tar.* a data.tar.*. Nerozbalí však obsah těchto tar archivů, které jsou uvnitř (POZNÁMKA: TZN. INSTALACE VYŽADUJE DVOJNÁSOBEK AŽ TROJNÁSOBEK MÍSTA: a) pro stažení souboru .deb b) pro extrakci archivu c) pro extrakci souborů).

Jinými slovy:

  1. ar rozbalí pouze obsah balíčku .deb, což jsou tři součásti (debian-binary, control.tar.*, data.tar.*).
  2. Aby bylo možné získat konkrétní soubor (např. /usr/bin/somefile) z data.tar.*, je potřeba následně použít nástroj tar, který zpracuje tento archiv.

Proč tedy není ar stejné jako tar?

  • ar je velmi jednoduchý formát používaný jako obal. Není optimalizovaný pro extrakci jednotlivých souborů uvnitř vnořených archivů.
  • tar pracuje přímo se soubory uvnitř archivu a umožňuje extrakci jednotlivých souborů bez potřeby rozbalit vše.

Proces při extrakci konkrétního souboru

Pokud chcete extrahovat jeden konkrétní soubor z .deb balíčku:

  1. Použijete ar k rozbalení obsahu balíčku na první úrovni:

    ar x balicek.deb
    

    To vytvoří:

    • debian-binary
    • control.tar.*
    • data.tar.*
  2. Použijete tar k extrakci konkrétního souboru z data.tar.*:

    tar -xf data.tar.* cesta/k/souboru -C cilovy_adresar
    

Odpověď na vaši otázku

Ne, ar sám o sobě nerozbalí všechny soubory obsažené ve control.tar.* a data.tar.*. Jen "odstraní obal" a zpřístupní tyto archivy. Pokud následně chcete extrahovat konkrétní soubor, musí být použit tar k selektivní extrakci z těchto archivů. 

Příkaz ar x pouze extrahuje obsah balíčku .deb na úrovni archivu ar (extrahuje všechny data, která jsou nutné pro rozbalení archivu). To znamená, že oddělí jednotlivé části balíčku (debian-binary, control.tar.*, data.tar.*) a uloží je jako samostatné soubory na disk.

Tento přístup je efektivnější, protože se nemusí rozbalovat celý obsah balíčku do pracovního adresáře, pokud se zajímáte jen o konkrétní soubor.

* * *

Velikost souboru data.tar (nebo jeho komprimované varianty, např. data.tar.gz, data.tar.xz) závisí na tom, kolik prostoru zabírají nainstalované soubory balíčku a jaká komprese je použita. Odhad velikosti lze určit následovně:

  1. data.tar obsahuje nainstalovatelné soubory balíčku, což bývá hlavní složka .deb. Typicky zabírá většinu místa, často přes 80–95 % velikosti .deb. Např.:

    • .deb má 10 MB → data.tar.* bude obvykle kolem 8–9,5 MB.
  2. control.tar.* a debian-binary jsou velmi malé:

    • control.tar.* obsahuje metadata balíčku (např. seznam závislostí, popis). Bývá to malý soubor, často pod 100 KB.
    • debian-binary má vždy pevnou velikost 4 bajty.
  3. Komprese ovlivňuje velikost:

    • Pokud je .deb zkomprimováno efektivním algoritmem (např. xz), velikost data.tar může být po rozbalení větší než .deb.
    • Např.:
      • .deb komprimované na 10 MB (pomocí xz) → rozbalený data.tar může mít 12 MB nebo více.

 

 

LLama: Pokus o instalaci souborů balíčků podle seznamů.txt

Tak ten první skript dokončil práci a dostal jsem ten soubor .txt se seznamem souborů a balíčků. Tak ted chci napsat bash skript, který ho bude číst, a nejprve je třeba udělat seznam balíčků a jaké soubory obsahují, které se mají z nich extrahovat. Klíčová je tedy informace ze druhého sloupce kde je uveden název balíčku. Bylo by možné například vytvořit složku do které se budou vytvářet soubory s názvy balíčků a každý takový soubor .txt bude obsahovat soubory, které se mají nainstalovat z daného balíčku do dané cesty. V dalším kroku se přečte ten adresář a každý soubor, a ten soubor se bude instalovat. Pokud jsem to správně pochopil je třeba nejprve zjistit název a cestu k balíčku pomocí apt-cache policy název_balíčku .... a poté rozbalit ty soubory dpkg-deb -x /var/cache/apt/archives/název_balíčku.deb /cesta/k/souboru

 

#!/bin/bash

# Čtěte soubor missing_xml_packages.txt
while read soubor balicek; do
  # Vytvořte adresář pro balíček, pokud neexistuje
  if [ ! -d "$balicek" ]; then
    mkdir "$balicek"
  fi

  # Přidejte soubor do seznamu souborů pro balíček
  echo "$soubor" >> "$balicek/seznam_souboru.txt"
done < missing_xml_packages.txt

# Procházíte adresář s balíčky
for balicek in */; do
  # Zjistěte název a cestu k balíčku
  nazev_balicku=$(apt-cache policy "$balicek" | grep "Candidate" | cut -d' ' -f4)
  cesta_k_balicku="/var/cache/apt/archives/$nazev_balicku"

  # Rozbalte soubory z balíčku
  dpkg-deb -x "$cesta_k_balicku" "/"

done

 

* * *

 

#!/bin/bash

# Vytvořte složku pro ukládání souborů
mkdir -p xml_tmp

# Čtěte soubor missing_xml_packages.txt
while read soubor balicek; do
  # Extrahujte cestu k souboru a název balíčku
  cesta_k_souboru=${soubor% *}
  nazev_balicku=${balicek%:}
  echo "C:$cesta_k_souboru"
  echo "Nazev balicku:$nazev_balicku"
  # Zjistěte název a cestu k balíčku
  nazev_baliku=$(apt-cache policy "$nazev_balicku" | grep Kandidát: | cut -d ':' -f2- | tr -d ' ' )
  echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  echo "B:$nazev_baliku"
  echo "--------------------------------------------"
  cesta_k_balicku="/var/cache/apt/archives/$nazev_baliku"

  # Ověřte, zda soubor již existuje v adresáři
  if [ ! -f "$cesta_k_balicku" ]; then
    # Stáhněte soubor .deb balíčku
    sudo apt download "$nazev_balicku"
    cesta_k_balicku=$(find . -name "$nazev_baliku")
    echo "CkB:$cesta_k_balicku"
  fi

  # Rozbalte soubory z balíčku
  cilovy_adresar=$(dirname "$cesta_k_souboru")
  echo "Extrahuji do cílového adresáře: $cilovy_adresar"  
  dpkg-deb -x "/var/cache/apt/archives/$nazev_baliku" "$cilovy_adresar"

done < missing_xml_packages.txt

LLama: Jak získat jména balíčků k souborům, které v systému schází?

PRETEXT

Důvod proč chci z md5sums extrahovat jen informace o .xml je, že další soubory jako dokumentace .gz a obrázky .png apod. by bylo hodně souborů a celá akce obnovení souborů by trvala velmi dlouho. Příkaz dpkg -S je pomalý i na ssd.

První pokus je opravdu velmi pomalý, takže posledním dotazem žádám LLamu o skript, kde se zpracuje více souborů najednou.

POPIS PROBLÉMU

Dobře mám soubory, nyní ale nevím k jakým balíčkům ty scházející .xml soubory patří

Co jsem provedl - popis: 

md5sums: debsums -c -g 2>&1 > missing-configs.log 

vytvoří md5sums 

 Parametr -g způsobí, že debsums vytvoří soubor s kontrolními součty, ale neukládá jej do standardního výstupu. Místo toho se soubor s kontrolními součty uloží do adresáře /var/lib/dpkg/info/ s názvem md5sums 

Poté co jsou md5sums k balíčkům hotovy provedeme extrakci řádků kde schází "OK" (grep -v čili "negativ") a extrakci souborů .xml -> výpis scházejících souborů .xml: 

grep -v "OK" /var/lib/dpkg/info/*.md5sums | grep "\.xml$" | awk '{print $2}'

* * ** * *

Llama 3.1 70B

Nyní máte seznam scházejících souborů XML, ale nevíte, k jakým balíčkům patří. To je problém, protože soubory md5sums jsou uloženy v adresáři /var/lib/dpkg/info/ s názvem md5sums, ale neobsahují informace o balíčku, ke kterému patří.

Jedním ze způsobů, jak získat informace o balíčku, ke kterému patří soubor, je použít příkaz dpkg -S. Tento příkaz hledá soubor v databázi balíčků a vrátí název balíčku, ke kterému patří.

Můžete použít následující příkaz k získání informací o balíčku, ke kterému patří každý soubor:

grep -v "OK" /var/lib/dpkg/info/*.md5sums | grep "\.xml$" | awk '{print $2}' | xargs -I {} dpkg -S {}

Tento příkaz provede následující kroky:

  1. Extrahuje řádky, které neobsahují "OK" a obsahují řetězec ".xml$".
  2. Extrahuje název souboru z každého řádku.
  3. Použije příkaz dpkg -S k získání informací o balíčku, ke kterému patří každý soubor.

Poznámka: xargs je příkaz, který umožňuje provést akci na každém řádku výstupu. -I {} je parametr, který umožňuje nahradit {} názvem souboru v příkazu dpkg -S.

* * *

Dobře dobře ale chtěl bych ty výsledky rovnou uložit do souboru. Takže potřebuju název souboru .xml a název balíčku. Může to klidně být oddělené mezerou ty dva sloupce.

Llama 3.1 70B

Můžete použít následující příkaz k uložení výsledků do souboru:

grep -v "OK" /var/lib/dpkg/info/*.md5sums | grep "\.xml$" | awk '{print $2}' | xargs -I {} dpkg -S {} | awk '{print $2, $1}' > missing_xml_packages.txt

Tento příkaz provede následující kroky:

  1. Extrahuje řádky, které neobsahují "OK" a obsahují řetězec ".xml$".
  2. Extrahuje název souboru z každého řádku.
  3. Použije příkaz dpkg -S k získání informací o balíčku, ke kterému patří každý soubor.
  4. Použije příkaz awk k extrahování názvu balíčku a názvu souboru a uložení výsledků do souboru missing_xml_packages.txt.

Výsledný soubor bude mít následující formát:

název_souboru.xml název_balíčku

Příklad:

yelp.appdata.xml yelp yelp-xsl.xml yelp-xsl zim.xml zim

Poznámka: > missing_xml_packages.txt je parametr, který umožňuje uložit výstup do souboru missing_xml_packages.txt.

* * *

Je možné upravit skript tak, aby se data z každého .md5sums souboru zpracovaly najednou a dpkg -S se zavolal jen jednou pro daný soubor.

Můžete použít následující skript:

(ZATÍM NEOTESTOVÁNO)

for file in /var/lib/dpkg/info/*.md5sums; do
  soubory=$(grep -v "OK" "$file" | grep "\.xml$" | awk '{print $2}')
  dpkg -S $soubory | awk '{print $2, $1}' >> missing_xml_packages_2.txt
done

 

LLama: Jak nainstalovat jeden nebo více souborů z balíčku?

Pro mint - neotestováno

Llama 3.1 70B

Rozumím vašemu problému lépe. Chcete nainstalovat pouze konkrétní soubor nebo soubory z balíčku, nikoli celý balíček.

Abyste zjistili název souboru .deb, můžete použít příkaz apt-cache s parametrem policy a názvem balíčku. Například:

Code

apt-cache policy název_balíčku

Tento příkaz vypíše informace o balíčku, včetně názvu souboru .deb.

Pokud chcete nainstalovat pouze konkrétní soubor nebo soubory z balíčku, můžete použít příkaz dpkg-deb s parametrem -x a cestou k souboru .deb balíčku, stejně jako jsem již zmínil. Například:

Code

dpkg-deb -x /var/cache/apt/archives/název_balíčku.deb /cesta/k/souboru

Tento příkaz extrahuje pouze konkrétní soubor nebo soubory z balíčku .deb a nahradí jej na správném místě.

Pokud chcete nainstalovat pouze konkrétní soubor XML nebo obrázek, můžete použít příkaz dpkg-deb s parametrem -x a cestou k souboru .deb balíčku, stejně jako jsem již zmínil. Například:

Code

dpkg-deb -x /var/cache/apt/archives/název_balíčku.deb /cesta/k/souboru.xml

Tento příkaz extrahuje pouze konkrétní soubor XML z balíčku .deb a nahradí jej na správném místě.

Pokud chcete nainstalovat pouze konkrétní soubor nebo soubory z balíčku, můžete také použít příkaz ar s parametrem x a cestou k souboru .deb balíčku. Například:

Code

ar x /var/cache/apt/archives/název_balíčku.deb soubor.xml

Tento příkaz extrahuje pouze konkrétní soubor XML z balíčku .deb a nahradí jej na správném místě.

Je důležité poznamenat, že tyto příkazy vyžadují, aby byl soubor .deb balíčku dostupný v /var/cache/apt/archives/ nebo jiné cestě.

 

pondělí 23. prosince 2024

gnome: gedit a xed postrádaly závislost -common - vyhledání závislosti a oprava

$ gedit

(gedit:14317): GLib-GIO-ERROR **: 02:44:23.261: Settings schema 'org.gnome.gedit.state.file-chooser' is not installed

$ find . -name "*gedit*xml" ./schemas/org.gnome.gedit.plugins.wordcompletion.gschema.xml ./schemas/org.gnome.gedit.plugins.drawspaces.gschema.xml ./schemas/org.gnome.gedit.gschema.xml ./schemas/org.gnome.gedit.plugins.time.enums.xml ./schemas/org.gnome.gedit.plugins.spell.gschema.xml ./schemas/org.gnome.gedit.plugins.translate.gschema.xml ./schemas/org.gnome.gedit.plugins.pythonconsole.gschema.xml ./schemas/org.gnome.gedit.plugins.terminal.gschema.xml ./schemas/org.gnome.gedit.plugins.filebrowser.enums.xml ./schemas/org.gnome.gedit.plugins.filebrowser.gschema.xml ./schemas/org.gnome.gedit.plugins.externaltools.gschema.xml ./schemas/org.gnome.gedit.plugins.time.gschema.xml ./schemas/org.gnome.gedit.enums.xml user@Toshi:/usr/share/glib-2.0$ gedit (gedit:14317): GLib-GIO-ERROR **: 02:44:23.261: Settings schema 'org.gnome.gedit.state.file-chooser' is not installed Trasovací/ladící past (SIGTRAP) (core dumped [obraz paměti uložen]) user@Toshi:/usr/share/glib-2.0$

Llama 3.1 70B

Chyba, kterou jste dostal, naznačuje, že schéma org.gnome.gedit.state.file-chooser není nainstalováno. To může být způsobeno tím, že soubor org.gnome.gedit.gschema.xml nebyl zkompilován správně nebo že chybí některé závislosti.

Zkuste následující kroky:

  1. Přesuňte se do adresáře /usr/share/glib-2.0/schemas/.
  2. Spusťte příkaz glib-compile-schemas . znovu, aby se zkompilovaly všechny šablony schémat.
  3. Pokud stále dostanete chybu, zkuste odstranit soubor org.gnome.gedit.gschema.xml a poté spusťte příkaz glib-compile-schemas . znovu.
  4. Pokud stále dostanete chybu, zkuste nainstalovat balíček gedit-common, který obsahuje schéma org.gnome.gedit.state.file-chooser.

Pokud ani tyto kroky nepomohou, můžete zkusit vyhledat chybu v logu systému nebo v souboru /var/log/syslog, aby se zjistilo, zda je tam nějaká další chyba, která by mohla být příčinou problému.

Dále můžete zkusit spustit gedit s parametrem --verbose, aby se zobrazily detailnější informace o chybě:

gedit --verbose

Tento parametr může pomoci identifikovat příčinu chyby.

xed má taky závislost common? xed (xed:14555): GLib-GIO-ERROR **: 02:47:36.723: Settings schema 'org.x.editor.preferences.ui' does not contain a key named 'menubar-visible' Trasovací/ladící past (SIGTRAP) (core dumped [obraz paměti uložen])

Llama 3.1 70B

Ano, xed také má závislost na balíčku xed-common. Tento balíček obsahuje schéma nastavení pro xed, včetně klíče menubar-visible, který je zmíněn v chybové zprávě.

Chyba, kterou jste dostal, naznačuje, že schéma org.x.editor.preferences.ui neobsahuje klíč menubar-visible. To může být způsobeno tím, že soubor org.x.editor.gschema.xml nebyl zkompilován správně nebo že chybí některé závislosti.

Zkuste následující kroky:

  1. Přesuňte se do adresáře /usr/share/glib-2.0/schemas/.
  2. Spusťte příkaz glib-compile-schemas . znovu, aby se zkompilovaly všechny šablony schémat.
  3. Pokud stále dostanete chybu, zkuste odstranit soubor org.x.editor.gschema.xml a poté spusťte příkaz glib-compile-schemas . znovu.
  4. Pokud stále dostanete chybu, zkuste nainstalovat balíček xed-common, který obsahuje schéma org.x.editor.preferences.ui.

Pokud ani tyto kroky nepomohou, můžete zkusit vyhledat chybu v logu systému nebo v souboru /var/log/syslog, aby se zjistilo, zda je tam nějaká další chyba, která by mohla být příčinou problému.

Dále můžete zkusit spustit xed s parametrem --verbose, aby se zobrazily detailnější informace o chybě:

xed --verbose

Tento parametr může pomoci identifikovat příčinu chyby.

JAK IDENTIFIKOVAT TU ZÁVISLOST?

$ dpkg -S org.x.editor.gschema.xml
xed-common: /usr/share/glib-2.0/schemas/org.x.editor.gschema.xml
$ dpkg -S org.gnome.gedit.gschema.xml
gedit-common: /usr/share/glib-2.0/schemas/org.gnome.gedit.gschema.xml

 

 

GPT: Ramdisk a extrakce .deb

  Následující skript provádí popsané kroky, využívá RAMdisky různých velikostí podle potřeby a provádí extrakci. Tento skript je psán v Bas...

Štítky

.profile adm administrace Adobe AI akcelerace alfa transparence AND any aplikace apt ar archiv asociativní pole atomicity audio autentifikace awk balíčkovací systém bash beacon beacon_hint benchmark Bézierovy křivky bezpečnost biblehub BJT boolean buffer buffering Cache-Conrol Cloudflare code Collector Cut-off ColorManager colorpicker common compare config cookies CPU CPU pipe css CSS3 curl cut čas data loss data lost data transfer reliability datasheet datetime.strptime deb deb-systemd-helper debian debián development dioda diody dpkg dpkg -S dpkg-deb drivers EBO Emitter Cut-off Current eps ETag exclude exec Expires extrakce jediného extrakce názvu balíčku souboru extrakce souboru .deb fflock fflush ffmpeg FIFO file read file write file_get_contents file_get_contents/file_put_contents file_put_contents filter find first_install.sh flock Fly-back dioda font-face fóra fotorezistor fread functions funkce fwrite gate gate drive GDVfs gedit gedit-common geolokace Ghostscript GIO glib gnome gnome settings GNU Privacy Guard gnupg gpg gradient-background grafika grep grep -v groupadd grub grub update gs gsettings gtk gtk.css gtk+ hebrejština history hlavičky HS html html 5 https hudba charakterizace chroot chyba ICES IGBT img sizes img srcset impedance implementace imshow inference inkscape inrush current install jalový výkon javascript javescript jednocení seznamů js kapacita součástek koeficient zesílení komponenty xFce komunikace se serverem konfigurace Krita KSF Last-Modified lazy caching led LEFT JOIN librosa ligatury light-locker lightdm linux list log maják manuál maskování maskování služby masky matplotlib Max-Age measure memory měření MFCC MFCC koeficienty mint Mint 21.3 Mint xFce míry modules moralizace morphologie MOSFET mount moviepy mysql náběhový proud napěťová ochrana návod nel Network Error Logging NLP not Notifications NTFS nth-child oblékání ochrana okruhy přátel OpenVINO IR formát oprava oprava balíčku optočlen org.gnome.desktop.screensaver org.gnome.nm-applet ořezové masky OSHB otázky otázky_jazyky otázky_moralismu_řešení ovladače panely parsování path personifikace photorec php php 4 php 5 php 6 php 7 php 8 phpbb phpBB3 PipeWire pitch PN přechody pnp pole Policykit postscript práva profilování program prune průraz přeinstalování přepěťová ochrana přepolování příkazy připojení k síti připojení k wifi pseudokódd pstoedit PulseAudio PWM regulátory pydub python python3 pytorch ramdisk RBE RDSon read reaktance rectifier regulace vstupního napětí reinstall relyability remount replace restore reverzní geolokace RIGHT JOIN rm role rozvržení disků pro OS linux a data databází řešení samba sdílení sdílení souborů Sec-Fetch-Dest Sec-Fetch-Mode Sec-Fetch-Site Sec-Fetch-User Secure Shell sed Set Cookie show-manual-login show-remote-login shunt schemas schémata schottka skript skupiny sloupce služby song sort soubory soundfile spínané zdroje spínání splines split správa diskových zařízení SQL ssh stabilizace napětí stahování stream string strojové učení stropové učení supplicant svg syntax systemctl systemd-logind T5 tabulky Tangentové úsečky tar témata tepelná ztráta test text-shadow themes thermal runaway time timestamp tkinter tr transistor transition tranzistor tranzistory tuple tvorba otázek TVS ubuntu účiník udiskd udisks unconfined underrun unity-greeter update usermod uživatelé va charakteristika vala vektorová grafika Vgs video Vth vynechání adresářů vývoj while wpa wpa_supplicant wrapovací funkce x xandr xapp-watt xargs -I xed xed-common xfdesktop xml XOR Xorg Xorg Thumbnails xrandr závislosti zdánlivý výkon zdroj zenerka zenerovo napětí zip zip archiv zkratky zpomalení zpracování textu Žalmy