poniedziałek, 8 sierpnia 2011

Zmiana rozmiaru partycji LVM (/var) poczas pracy systemu

Przyjmijmy, że mamy serwer, którego z różnych względów nie powinniśmy wyłączać. Nawet na kilka minut. Jednocześnie na serwerze kończy nam się miejsce na ważnej partycji (w tym przypadku jest to home). Mamy jednak trochę wolnego miejsca na innych partycjach. No i mamy LVM-a.
Rozwiązanie jest proste: "przesuniemy" trochę wolnej przestrzeni z innej partycji :).

Na początek musimy zorganizować taką wolną przestrzeń.

serwer:/# df -h

Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vgraid1-root 4.0G 423M 3.4G 12% /
tmpfs 4.4G 0 4.4G 0% /lib/init/rw
udev 10M 56K 10M 1% /dev
tmpfs 4.4G 0 4.4G 0% /dev/shm
/dev/sda1 183M 19M 155M 11% /boot
/dev/mapper/vgraid1-home 16G 2.6G 13G 18% /home
/dev/mapper/vgraid1-usr 16G 624M 15G 5% /usr
/dev/mapper/vgraid1-var 15.0G 235M 14.6G 2% /var

Jak widać na /var mamy sporo wolnego marnującego się miejsca i je właśnie wykorzystamy. Modyfikować możemy wyłącznie partycje, które nie są zamontowane. Odmontujemy zatem /var !

serwer:/# umount /var

umount: /var: device is busy
umount: /var: device is busy

Nie da się :( - mogliśmy się tego spodziewać - partycja jest używana. Musimy zadbać by nie była.

serwer:/# lsof |grep /var

acpid 12208 root 1w REG 254,4 159 626 /var/log/acpid
acpid 12208 root 2w REG 254,4 159 626 /var/log/acpid
cron 12224 root cwd DIR 254,4 4096 676 /var/spool/cron
cron 12224 root 3u REG 254,4 6 701 /var/run/crond.pid
syslogd 12241 root 1w REG 254,4 126215 194 /var/log/auth.log
syslogd 12241 root 2w REG 254,4 30750 160 /var/log/syslog
syslogd 12241 root 3w REG 254,4 4590 190 /var/log/daemon.log
syslogd 12241 root 4w REG 254,4 0 195 /var/log/kern.log
syslogd 12241 root 5w REG 254,4 0 1217 /var/log/lpr.log
syslogd 12241 root 6w REG 254,4 0 1218 /var/log/mail.log
syslogd 12241 root 7w REG 254,4 0 189 /var/log/user.log
syslogd 12241 root 8w REG 254,4 0 1220 /var/log/uucp.log
syslogd 12241 root 9w REG 254,4 0 1221 /var/log/mail.info
syslogd 12241 root 10w REG 254,4 0 1222 /var/log/mail.warn
syslogd 12241 root 11w REG 254,4 0 1223 /var/log/mail.err
syslogd 12241 root 12w REG 254,4 0 1224 /var/log/news/news.crit
syslogd 12241 root 13w REG 254,4 0 1225 /var/log/news/news.err
syslogd 12241 root 14w REG 54,4 0 1226 /var/log/news/news.notice
syslogd 12241 root 15w REG 254,4 0 405 /var/log/debug
syslogd 12241 root 16w REG 254,4 3525 191 /var/log/messages
ntpd 12255 ntpd cwd DIR 254,4 4096 713 /var/run/openntpd
ntpd 12255 ntpd rtd DIR 254,4 4096 713 /var/run/openntpd

Ok! żaden z programów nie wydaje się skrajnie ważny. System bez nich przez chwilę sobie poradzi. Zatem do dzieła. Wyłączamy usługi używające partycję /var.

serwer:/# lsof |grep /var

serwer:/# /etc/init.d/acpid stop
serwer:/# /etc/init.d/cron stop
serwer:/# /etc/init.d/sysklogd stop
serwer:/# /etc/init.d/openntpd stop

sprawdzamy czy jeszcze coś nie zostało

serwer:/# lsof |grep /var |wc -l

0

To jest TEN MOMENT kiedy należy zrobić backup danych z partycji, którą zamierzamy modyfikować. Ja zrobiłem to tak


serwer:/# tar cvvf var_backup.tar /var



Ok. Teraz możemy odmontować /var

serwer:/# umount /var


Sukces!

Teraz powinniśmy sprawdzić poprawność partycji:

serwer:/# e2fsck -f /dev/mapper/vgraid1-var

e2fsck 1.40-WIP (14-Nov-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/vgraid1-var: 1419/1831424 files (4.2% non-contiguous), 119616/3670016 blocks

Teraz zmienimy rozmiar partycji /dev/mapper/vgraid1-var. Najpierw musimy zmienić jej rozmiar na mniejszy niż jej rozmiar docelowy. W naszym przypadku rozmiar docelowy to 5G zatem zmniejszymy sobie rozmiar systemu plików do 3G.

serwer:/# resize2fs -p /dev/mapper/vgraid1-var 3G

resize2fs 1.40-WIP (14-Nov-2006)
Resizing the filesystem on /dev/mapper/vgraid1-var to 786432 (4k) blocks.
Begin pass 2 (max = 4448)
Relocating blocks XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = 112)
Scanning inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 4 (max = 106)
Updating inode references XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/mapper/vgraid1-var is now 786432 blocks long.

teraz zmniejszymy sobie partycję LVM:

serwer:/# lvreduce --size 5G /dev/vgraid1/var

WARNING: Reducing active logical volume to 5.00 GB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce var? [y/n]: y
Reducing logical volume var to 5.00 GB
Logical volume var successfully resized

a następnie ponownie uruchomimy resize2fs, ale teraz bez podawania rozmiaru systemu plików. Wówczas zostanie on ustawiony na maksymalny możliwy na danym urządzeniu
serwer:/# resize2fs -p /dev/mapper/vgraid1-var

resize2fs 1.40-WIP (14-Nov-2006)
Resizing the filesystem on /dev/mapper/vgraid1-var to 1310720 (4k) blocks.
Begin pass 1 (max = 16)
Extending the inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/mapper/vgraid1-var is now 1310720 blocks long.

I tyle. Pozostaje nam jeszcze ponownie zamontować partycję i uruchomić wcześniej zatrzymane usługi

serwer:/# mount /var

serwer:/# /etc/init.d/acpid start
serwer:/# /etc/init.d/cron start
serwer:/# /etc/init.d/sysklogd start
serwer:/# /etc/init.d/openntpd start

dzięki tej operacji mamy 10G nieprzydzielone do żadnej partycji. Wykonaliśmy już 50% zadania.
Teraz czas na zwiększenie partycji /home.

Podobnie jak poprzednio musimy zrobić backup a następnie odmontować partycję, którą będziemy modyfikować.

serwer:/# tar cvvf home.tar /home

serwer:/# umount /home

Teraz zmieniamy rozmiar partycji przydzielając jej zaoszczędzone wcześniej 10G

serwer:/# lvextend -L+9G /dev/vgraid1/home

Wykonujemy sprawdzenie systemu plików oraz resize:
serwer:/# e2fsck -f /dev/mapper/vgraid1-home

e2fsck 1.40-WIP (14-Nov-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/vgraid1-home: 272/2097152 files (26.8% non-contiguous), 226212/4194304 blocks

oraz resize:
serwer:/# resize2fs /dev/mapper/vgraid1-home

I ponownie montujemy partycję:

serwer:/# mount /home

I tyle! Cieszymy się nowo uzyskanym wolnym miejscem na partycji home.

czwartek, 4 sierpnia 2011

Jak działa wczytywanie ustawień w google+1?

Przycisk google +1 pojawił się w sieci już jakiś czas temu. Niedługo po jego premierze miałem okazje umieszczać go na pewnej witrynie. Cały proces jest raczej prosty. Wystarczy przejść na stronę: http://www.google.com/intl/pl/webmasters/+1/button/index.html i wygenerować sobie odpowiedni kod, a następnie wkleić go do HTML na swojej witrynie. Wszystko spoko... ale zaciekawiła mnie jedna kwestia. Wygenerowany przez google kod zawierał między innymi coś takiego:


<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
   {lang: 'pl'}
</script>

I tu pojawiło się moje pytanie. Jak oni to robią, że wczytują ustawienia języka z takiego kodu???
Trochę powalczyłem i ostatecznie udało mi się to zrobić :). Kod jest prosty, więc nie będę go opisywał a jedynie załączę treść plików html i js

test.html:
<html>
   <body>
      <g:plusone>xxx</g:plusone>
      <script type="text/javascript" src="test.js">
         {lang: 'pl'}
      </script>
   </body>
</html>

test.js:
var scripts = document.getElementsByTagName( 'script' );
var thisScriptTag = scripts[ scripts.length - 1 ];
eval( "var config = " + thisScriptTag.innerHTML);
document.getElementsByTagName( 'g:plusone' )[0].outerHTML = "google w jezyku: " + config.lang;