For det danske Arch Linux community
Du er ikke logget ind.
Dette trick bør ikke benyttes med mindre man virkelig ved hvad man gør eller sidder ved en computer der godt må smadres.
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:
#!/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
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å:
# 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:
. /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.
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:
#!/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.
PS. Dette er en oversat udgave af:
http://bbs.archlinux.org/viewtopic.php?t=20385
Hvor indholdet er blevet gjort mere brugervenligt.
Offline
Gør den noget som en pacman-optimize ikke gør. Jeg kører den i terminal som root; pacman-optimize
Offline
Gør Pakken, der findes i AUR kaldet pacman-cage, det samme, som du her har angivet?
Offline
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.
Offline