Kako osloboditi / (root) particiju za novi kernel 2

Prije skoro dvije i pol godine smo pisali kako osloboditi "/" particiju (root particiju, nemojte pobrkati sa HOME direktorijem korisnika root, /root!) i time napraviti prostor za nove inačice jezgri sustava - kernel. No, od tada smo napustili LILO bootstrap loader u korist GRUB-a, te vlastiti kernel u korist originalnog Debianovog. Tako je članak "Kako osloboditi / (root) particiju za novi kernel?" postao pomalo zastario, a sudeći po upitima na SysHelpu, problem je i dalje ostao. Iz tog razloga, ponovit ćemo lekciju i nastojati pobliže objasniti problem, bez obzira rabili LILO ili GRUB, jedan ili više kernela.

U osnovi, problem je veličina samog paketa i odgovarajućih modula, koji su trenutno oko 60 MB i relativno male / particije. Dakle, veličinu / particije držite na barem 512 MB, a ukoliko je manja, morat ćete poduzeti neke korake da bi se problemi izbjegli (bilo brisanjem nepotrebnih datoteka, bilo reparticioniranjem diska).

Problem se manifestira kod instalacije paketa s novim kernelom, primjerice ovako:

Unpacking replacement linux-image-2.6.26-2-686-bigmem ...
dpkg: error processing /var/cache/apt/archives/
linux-image-2.6.26-2-686-bigmem_2.6.26-26lenny1_i386.deb (--unpack):
failed in buffer_write(fd) (10, ret=-1): backend dpkg-deb during
`./lib/modules /2.6.26-2-686-bigmem/kernel/net/netfilter/xt_policy.ko':
No space left on device
dpkg-deb: subprocess paste killed by signal (Broken pipe)

Porukom "No space left on device" sustav nam javlja da na odgovarajućoj particiji nema dovoljno prostora za snimanje novih podataka. Direktorij "/lib/modules" se nalazi na / particiji, te je ujedno i glavni razlog zašto se particija zapuni (sam kernel je manji od 2 MiB).

Pogledajmo što se sve u /lib/modules (moduli jezge) i /boot direktoriju (jezgra i pomoćne datoteke) može nalaziti:

1.9M    /lib/modules/2.2.19pre17-compact
1.9M /lib/modules/2.4.14
1.8M /lib/modules/2.4.16
15M /lib/modules/2.6.22.9
15M /lib/modules/2.6.22.9-grsec
16M /lib/modules/2.6.24
16M /lib/modules/2.6.24-grsec
16M /lib/modules/2.6.24.2
16M /lib/modules/2.6.24.2-grsec
16M /lib/modules/2.6.24.5
14M /lib/modules/2.6.24.5-grsec
54M /lib/modules/2.6.26-2-686-bigmem
1,5M /lib/modules/2.6.26-2+cn1-686-bigmem

A sada i koliko mjesta zauzimaju same jezgre:

# ls -l /boot |grep vmlinuz
-rwxr-xr-x 1 root root 1044126 Oct 18 2001 vmlinuz-2.2.19pre17-compact
-rw-r--r-- 1 root root 576748 Nov 6 2001 vmlinuz-2.2.20
-rw-r--r-- 1 root root 783003 Nov 21 2001 vmlinuz-2.4.14
-rw-r--r-- 1 root root 1453144 Oct 17 2007 vmlinuz-2.6.22.9
-rw-r--r-- 1 root root 1481528 Oct 16 2007 vmlinuz-2.6.22.9-grsec
-rw-r--r-- 1 root root 1507416 Jan 30 19:42 vmlinuz-2.6.24
-rw-r--r-- 1 root root 1507928 Jan 30 18:58 vmlinuz-2.6.24-grsec
-rw-r--r-- 1 root root 1507320 Feb 11 16:01 vmlinuz-2.6.24.2
-rw-r--r-- 1 root root 1549648 Sep 17 03:01 vmlinuz-2.6.26-2-686-bigmem
-rw-r--r-- 1 root root 803497 Dec 14 2005 vmlinuz-generic
-rw-r--r-- 1 root root 803497 Mar 9 2005 vmlinuz-old

Može se vidjeti da jezgre zauzimaju relativno malo mjesta, no ukoliko ste isti poslužitelj nadograđivali, s vremenom će se to sve zbrojiti i nepotrebno zauzimati mjesto.

Prvo što možemo učiniti je bezopasno: provjerite ima li u / direktoriju nepotrebnih velikih datoteka i obrišite ih. Direktorij / treba izgledati otprilike ovako:

drwxr-xr-x   2 root  root     3072 2010-09-21 10:20 bin
drwxr-xr-x 3 root root 2048 2010-10-27 09:28 boot
drwxr-xr-x 2 root root 1024 2003-12-12 10:51 cdrom
drwxr-xr-x 17 root root 3500 2010-04-08 12:28 dev
drwxr-xr-x 145 root root 8192 2010-11-23 09:52 etc
drwxr-xr-x 2 root root 1024 2003-12-12 10:51 floppy
drwxr-xr-x 17 root root 4096 2010-09-14 22:28 home
drwxr-xr-x 2 root root 1024 2003-12-12 10:51 initrd
lrwxrwxrwx 1 root root 35 2010-09-26 11:56 initrd.img -> boot/initrd.img-2.6.26-2-686-bigmem
drwxr-xr-x 13 root root 5120 2010-10-26 07:51 lib
drwx------ 2 root root 1024 2003-12-12 10:47 lost+found
drwxr-xr-x 3 root root 1024 2009-02-14 16:27 mnt
drwxr-xr-x 2 root root 1024 2003-12-12 10:51 opt
dr-xr-xr-x 240 root root 0 2010-04-08 12:13 proc
drwxr-xr-x 16 root root 2048 2010-11-01 12:21 root
drwxr-xr-x 2 root root 4096 2010-10-26 07:51 sbin
drwxr-xr-x 2 root root 1024 2008-09-16 09:38 selinux
drwxr-xr-x 11 root root 0 2010-04-08 12:13 sys
drwxrwxrwt 22 root root 16384 2010-11-29 15:26 tmp
drwxr-xr-x 13 root root 4096 2009-07-01 16:50 usr
drwxr-xr-x 18 root root 4096 2010-04-08 12:10 var

Dakle, nema nikakvih datoteka, nego služi samo kao mount point za ostatak datotečnog sustava i slično tomu. No, nekada se ovdje nenamjerno znaju naći datoteke koje samo zauzimaju prostor, bilo vašom greškom, bilo da neki program rabi / direktorij ukoliko ne može naći svoj radni direktorij (a znaju ovamo zalutati i .avi, .mp3 i .pdf datoteke).

Ukoliko nema nepotrebnih datoteka, moramo preći na opasniju fazu: brisanje nepotrebnih jezgri i odgovarajućih modula. Skratit ćemo postupak i reći da možete obrisati sve jezgre ispod 2.6.26 ukoliko rabite Debian Lenny, te sve jezgre ispod 2.6.32 ukoliko rabite Debian Squeeze. Ukoliko niste sigurni koju jezgru rabite, poslužite se naredbom uname:

# uname -r
2.6.26-2-686-bigmem

Također, u /boot/grub/menu.lst provjerite koja će se jezgra automatski učitati nakon restarta poslužitelja, odnosno koliko jezgri uopće imate u izborniku ("default 0" označava da će se učitati prva spomenuta jezgra):

default         0

title Debian GNU/Linux, kernel 2.6.26-2-686-bigmem
root (hd0,1)
kernel /boot/vmlinuz-2.6.26-2-686-bigmem root=/dev/sda2 ro
initrd /boot/initrd.img-2.6.26-2-686-bigmem

title Debian GNU/Linux, kernel 2.6.26-2-686-bigmem (single-user mode)
root (hd0,1)
kernel /boot/vmlinuz-2.6.26-2-686-bigmem root=/dev/sda2 ro single
initrd /boot/initrd.img-2.6.26-2-686-bigmem

title Debian GNU/Linux, kernel memtest86+
root (hd0,1)
kernel /boot/memtest86+.bin

Nadalje, provjerite koje su jezgre instalirane, jer ne moraju sve biti navedene u menu.lst.

# COLUMNS=200 dpkg -l linux-image\*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name Version Description
+++-============================================-==================
un linux-image <none>
un linux-image-2.6 <none>
ii linux-image-2.6.24-etchnhalf.1+cn1-686-bigme 2.6.24-6~etchnhalf.9etch1+cn1
un linux-image-2.6.26-2+cn1-486 <none>
un linux-image-2.6.26-2+cn1-686 <none>
rc linux-image-2.6.26-2+cn1-686-bigmem 2.6.26-19lenny2+cn1
un linux-image-2.6.26-2+cn1-amd64 <none>
ii linux-image-2.6.26-2-686-bigmem 2.6.26-27
ii linux-image-686-bigmem 2.6.26+17+lenny1
un linux-image-amd64 <none>

Jezgre koje su instalirane, a ne rabe se, niti spominju u menu.lst, možemo odmah obrisati:

# dpkg -P linux-image-2.6.24-etchnhalf.1+cn1-686-bigmem
(Reading database ... 67564 files and directories currently installed.)
Removing linux-image-2.6.24-etchnhalf.1+cn1-686-bigmem ...
Running postrm hook script /usr/sbin/update-grub.
...
The link /initrd.img.old is a damaged link
...
Updating /boot/grub/menu.lst ... done

U nekim slučajevima (primjerice, netko je instalirao jazgru direktno iz koda, pa se ne pojavljuje u bazi paketa), potrebno je ručno brisanje. Ovo nije bezazlena operacija, jer je greška lako moguće, stoga budite oprezni!

Brisanje jezgri koje se ne pojavljuju u paketnom sustavu, niti u menu.lst se provodi ovako:

# cd /boot
# rm vmlinuz-2.2* System.map-2.2* initrd-2.2* config-2.2*
# rm vmlinuz-2.4* System.map-2.4* initrd-2.4* config-2.4*
# rm vmlinuz-2.6-24* System.map-2.6.24* initrd-2.6.24* config-2.6.24*
# rm *.bak

Nakon toga možete obrisati i njihove module:

# cd /lib/modules
# rm -fr 2.2*
# rm -fr 2.4*
# rm -fr 2.6.24*

Budite oprezni kod izvođenja naredbe "rm", provjerite u kojem ste direktoriju pomoću naredbe "pwd"!

Dalje je jednostavno:

# apt-get -f install 

ili

# apt-get install kernel-2.6-cn

Sada bi se nove jezgre trebale bez problema instalirati, no nakon svake nadogranje na novu inačinu Debiana provjerite ima li nepotrebnih datoteka ili jezgri viška. Naravno, sasvim je u redu, dapače čak i pametno, ostaviti staru jezgru s kojom vam sve radi, kako biste mogli u svakom trenutku podići poslužitelj ukoliko se ustanovi problem s novom jezgrom. Naravno, ukoliko imate mjesta na / particiji :).

UPDATED: 2012-03-01

Kuharice: 
Kategorije: 
Vote: 
0
No votes yet

Komentari

Nisam imao problema sa slobodnim prostorom, ali sam ipak, potaknut ovim tekstom, odlučio provjeriti situaciju kod sebe i potom pobrisao neke starije verzije kernela i modula, koji su ostali još od Etcha.

Također sam i maknio iste unose u menu.lst. Je li nakon toga potrebno napraviti update-grub?

Kernelova instalacijska skripta to cini umjesto Vas:

Unpacking replacement linux-image-2.6.26-2-686-bigmem ...
Running postrm hook script /usr/sbin/update-grub.
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.26-2-686-bigmem
Found kernel: /boot/memtest86+.bin
Updating /boot/grub/menu.lst ... done

A evo i izvatka iz man stranice:

DESCRIPTION
update-grub is a program used to generate the menu.lst file used by the
grub bootloader.  It works by looking in  /boot  for  all  files  which
start  with  "vmlinuz-". They will be treated as kernels, and grub menu
entries will be created for each.

Dakle, ako ste ih rucno maknuli, ne treba pokretati update-grub.

Dakle, umjesto ručnog uklanjanja stavaka iz menu.lst mogao sam napraviti update-grub i dobio bih istu stvar?