Dansk Arch Linux forum

For det danske Arch Linux community

Du er ikke logget ind.


Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 348

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 349

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 348

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 349

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 333

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 333

#1 03-07-2006 08:10:48

julemand101
Admin
Fra: Brabrand
Registreret: 18-04-2006
Indlæg: 773
Website

Optimering af Pacman

Dette trick bør ikke benyttes med mindre man virkelig ved hvad man gør eller sidder ved en computer der godt må smadres. tongue

Vi Arch Linux brugere der har brugt systemet i et stykke tid kender det sikkert. Pacman er blevet sløv. Min Pacman begyndte at bruge 1 min for at lave en pacman -Ss mp3 og dette er bare ikke rimeligt. Årsagen skal findes i Pacman's struktur som betår af en mappe for hver pakke der kan installeres og desuden også en mappe for hver pakke du har installeret. I hver mappe er der så 3 små filer. Dette giver faktisk pænt mange små filer som systemet skal holde styr på og det bliver ikke bedre af at filerne så ligger rundt på hele disken da de ikke er kommet ind lige efter hinanden.

Svaret på problemet fandt jeg så i går og jeg må da lige sige det faktisk virker kanont. Det vi skal gøre er at lave et loopback filsystem, Nu tænker du sikkert at hvad pokker er et loopback filsystem men det er kort sagt et filsystem der ligger i en fil på disken.

I denne guide bliver der lavet en fil med en bestemt størrelse hvor der herefter bliver formateret med ext2.

Efter guiden har vi altså EN fil med et ext2 filsystem og her ligger vi så pacman databasen. Nu bliver databasen meget nemmere at få fat i for systemet og systemet kan hurtigt loade det hele i rammen og så søge efter pakken.

Nå men lad os da lige kommer frem til sagen. Log ind som root med:

su -

Nu laver du en fil i /root mappen med navnet pacman-cage (du kan lave den hvor du vil men da det er et script til system ting ligger jeg det selv altid i /root) med dette indhold:

Kode:

#!/bin/bash
#
#   pacman-cage
#
#   Copyright (c) 2002-2006 by Andrew Rose <rose.andrew@gmail.com>
#   I used Judds pacman-optimise as a framework.
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
#   USA.
#

myver='2.9.8'
dbroot="/var/lib/pacman"
pacmandb="/var/lib/pacman.db"

usage() {
        echo "pacman-cage $myver"
        echo "usage: $0 [pacman_db_root]"
        echo
        echo "pacman-cage creates a loopbacked filesystem in a contigious file."
        echo "This will give better response times when using pacman"
        echo
}

die() {
        echo "pacman-cage: $*" >&2
        exit 1
}

die_r() {
        rm -f /tmp/pacman.lck
        die $*
}

if [ "$1" != "" ]; then
        if [ "$1" = "-h" -o "$1" = "--help" ]; then
                usage
                exit 0
        fi
        dbroot=$1
fi

if [ "`id -u`" != 0 ]; then
        die "You must be root to cage the database"
fi

# make sure pacman isn't running
if [ -f /tmp/pacman.lck ]; then
        die "Pacman lockfile was found.  Cannot run while pacman is running."
fi
# make sure pacman.db hasnt already been made
if [ -f $pacmandb ]; then
        die "$pacmandb already exists!."
fi

if [ ! -d $dbroot ]; then
        die "$dbroot does not exist or is not a directory"
fi

# don't let pacman run while we do this
touch /tmp/pacman.lck
 
# step 1: sum the old db
echo "==> md5sum'ing the old database..."
find $dbroot -type f | sort | xargs md5sum >/tmp/pacsums.old

echo "==> creating pacman.db loopback file..."
dd if=/dev/zero of=$pacmandb bs=1M count=150 > /dev/null 2>&1

echo "==> creating ext2 -O dir_index -b 1024 -m 0 on $pacmandb..."
yes | mkfs.ext2 -O dir_index -b 1024 -m 0 $pacmandb > /dev/null 2>&1
       
echo "==> creating temporary mount point /mnt/tmp-pacman.."
mkdir /mnt/tmp-pacman

echo "==> mounting pacman.db to temporary mount point..."
mount -o loop $pacmandb /mnt/tmp-pacman

echo "==> copying pacman database to temporary mount point..."
cp -a /var/lib/pacman/. /mnt/tmp-pacman

echo "==> unmounting temporary mount point..."
umount /mnt/tmp-pacman

echo "==> removing temporary mount point..."
rmdir /mnt/tmp-pacman
       
echo "==> moving old /var/lib/pacman to /var/lib/pacman.bak..."
mv /var/lib/pacman /var/lib/pacman.bak
       
echo "==> createing new pacman db mount point @ $dbroot..."
mkdir $dbroot

echo "==> Mounting new pacman db..."
mount -o loop $pacmandb $dbroot

echo "==> md5sum'ing the new database..."
find $dbroot -type f | sort | xargs md5sum >/tmp/pacsums.new

echo "==> checking integrity..."
diff /tmp/pacsums.old /tmp/pacsums.new >/dev/null 2>&1
if [ $? -ne 0 ]; then
        # failed, move the old one back into place
        umount $dbroot
        rm $pacmandb
        mv $dbroot.bak $dbroot
        die_r "integrity check FAILED, reverting to old database"
fi

echo "==> Updating /etc/fstab to reflect changes..."
echo "$pacmandb $dbroot ext2 loop,defaults 0 0" >> /etc/fstab
 
rm -f /tmp/pacman.lck /tmp/pacsums.old /tmp/pacsums.new
 
echo
echo "Finished.  Your pacman database has been caged!.  May the speedy pacman be with you."
echo

exit 0 

Jeg siger lige med det samme at det er en god ide at læse hvad scriptet laver ved dit system. For når man laver sådan noget her skal man selv være inde i det så man hurtigt kan rette fejl der måtte komme.

Lav nu scriptet kørbar med:

chmod +x pacman-cage

Og INDEN DU KØRE DET laver du lige en backup af mappen /var/lib/pacman. Scriptet laver også en backup men stol aldrig på andre end dig selv wink

Når du har lavet en backup køre du scriptet med:

./pacman-cage

Hvis du for beskeden:

Finished.  Your pacman database has been caged!.  May the speedy pacman be with you.

Så er du faktisk færdig men jeg synes lige der mangler noget. Årsagen er at HVIS/NÅR computeren går ned så vil systemet altid fejltjekke filsystemerne for fejl. Men dette kan den ikke for dette nye filsystem før / filsystemet er loadet. Derfor laver vi lige dette lille trick.

Åbn filen /etc/fstab og udkommeter den sidste linje i filen som scriptet har tilføjet og tilføj så:

Kode:

# pacman db
/var/lib/pacman.db   /var/lib/pacman  ext2   defaults,loop,noauto  0     0 

Dette vil gøre at den ikke mounter filsystemet lige med det samme. Nu tilføjer du dette i filen /etc/rc.local:

Kode:

. /etc/rc.conf
. /etc/rc.d/functions

# Check and mount pacman database
stat_busy "Mounting the pacman database"
/sbin/e2fsck -p /var/lib/pacman.db
if [ $? -gt 1 ]; then
   stat_fail
   echo
   echo "WARNING: PACMAN DATABASE FILESYSTEM CHECK FAILED, NOT MOUNTED"
   echo
else
   mount /var/lib/pacman
   if [ $? -gt 0 ]; then
      stat_fail
      echo
      echo "WARNING: MOUNTING PACMAN DATABASE FAILED"
      echo
   else
      stat_done
   fi
fi

Dette mounter filsystemet når hele systemet er færdig med at indlæse. Hvis computeren er gået ned kan den derfor godt fejltjekke nu da den har mountet /.

Genstart nu computeren (dette er for ikke at computeren snyder med rammen) og prøv så at søge på noget med pacman -Ss og nyd din nye og hurtigere pacman database. tongue

VIGTIGT :: Det kan være katastrofalt at bruge pacman hvis den ikke har mountet databasen. Sørg for at databasen er mountet inden du bruger pacman.

Hvis du skulle blive træt af alt dette findes der skam et script der laver det hele tilbage:

Kode:

#!/bin/bash
#
#   pacman-uncage
#
#   Copyright (c) 2002-2006 by Andrew Rose <rose.andrew@gmail.com>
#   I used Judds pacman-optimise as a framework.
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
#   USA.
#

myver='2.9.8'
dbroot="/var/lib/pacman"
tmproot="/var/lib/pacman.new"
pacmandb="/var/lib/pacman.db"

usage() {
        echo "pacman-uncage $myver"
        echo "usage: $0 [pacman_db_root]"
        echo
        echo "pacman-uncage returns your pacman db to the generic style."
        echo
}

die() {
        echo "pacman-uncage: $*" >&2
        exit 1
}

die_r() {
        rm -f /tmp/pacman.lck
        die $*
}

if [ "$1" != "" ]; then
        if [ "$1" = "-h" -o "$1" = "--help" ]; then
                usage
                exit 0
        fi
        dbroot=$1
fi

if [ "`id -u`" != 0 ]; then
        die "You must be root to uncage the database"
fi

# make sure pacman isn't running
if [ -f /tmp/pacman.lck ]; then
        die "Pacman lockfile was found.  Cannot run while pacman is running."
fi

if [ ! -d $dbroot ]; then
        die "$dbroot does not exist or is not a directory"
fi

# don't let pacman run while we do this
touch /tmp/pacman.lck

# step 1: sum the old db
echo "==> md5sum'ing the old database..."
find $dbroot -type f | sort | xargs md5sum >/tmp/pacsums.old

echo "==> copying pacman.db contents back, note: the time needed to get a brew is now."
mkdir $tmproot
cp -a $dbroot/. $tmproot

echo "==> unmounting old dbroot and moving new one in"
umount $dbroot
rmdir $dbroot
mv $tmproot $dbroot

echo "==> md5sum'ing the new database..."
find $dbroot -type f | sort | xargs md5sum >/tmp/pacsums.new

echo "==> checking integrity..."
diff /tmp/pacsums.old /tmp/pacsums.new >/dev/null 2>&1
if [ $? -ne 0 ]; then
        # failed, move the old one back into place
        rm -rf $dbroot
        mkdir $dbroot
        mount -a
        die_r "integrity check FAILED, reverting to old database"
fi

echo "==> Removing old pacman.db"
rm $pacmandb

rm -f /tmp/pacman.lck /tmp/pacsums.old /tmp/pacsums.new
           
echo
echo "Finished.  Your pacman database has been uncaged!. Welcome home."
echo "You will need to remove the old mount line from your /etc/fstab"
echo

exit 0 

Dette gemmer du så bare som pacman-uncage og køre så det som jeg har fortalt om tidligere. Husk lige at fjerne det du skrev i /etc/rc.local og /etc/fstab.

God fornøjdelse. big_smile

PS. Dette er en oversat udgave af:
http://bbs.archlinux.org/viewtopic.php?t=20385
Hvor indholdet er blevet gjort mere brugervenligt. wink


Administrator for Archlinux.dk

Offline

 

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 348

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 349

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 348

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 349

#2 26-01-2007 15:42:07

Borelia
Hyppig poster
Registreret: 01-01-2007
Indlæg: 274

Re: Optimering af Pacman

Gør den noget som en pacman-optimize ikke gør. Jeg kører den i terminal som root;  pacman-optimize


~..Many times I wished there was an "undo" in real life.~

Offline

 

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 348

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 349

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 333

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 333

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 406

#3 21-11-2010 11:57:51

nbca
Periodisk poster
Registreret: 25-08-2010
Indlæg: 35

Re: Optimering af Pacman

Gør Pakken, der findes i AUR kaldet pacman-cage,  det samme, som du her har angivet?

Offline

 

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 348

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/vzn258/domains/archlinux.dk/public_html/forum/include/parser.php on line 349

#4 21-11-2010 12:16:41

julemand101
Admin
Fra: Brabrand
Registreret: 18-04-2006
Indlæg: 773
Website

Re: Optimering af Pacman

Det skal måske siges at guiden er ved at være ret gammel og man bør nok lige undersøge om det stadig er en god ting at gøre. Det største problem med at gøre det her er at din pacman database er meget sårbar overfor systemnedbrud eftersom det hele ligger i en enkelt fil. Hvis filsystemet fucker det op kan den finde på at slette denne fil og så har du lige mistet det hele.

Hvis man vil have de fordele dette system giver så vil jeg helt sikkert anbefale at man laver en partion på sin harddisk med reiserfs og så mount den som /var/lib/pacman. Dette trick er ikke så sårbart som det andet og du vil opnå lige så god performence.


Administrator for Archlinux.dk

Offline

 

Board footer

Powered by FluxBB