По default F14 идва с nouveau драйвер зa видео картата. Ако искате да сложите нов дравер направете следното:
1. Сваляне на драйвера от www.nvidia.com (NVIDIA-Linux-x86_64-260-19.36.run)
2. Reboot и по време на GRUB избирате опция за допълнителни параметри към kernel (от менюто избирате 'a'). Добавяте параметъра single накрая на реда.
3. Когато се стартира системата, няма да ви иска парола.
Изпълнявате init 3
4. Логвате се с root
5. Изпълнявате NVIDIA-Linux-x86_64-260-19.36.run. Най-вероятно ще излезе грешка, че nouveau е активен.
6. Изберете yes за modprobe disable стъпката.
7. Изпълнете 2-5 отново. Ако пак възникне грешка, тогава трябва да се направи едно от двете:
7а. Редактирате /boot/grub/grub.conf и на реда в който започва с kernel накрая добавяте параметъра rdblacklist=nouveau (това е същия ред който редактирате от GRUB-a)
7b. Променяте initramfs като изпълните командите
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r)-nouveau.img
dracut /boot/initramfs-$(uname -r).img $(uname -r)
8. Повтаряте стъпките от 2-5 и този път не трябва да ви даде грешка за nouveau. Избирате да инсталирате opengl32 и да конфигурирате X средата
About Me
Sunday, February 13, 2011
Как да инсталираме skype под F14
http://yunustj.wordpress.com/2010/07/18/how-to-install-skype-on-to-fedora-13-x86_64/
yum whatprovides
ни дава информация кой пакет да инсталираме за да имаме дадената библиотека.
E: skype: error while loading shared libraries: libasound.so.2: cannot open shared object file: No such file or directory
S: yum install alsa-lib.i686
E: skype: error while loading shared libraries: libXv.so.1: cannot open shared object file: No such file or directory
S: yum install libXv.i686
E: skype: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory
S: yum install libXScrnSaver.i686
E: skype: error while loading shared libraries: libQtDBus.so.4: cannot open shared object file: No such file or directory
S: yum install qt.i686
E: skype: error while loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory
S: yum install qt-x11.i686
На стъпката с libQtDBus.so.4 имах доста проблеми, защото имаше конфликти с вече инсталирани пакети. Това което си спомням, че направих е да инсталирам qt.x86_64, т.е.:
yum install qt.x86_64
yum install qt.i686
И по някакъв магически начин след това нямаше конфликти :-)
yum whatprovides
ни дава информация кой пакет да инсталираме за да имаме дадената библиотека.
E: skype: error while loading shared libraries: libasound.so.2: cannot open shared object file: No such file or directory
S: yum install alsa-lib.i686
E: skype: error while loading shared libraries: libXv.so.1: cannot open shared object file: No such file or directory
S: yum install libXv.i686
E: skype: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory
S: yum install libXScrnSaver.i686
E: skype: error while loading shared libraries: libQtDBus.so.4: cannot open shared object file: No such file or directory
S: yum install qt.i686
E: skype: error while loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory
S: yum install qt-x11.i686
На стъпката с libQtDBus.so.4 имах доста проблеми, защото имаше конфликти с вече инсталирани пакети. Това което си спомням, че направих е да инсталирам qt.x86_64, т.е.:
yum install qt.x86_64
yum install qt.i686
И по някакъв магически начин след това нямаше конфликти :-)
Sunday, January 09, 2011
Активни транзакции в Oracle
Ето и едно скрипче което показва активните транзакции в Oracle.
SELECT
s.osuser, vp.spid as os_pid, S.BLOCKING_SESSION blocker,
S.SID, S.SERIAL#, S.USERNAME, S.MACHINE,
Q.SQL_FULLTEXT cur_sql, PQ.SQL_FULLTEXT prev_sql,
vt.used_urec, vt.start_date
FROM
v$session S
LEFT JOIN v$sqlarea Q on S.SQL_ID = Q.SQL_ID
LEFT JOIN v$sqlarea PQ on S.PREV_SQL_ID = PQ.SQL_ID
LEFT JOIN v$process vp on s.paddr = vp.addr
LEFT JOIN v$transaction vt on s.saddr = vt.ses_addr
WHERE
vt.start_date < SYSDATE - (5/1440)
-- AND
-- s.machine = 'machine.name'
ORDER BY
S.SID
;
SELECT
s.osuser, vp.spid as os_pid, S.BLOCKING_SESSION blocker,
S.SID, S.SERIAL#, S.USERNAME, S.MACHINE,
Q.SQL_FULLTEXT cur_sql, PQ.SQL_FULLTEXT prev_sql,
vt.used_urec, vt.start_date
FROM
v$session S
LEFT JOIN v$sqlarea Q on S.SQL_ID = Q.SQL_ID
LEFT JOIN v$sqlarea PQ on S.PREV_SQL_ID = PQ.SQL_ID
LEFT JOIN v$process vp on s.paddr = vp.addr
LEFT JOIN v$transaction vt on s.saddr = vt.ses_addr
WHERE
vt.start_date < SYSDATE - (5/1440)
-- AND
-- s.machine = 'machine.name'
ORDER BY
S.SID
;
Thread dump на Glassfish
Понякога се налага да се проверят разни продъкшан системи защо забиват и т.н.
Един добър начин това да се направи, е чрез използването на JMX менидмънт бийновете.
Ot\bin се пуска jconsole въвежда се следния remote process
След това се следва туторияла за jconsole-ата
http://download.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html
Интересното е таба Threads и отдолу има списък с тредовете и техния stacktrace
Един добър начин това да се направи, е чрез използването на JMX менидмънт бийновете.
Ot
service:jmx:rmi:///jndi/rmi://127.0.0.1:8686/jmxrmiи се въвеждат администраторските пароли за glassfish-а.
След това се следва туторияла за jconsole-ата
http://download.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html
Интересното е таба Threads и отдолу има списък с тредовете и техния stacktrace
Пълно форматиране на харда от Windows 7 DVD
Може би някои са забелязали, новият инсталатор нa Windows вече няма full format, а само quick. Това супер, ако все пак не се нуждаете от проверка за лоши сектори или искате тотално да затриете информацията. Следната процедура позволява пълно форматиране
1. Започнете инсталиране от DVD-то
2. На екрана "Where do you want to install Windows" изтрийте всичките партишъни и създайте нов празен.
3. Форматирайте го - това е quick формата
4. Натиснете Shift + F10 (ще се отвори конзола)
6. От команд промпта напишете "format c:". Параметъра /P:<число> ще занули съдържанието на секторите.
1. Започнете инсталиране от DVD-то
2. На екрана "Where do you want to install Windows" изтрийте всичките партишъни и създайте нов празен.
3. Форматирайте го - това е quick формата
4. Натиснете Shift + F10 (ще се отвори конзола)
6. От команд промпта напишете "format c:". Параметъра /P:<число> ще занули съдържанието на секторите.
Wednesday, June 23, 2010
Show available disks drives under Linux (Fedora)
Somebody wondering how to show all attached hard disks / CD DVD drives under Linux?
Here is a small program that do just that. It works perfectly under Fedora 13. Copy/Past the text in file called /usr/bin/lshdd
You can easily find the partitions of specific drive
P.S. It is my first awk script, so it really looks ugly, I know ;-)
Here is a small program that do just that. It works perfectly under Fedora 13. Copy/Past the text in file called /usr/bin/lshdd
#!/bin/bash
if [ "$1" == "-v" ]; then
verbose="true"
else
verbose="false"
fi
lshal | awk -v verbose=$verbose 'BEGIN {
name=""
}
{
if ($0~"^udi = ") {name=""}
if ($0~"^udi = ./org/freedesktop/Hal/devices/storage_serial_.*") {
match($3, "/org/freedesktop/Hal/devices/storage_serial_(.*).", arr);
name=arr[1]
}
if ($0~"^udi = ./org/freedesktop/Hal/devices/storage_model.*") {
match($3, "/org/freedesktop/Hal/devices/storage_model_(.*).", arr);
name=arr[1]
}
if (name!="" && $0~"block.device") {
match($3, "(/dev/.*).", arr);
if (verbose~"true") {
print arr[1] " = " name
} else {
print arr[1]
}
name = ""
}
}'
Change the file permissions:if [ "$1" == "-v" ]; then
verbose="true"
else
verbose="false"
fi
lshal | awk -v verbose=$verbose 'BEGIN {
name=""
}
{
if ($0~"^udi = ") {name=""}
if ($0~"^udi = ./org/freedesktop/Hal/devices/storage_serial_.*") {
match($3, "/org/freedesktop/Hal/devices/storage_serial_(.*).", arr);
name=arr[1]
}
if ($0~"^udi = ./org/freedesktop/Hal/devices/storage_model.*") {
match($3, "/org/freedesktop/Hal/devices/storage_model_(.*).", arr);
name=arr[1]
}
if (name!="" && $0~"block.device") {
match($3, "(/dev/.*).", arr);
if (verbose~"true") {
print arr[1] " = " name
} else {
print arr[1]
}
name = ""
}
}'
chmod a+x /usr/bin/lshdd
Then you can list your hard & dvd drives:lshdd -v
and the output looks like:/dev/sr0 = DVD__RW_TS_L632D
/dev/sdb = WDC_WD50_00AAVS_00ZTB0_D577A3503523_0_0
/dev/sda = SAMSUNG_HM400LI_S1PSJ10Q710844
/dev/sdb = WDC_WD50_00AAVS_00ZTB0_D577A3503523_0_0
/dev/sda = SAMSUNG_HM400LI_S1PSJ10Q710844
You can easily find the partitions of specific drive
fdisk -l /dev/sdb
P.S. It is my first awk script, so it really looks ugly, I know ;-)
Wednesday, June 09, 2010
Fedora startup theme
Федора ползва plymouth за да покаже анимацията по-време на бутването, преди да се е заредло Х-а. Готиното е, че plymouth може да се наглася и да се слагат различни теми ;-)
yum install plymouth-theme*
plymouth-set-default-theme --list
plymouth-set-default-theme solar -R
#plymouth-set-default-theme solar --rebuild-initrd
plymouth-set-default-theme --list
plymouth-set-default-theme solar -R
#plymouth-set-default-theme solar --rebuild-initrd
Sunday, June 06, 2010
Mount-ване на windows shares
sudo mount -t cifs -o username=myuser,password=secret,uid=myuser,gid=mygroup //10.1.52.25/c$ /mnt
Параметри са:
username,password са Windows credential
uid,gid потребителят и групата на owner-а на /mnt
Част от параметрите може и да се пропуснат:
sudo mount -t cifs -o username=myuser,uid=myuser //10.1.52.25/c$ /mnt
Nautilus address bar
Nautilus може да показва пътят до файла като бутони или като стринг. По подразбиране се ползват бутони. За да се промени тази настройка трябва да се промени стойността на полето (unchecked)
/apps/nautilus/preferences/always_use_location_entry от gconf-editor.
Ако gconf-editor, трябва да се инсталира с yum install gconf-editor*
/apps/nautilus/preferences/always_use_location_entry от gconf-editor.
Ако gconf-editor, трябва да се инсталира с yum install gconf-editor*
Show desktop

След като си инсталирах новата Fedora 13 ми се прииска да си имам любимият Show Desktop бутон, който да показва десктопа. В самата дистрибуция има такъв бутон, но логиката му е странна и не ми харесва - първо първо натискане прави restore all hidden windows, второто натискане hide all windows. Това което на мене ми трябва е: при натискане да показва десктопа.
Ето как става това:
1. yum install wmctrl*
2. Right click on the panel and choose Add to panel > Custom application launcher
3. Type: Application,
Name: Show Desktop
Command: wmctrl -k on
4. choose the icon
5. click OK.
Saturday, May 08, 2010
Инсталиране на Sun JDK на Fedora
1) Сваляте Sun-ското JDK от java.sun.com като bin файл
2) chmod a+x на bin файла и го стартирате
3) копирате съдържанието на разархивираната директория (например jdk1.6.0_20) в /usr/lib/jvm/jdk-1.6.0_20-sun (която трябва да създадете)
4) използвате командата update-alternatives за да добавите новата java
5) update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-1.6.0_20-sun/bin/java 1
6) update-alternatives --config java
и избирате нововъведения път
7) изпълнявате java -version и проверявате дали е правилната java на Sun
2) chmod a+x
3) копирате съдържанието на разархивираната директория (например jdk1.6.0_20) в /usr/lib/jvm/jdk-1.6.0_20-sun (която трябва да създадете)
4) използвате командата update-alternatives за да добавите новата java
5) update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-1.6.0_20-sun/bin/java 1
6) update-alternatives --config java
и избирате нововъведения път
7) изпълнявате java -version и проверявате дали е правилната java на Sun
Friday, August 28, 2009
Как да си направим backup на диска под Линукс
Въпреки, че хардовете в днешно време са доста надеждни (поне на мен лично не ми е горял хард все още), не е зле човек да се потдотви и да си прави бакъпи редовно.
Понеже основната ми машинка която ползвам за SCM, Continuous integration, Issue trackig и т.н. е под линукс, затова реших да си напиша няколко скриптчета с които да си правя бакъпите. Изискванията ми не са кой знае какви - просто трябва да мога да си възтановя SCM и issue tracking даните без загуби и много труд. При евентуален срив и загуба на хард не очаквам да мога да възтановя цялата система. Пък и какъв е смисълът? Така никога няма да седна да инсталирам нова версия на софтуера! Всъщност от тази гледна точка сривовете са даже нещо много полезно... помагат ти да си разчистиш старите данни и боклуци, които са се насъбрали с години, кара те да качиш нови програмки и т.н. :-D Просто трябва да се случват в подходящ момент :-) когато имаш достатъчно време да си сетъпнеш нова система!...
Та да се върнем на въпроса - скриптът за бакъп трябва да може да копира някои директории, да ги архивира и да пази копия на тях. Също така е хубаво да може да се следи и история...случайно, ако се прецакат някакви настройки да могат да се проверят кога са променени, и да се възтановят правилните конфигурации. Та скрипта трябва да може да пази архив на старите бекъпи. В основата на всичко е rsync, която се използва за създаване на самите файлове. За да сработи скрипта трябва да се създаде една директория /etc/backup където са всички конфигурации включително и самият скрипт:
И така този скрипт се ползва по следния начин:
SCOPE_NAME се чете от конфигурационият файл /etc/backup.conf в който се описват кои директории да се копират. Ето и примерен такъв:
Всеки scope си има списък от директории (LIST) и EXCLUDE_FILE в който се описват, коит файлове от тези директории да се пропуснат. Примерен backup.excludes:
Така целият скрипт очаква, че ще има директория /backup (която е добре да моунтната на друг хард диск)
Хубаво е да се направят и cron task-ове които да правят дневен или седмичен бекъп.
Ето няколко примерни такива:
/etc/cron.daily/backup_daily
/etc/cron.weekly/backup_weekly
И така това е целият скрипт. Успех!
~Киро :-)
Many thanks to Michael Klier for his article
Parsing Simple Config Files In Bash
Понеже основната ми машинка която ползвам за SCM, Continuous integration, Issue trackig и т.н. е под линукс, затова реших да си напиша няколко скриптчета с които да си правя бакъпите. Изискванията ми не са кой знае какви - просто трябва да мога да си възтановя SCM и issue tracking даните без загуби и много труд. При евентуален срив и загуба на хард не очаквам да мога да възтановя цялата система. Пък и какъв е смисълът? Така никога няма да седна да инсталирам нова версия на софтуера! Всъщност от тази гледна точка сривовете са даже нещо много полезно... помагат ти да си разчистиш старите данни и боклуци, които са се насъбрали с години, кара те да качиш нови програмки и т.н. :-D Просто трябва да се случват в подходящ момент :-) когато имаш достатъчно време да си сетъпнеш нова система!...
Та да се върнем на въпроса - скриптът за бакъп трябва да може да копира някои директории, да ги архивира и да пази копия на тях. Също така е хубаво да може да се следи и история...случайно, ако се прецакат някакви настройки да могат да се проверят кога са променени, и да се възтановят правилните конфигурации. Та скрипта трябва да може да пази архив на старите бекъпи. В основата на всичко е rsync, която се използва за създаване на самите файлове. За да сработи скрипта трябва да се създаде една директория /etc/backup където са всички конфигурации включително и самият скрипт:
#!/bin/sh
VERBOSE=0
SCOPE=""
CONFIG="/etc/backup/backup.conf"
# Outputs the help message how to use the script
print_help()
{
echo "Usage: backup [-v | --verbose] <-s | --scope>" >&2
echo " -v or --verbose switch verbose mode on" >&2
echo " -s or --scope reads the list of directories to backup for " >&2
echo " the from the /etc/backup.conf " >&2
}
# Parses the passed command line and defines the backup scope, verbose mode, etc.
parse_command_line()
{
PREV_SCOPE=0
for p in "$@"; do
if [ $PREV_SCOPE -eq 1 ]; then
SCOPE=$p
PREV_SCOPE=0
else
if [ '--verbose' == $p -o '-v' == $p ]; then
VERBOSE=1
fi
if [ '--scope' == $p -o '-s' == $p ]; then
PREV_SCOPE=1
fi
fi
done
}
# Outputs message to the console if the verbose mode is selected
print()
{
if [ $VERBOSE -eq 1 ]; then
echo "$1"
fi
}
read_configuration()
{
# @author Michael Klier
match=0
while read line; do
# skip comments
[[ ${line:0:1} == "#" ]] && continue
# skip empty lines
[[ -z "$line" ]] && continue
# still no match? lets check again
if [ $match == 0 ]; then
# do we have an opening tag ?
if [[ ${line:$((${#line}-1))} == "{" ]]; then
# strip "{"
group=${line:0:$((${#line}-1))}
# strip whitespace
group=${group// /}
# do we have a match ?
if [[ "$group" == "$1" ]]; then
match=1
continue
fi
continue
fi
# found closing tag after config was read - exit loop
elif [[ ${line:0} == "}" && $match == 1 ]]; then
break
# got a config line eval it
else
eval $line
fi
done < "$CONFIG"
}
#
#
# The main script starts here
#
#
START_TIME=`date +%s`
# Parse the command line parameters
parse_command_line $@
if [ -z $SCOPE ]; then
print_help
echo $"Please enter the name of the backup scope" >&2
exit 1
fi
# Read LIST variable from the configuration file
read_configuration $SCOPE
# Example how the LIST variable should looks like
# LIST="etc root usr home var"
# Waits at 1 seconds, so if the user starts the script too fast the TIME_STAMP directory will be different
sleep 1
BACKUP_DIR="/backup/$SCOPE"
# Output the configuration information
print "Backup scope: $SCOPE"
print "Backup directory list: $LIST"
print "Exclude file: $EXCLUDE_FILE"
print "Backup dir is $BACKUP_DIR"
# Creates the backup directory
if [ ! -d $BACKUP_DIR ]; then
mkdir $BACKUP_DIR
fi
#
#
# Rotate backups, so we keep only the last 100
#
#
# Maximum number of backups to keep
maxInd=20
# Gets the oldest backup canonical path (it is a symbolic link to a time-stamped tar file)
REAL_PATH=`readlink -f $BACKUP_DIR/b.$maxInd.tar.gz`
# Remove the oldest backup
if [ -e $REAL_PATH ]; then
print "Removing tar file $REAL_PATH"
rm -rf $REAL_PATH
fi
# Remove the symbolic link
rm -rf $BACKUP_DIR/b.$maxInd.tar.gz
# Rotate backups from $ind to $ind+1
for ((ind = $maxInd-1; ind >= 0; ind--)); do
let nextInd=$ind+1
if [ -e $BACKUP_DIR/b.$ind.tar.gz ]; then
print "Rotating $BACKUP_DIR/b.$ind.tar.gz to $BACKUP_DIR/b.$nextInd.tar.gz"
mv $BACKUP_DIR/b.$ind.tar.gz $BACKUP_DIR/b.$nextInd.tar.gz
fi
done
# Delete the first backup (it must already be rotated, but just to be sure that the file doesn't exists)
rm -f $BACKUP_DIR/b.0.tar.gz
# Generate new timestamp for the new backup
TIME_STAMP=`date "+%F_%H-%M-%S"`
# Create the backup folder using the timestamp
mkdir $BACKUP_DIR/$TIME_STAMP
# Backup all files in the backup-list
for d in $LIST; do
print "Backuping /$d/ to $BACKUP_DIR/$TIME_STAMP/$d/"
mkdir -p $BACKUP_DIR/$TIME_STAMP/$d/
if [ $VERBOSE -eq 1 ]; then
rsync -vv -a --delete --exclude-from=$EXCLUDE_FILE /$d/ $BACKUP_DIR/$TIME_STAMP/$d/
else
rsync -a --delete --exclude-from=$EXCLUDE_FILE /$d/ $BACKUP_DIR/$TIME_STAMP/$d/
fi
done
# Go to the backup directory, so we could tar the content
pushd $BACKUP_DIR/$TIME_STAMP > /dev/null
# Archive the entire directory into single tar file
tar -c -z -f $BACKUP_DIR/$TIME_STAMP.tar.gz .
# Restore the current directory
popd > /dev/null
# Remove the backup directory
rm -rf $BACKUP_DIR/$TIME_STAMP
# Create a symbolic link to the directory
ln -s $BACKUP_DIR/$TIME_STAMP.tar.gz $BACKUP_DIR/b.0.tar.gz
FINISH_TIME=`date +%s`
FILE_SIZE=`ls -lrt $BACKUP_DIR/$TIME_STAMP.tar.gz | awk '{print $5}'`
printf "Completed! Execution time: $((FINISH_TIME - START_TIME)) seconds. Backup file size: $FILE_SIZE bytes."
printf "\n"
VERBOSE=0
SCOPE=""
CONFIG="/etc/backup/backup.conf"
# Outputs the help message how to use the script
print_help()
{
echo "Usage: backup [-v | --verbose] <-s | --scope>
echo " -v or --verbose switch verbose mode on" >&2
echo " -s or --scope reads the list of directories to backup for " >&2
echo " the
}
# Parses the passed command line and defines the backup scope, verbose mode, etc.
parse_command_line()
{
PREV_SCOPE=0
for p in "$@"; do
if [ $PREV_SCOPE -eq 1 ]; then
SCOPE=$p
PREV_SCOPE=0
else
if [ '--verbose' == $p -o '-v' == $p ]; then
VERBOSE=1
fi
if [ '--scope' == $p -o '-s' == $p ]; then
PREV_SCOPE=1
fi
fi
done
}
# Outputs message to the console if the verbose mode is selected
print()
{
if [ $VERBOSE -eq 1 ]; then
echo "$1"
fi
}
read_configuration()
{
# @author Michael Klier
match=0
while read line; do
# skip comments
[[ ${line:0:1} == "#" ]] && continue
# skip empty lines
[[ -z "$line" ]] && continue
# still no match? lets check again
if [ $match == 0 ]; then
# do we have an opening tag ?
if [[ ${line:$((${#line}-1))} == "{" ]]; then
# strip "{"
group=${line:0:$((${#line}-1))}
# strip whitespace
group=${group// /}
# do we have a match ?
if [[ "$group" == "$1" ]]; then
match=1
continue
fi
continue
fi
# found closing tag after config was read - exit loop
elif [[ ${line:0} == "}" && $match == 1 ]]; then
break
# got a config line eval it
else
eval $line
fi
done < "$CONFIG"
}
#
#
# The main script starts here
#
#
START_TIME=`date +%s`
# Parse the command line parameters
parse_command_line $@
if [ -z $SCOPE ]; then
print_help
echo $"Please enter the name of the backup scope" >&2
exit 1
fi
# Read LIST variable from the configuration file
read_configuration $SCOPE
# Example how the LIST variable should looks like
# LIST="etc root usr home var"
# Waits at 1 seconds, so if the user starts the script too fast the TIME_STAMP directory will be different
sleep 1
BACKUP_DIR="/backup/$SCOPE"
# Output the configuration information
print "Backup scope: $SCOPE"
print "Backup directory list: $LIST"
print "Exclude file: $EXCLUDE_FILE"
print "Backup dir is $BACKUP_DIR"
# Creates the backup directory
if [ ! -d $BACKUP_DIR ]; then
mkdir $BACKUP_DIR
fi
#
#
# Rotate backups, so we keep only the last 100
#
#
# Maximum number of backups to keep
maxInd=20
# Gets the oldest backup canonical path (it is a symbolic link to a time-stamped tar file)
REAL_PATH=`readlink -f $BACKUP_DIR/b.$maxInd.tar.gz`
# Remove the oldest backup
if [ -e $REAL_PATH ]; then
print "Removing tar file $REAL_PATH"
rm -rf $REAL_PATH
fi
# Remove the symbolic link
rm -rf $BACKUP_DIR/b.$maxInd.tar.gz
# Rotate backups from $ind to $ind+1
for ((ind = $maxInd-1; ind >= 0; ind--)); do
let nextInd=$ind+1
if [ -e $BACKUP_DIR/b.$ind.tar.gz ]; then
print "Rotating $BACKUP_DIR/b.$ind.tar.gz to $BACKUP_DIR/b.$nextInd.tar.gz"
mv $BACKUP_DIR/b.$ind.tar.gz $BACKUP_DIR/b.$nextInd.tar.gz
fi
done
# Delete the first backup (it must already be rotated, but just to be sure that the file doesn't exists)
rm -f $BACKUP_DIR/b.0.tar.gz
# Generate new timestamp for the new backup
TIME_STAMP=`date "+%F_%H-%M-%S"`
# Create the backup folder using the timestamp
mkdir $BACKUP_DIR/$TIME_STAMP
# Backup all files in the backup-list
for d in $LIST; do
print "Backuping /$d/ to $BACKUP_DIR/$TIME_STAMP/$d/"
mkdir -p $BACKUP_DIR/$TIME_STAMP/$d/
if [ $VERBOSE -eq 1 ]; then
rsync -vv -a --delete --exclude-from=$EXCLUDE_FILE /$d/ $BACKUP_DIR/$TIME_STAMP/$d/
else
rsync -a --delete --exclude-from=$EXCLUDE_FILE /$d/ $BACKUP_DIR/$TIME_STAMP/$d/
fi
done
# Go to the backup directory, so we could tar the content
pushd $BACKUP_DIR/$TIME_STAMP > /dev/null
# Archive the entire directory into single tar file
tar -c -z -f $BACKUP_DIR/$TIME_STAMP.tar.gz .
# Restore the current directory
popd > /dev/null
# Remove the backup directory
rm -rf $BACKUP_DIR/$TIME_STAMP
# Create a symbolic link to the directory
ln -s $BACKUP_DIR/$TIME_STAMP.tar.gz $BACKUP_DIR/b.0.tar.gz
FINISH_TIME=`date +%s`
FILE_SIZE=`ls -lrt $BACKUP_DIR/$TIME_STAMP.tar.gz | awk '{print $5}'`
printf "Completed! Execution time: $((FINISH_TIME - START_TIME)) seconds. Backup file size: $FILE_SIZE bytes."
printf "\n"
И така този скрипт се ползва по следния начин:
/etc/backup -s SCOPE_NAME
SCOPE_NAME се чете от конфигурационият файл /etc/backup.conf в който се описват кои директории да се копират. Ето и примерен такъв:
#
# In order to define a new scope of backup items uncomment following lines
#
#
#
# scope_name {
# LIST="etc root usr home var"
# EXCLUDE_FILE="/etc/backup/backup.excludes"
# }
#
# No leading ot trailing / in the directory names.
# The directories are sub directories of the /
weekly {
LIST="etc root usr home var"
EXCLUDE_FILE="/etc/backup/backup.excludes"
}
daily {
LIST="etc usr/red5/conf usr/red5/webapps usr/share/tomcat6/conf usr/share/tomcat6/webapps var/svn var/trac"
EXCLUDE_FILE="/etc/backup/backup.excludes"
}
# In order to define a new scope of backup items uncomment following lines
#
#
#
# scope_name {
# LIST="etc root usr home var"
# EXCLUDE_FILE="/etc/backup/backup.excludes"
# }
#
# No leading ot trailing / in the directory names.
# The directories are sub directories of the /
weekly {
LIST="etc root usr home var"
EXCLUDE_FILE="/etc/backup/backup.excludes"
}
daily {
LIST="etc usr/red5/conf usr/red5/webapps usr/share/tomcat6/conf usr/share/tomcat6/webapps var/svn var/trac"
EXCLUDE_FILE="/etc/backup/backup.excludes"
}
Всеки scope си има списък от директории (LIST) и EXCLUDE_FILE в който се описват, коит файлове от тези директории да се пропуснат. Примерен backup.excludes:
#Excluding subdirs from /usr/
/bin/***
/java/***
/games/***
/kerberos/***
/sbin/***
/libexec/***
/lib/***
/tmp
/tmp/***
/include/***
# Excluding subdirs from /var/
/tmp/***
/bin/***
/java/***
/games/***
/kerberos/***
/sbin/***
/libexec/***
/lib/***
/tmp
/tmp/***
/include/***
# Excluding subdirs from /var/
/tmp/***
Така целият скрипт очаква, че ще има директория /backup (която е добре да моунтната на друг хард диск)
Хубаво е да се направят и cron task-ове които да правят дневен или седмичен бекъп.
Ето няколко примерни такива:
/etc/cron.daily/backup_daily
#!/bin/bash
TIME_STAMP=`date "+%F_%H-%M-%S"`
echo "Starting daily backup $TIME_STAMP" > /var/log/backup/$TIME_STAMP.log
/usr/bin/backup --verbose --scope daily > /var/log/backup/$TIME_STAMP.log 2> /var/log/backup/$TIME_STAMP.err
TIME_STAMP=`date "+%F_%H-%M-%S"`
echo "Starting daily backup $TIME_STAMP" > /var/log/backup/$TIME_STAMP.log
/usr/bin/backup --verbose --scope daily > /var/log/backup/$TIME_STAMP.log 2> /var/log/backup/$TIME_STAMP.err
/etc/cron.weekly/backup_weekly
#!/bin/bash
TIME_STAMP=`date "+%F_%H-%M-%S"`
echo "Starting weekly backup $TIME_STAMP" > /var/log/backup/$TIME_STAMP.log
/usr/bin/backup --verbose --scope weekly > /var/log/backup/$TIME_STAMP.log 2> /var/log/backup/$TIME_STAMP.err
TIME_STAMP=`date "+%F_%H-%M-%S"`
echo "Starting weekly backup $TIME_STAMP" > /var/log/backup/$TIME_STAMP.log
/usr/bin/backup --verbose --scope weekly > /var/log/backup/$TIME_STAMP.log 2> /var/log/backup/$TIME_STAMP.err
И така това е целият скрипт. Успех!
~Киро :-)
Many thanks to Michael Klier for his article
Parsing Simple Config Files In Bash
Friday, January 09, 2009
Red5 service за Линукс
Red5 е едно много хубаво сървърче за флаш. Инсталацията му под Windows е елементарна - има си setup.exe, което прави всичко. Под линукс обаче нещата не са толкова лесни - разархивираш tar файл, слагаш на необходимото място, инсталираш Sun-ска Java и т.н. Има доста форуми по въпроса. Единствения проблем е, ако трябва Red5 да се пуска като service. За Fedora 10 това се прави по следния начин:
1) добавя се един файл /etc/init.d/red5
2) chmod a+rx /etc/init.d/red5
3) съдържанието му е:
4) chkconfig --add red5
5) chkconfig red5 on
6) service red5 start
Ха честито!
1) добавя се един файл /etc/init.d/red5
2) chmod a+rx /etc/init.d/red5
3) съдържанието му е:
#! /bin/sh # # red5 # # chkconfig: - 80 20 # # Author: Kiril Arabadzhiyski # ### BEGIN INIT INFO # Provides: red5 # Required-Start: $network $syslog # Required-Stop: $network $syslog # Default-Start: # Default-Stop: # Description: Red5 - Open Source Flash Server # Short-Description: start and stop red5 ### END INIT INFO # # File location: /etc/init.d/red5 # # RED5_DIR=/usr/red5 test -x $RED5_DIR/red5.sh || exit 5 RED5_USER=red5 RED5_LOG_DIR=/var/log/red5 STDERR_LOG=$RED5_LOG_DIR/stderr.log STDOUT_LOG=$RED5_LOG_DIR/stdout.log if [ -r /lib/lsb/init-functions ]; then . /lib/lsb/init-functions else exit 1 fi function startCmdExec() { su -s /bin/bash -c "${RED5_DIR}/red5.sh >> ${STDOUT_LOG} 2>> ${STDERR_LOG} &" ${RED5_USER} } function stopCmdExec() { su -s /bin/bash -c "${RED5_DIR}/red5-shutdown.sh > /dev/null 2> /dev/null &" ${RED5_USER} } function start() { echo -n "Starting Red5:" cd $RED5_DIR pid="$(pgrep -u ${RED5_USER} -G ${RED5_USER} java)" if [ -z "$pid" ]; then startCmdExec sleep 2 pid="$(pgrep -u ${RED5_USER} -G ${RED5_USER} java)" fi if [ -n "$pid" ]; then log_success_msg else log_failure_msg fi } function stop() { echo -n "Stopping Red5:" echo -n " " cd $RED5_DIR stopCmdExec sleep 5 pid="$(pgrep -u ${RED5_USER} -G ${RED5_USER} java)" if [ -z "$pid" ]; then log_success_msg else log_failure_msg fi } function killIt() { echo -n "Killing Red5:" echo -n " " su -s /bin/bash -c "killall -q -u ${RED5_USER} java" ${RED5_USER} sleep 2 pid="$(pgrep -u ${RED5_USER} -G ${RED5_USER} java)" if [ -z "$pid" ]; then log_success_msg else log_failure_msg fi } function status() { pid="$(pgrep -u ${RED5_USER} -G ${RED5_USER} java)" if [ -n "$pid" ]; then echo "Red5 (pid ${pid}) is running..." RETVAL="0" else echo "Red5 is stopped" fi } function restart() { stop pid="$(pgrep -u ${RED5_USER} -G ${RED5_USER} java)" if [ -n "$pid" ]; then killIt fi start } case "$1" in start) start ;; stop) stop ;; kill) killIt ;; restart) restart ;; status) status ;; esac |
4) chkconfig --add red5
5) chkconfig red5 on
6) service red5 start
Ха честито!
Monday, March 03, 2008
Nero Direct show filters
Както всички знаем Nero беше една много добра програмка за печене на дискове. Клоючовата дума тук е беше. Незнам какво си мислят момчетата от Nero AG, но тази програмка стана твърде enterprise. Имат включени разни DirectShow филтри който създават един милион проблеми. Ето и един лесен начин да бъдат изключени - един batch файл който трябва да бъде стартиран.
@echo Unregistering nero burning rom filters
cd \Program Files\Common Files\Ahead\DSFilter
regsvr32 /u NDParser.ax
regsvr32 /u NeAudio.ax
regsvr32 /u NeFileSrc.ax
regsvr32 /u NeQTDec.ax
regsvr32 /u NeRender.ax
regsvr32 /u NeVideo.ax
@echo Unregistering nero burning rom filters
cd \Program Files\Common Files\Ahead\DSFilter
regsvr32 /u NDParser.ax
regsvr32 /u NeAudio.ax
regsvr32 /u NeFileSrc.ax
regsvr32 /u NeQTDec.ax
regsvr32 /u NeRender.ax
regsvr32 /u NeVideo.ax
Monday, February 18, 2008
Windows service
Незнам дали на някого му се е налагало да ползва windows services или още повече да подава на съответния сървис command line parameters, но това си е голяма главоблъсканица.
Интересното е, че има някакъв key HKLM\SYSTEM\CurrentControlSet\Services\service_name\Parameters който не е ясно за какво е..но определено не е за command line параметрите. Истинските command line параметрите се подават от
HKLM\SYSTEM\CurrentControlSet\Services\service_name и ImagePath = "path_to_exe command_line_parameters "
Най-добрия пример е: HKLM\SYSTEM\CurrentControlSet\Services\EventSystem
За да се изтестват параметрите може да се ползва Service MMC GUI-to, като се щтракне с десния бутон върху сървиса и се появява едно прозорче и отдолу има "Start parameters". Те обаче са само за текущото пускане, и не се запазват.
Интересното е, че има някакъв key HKLM\SYSTEM\CurrentControlSet\Services\service_name
Най-добрия пример е:
За да се изтестват параметрите може да се ползва Service MMC GUI-to, като се щтракне с десния бутон върху сървиса и се появява едно прозорче и отдолу има "Start parameters". Те обаче са само за текущото пускане, и не се запазват.
Monday, July 30, 2007
BEA WebLogic 10 под Fedora
Известно време се мъчих да подкарам Tomcat под Fedora 7..той си работеше ма аз нещо барнах и сега трябва бая да задълбая, за да го оправя. Пък и нещо не ми се занимава :-) Затова реших радикално проблема... взех че качих BEA WebLogic. Честно казано бях потресен колко лесно стана всичко... свалих един 700Mb-тов bin файл и само го пуснах... оправих директорията в която да се инталира и всичко мина като по-вода (next, next,next,next, finish)
Въпреки, че BEA имат официален съпорт само за RedHat linux, явно нямат проблеми продуктите им да работят и под Fedora 7 :-) Още разучавам точно какво инсталирах, ама май ще бъде интересно. Чудя се има ли някаква база отдолу, или е само jee server... нещо ме мързи да чета, както и да е, ще го разгледам по-подробно тия дни, че трябва да пиша и дипломна работа. Може би ще го ползвам за да ми хоства jsp-тата :-)
Направо съм удивен, колко лесно го инсталирах.. бях се подготвил за няколко часова борба с хиляда скрипт хака и разни страни exception-и - все пак бях изтеглил версия за Redhat, а не за Fedora... обаче се оказа че съм приключил за 10 мин. :-) Много се кефя!
Въпреки, че BEA имат официален съпорт само за RedHat linux, явно нямат проблеми продуктите им да работят и под Fedora 7 :-) Още разучавам точно какво инсталирах, ама май ще бъде интересно. Чудя се има ли някаква база отдолу, или е само jee server... нещо ме мързи да чета, както и да е, ще го разгледам по-подробно тия дни, че трябва да пиша и дипломна работа. Може би ще го ползвам за да ми хоства jsp-тата :-)
Направо съм удивен, колко лесно го инсталирах.. бях се подготвил за няколко часова борба с хиляда скрипт хака и разни страни exception-и - все пак бях изтеглил версия за Redhat, а не за Fedora... обаче се оказа че съм приключил за 10 мин. :-) Много се кефя!
Wednesday, June 06, 2007
Fedora 7
Ми освен да попиша малко за моя досег до новата Fedora 7. Общо взето бях може би един от първите които си я свалиха и качиха....даже БГ мирорите още я нямаха та я свалях от някви мирори в Европа...бая чакане си падна. Първите ми впечатления бяха: брех много fancy шаренийка ала бала... Инсталирането беше супер лесно всичко си детектна ок. След това гледам какъв софтуерм има.... и понеже нали съм си лаком реших да инсталирам всичко де що има като цъкалка :-) Е почахак около 2 часа да се download-не всичко за да получа великия всичко обяснвящ надпи...package xxxxx is not verified... Уау! Нали уж от официялния сайт инсталирам...Я един рестарт и да пробвам пак...все пак може да има някъв скрипт който не се е пуснал след първия рестарт веднага след инсталацията...знам ли.. Още 2 часа и пак същата грешка. Явно нещо има...деселектирам проблемния пакет и си мисля това сигурно е нещо недогледано на всеки му се случва....още 2 часа и бамм...същата грешка със друг пакет! Брех м*** му. Нали уж 4 фази на тестване и незнам си кво още. Тоя път не ми се чакаше пак 2 часа за това малко по-малко селектирани пакети и да пробваме пак...почнаха да гърмят един по един ...на 10тия се отказах. Гоогълнах половин час и гледам има няква опция на yum нещо като pgp check или нещо такова...явно тука се крие разковничето...сложих го на 0 в кофигурацията на yum и поне взеха че се инсталираха част от пакетите. Викам си щом на тест пц-то се инстална, да взема да пробвам и на лаптопа...той и е с 6-тицата да взема да го ъпгрейдна...да ама не.....детектна старта инсталация почна да анализира пакетите и каза "package %s ......" debug / restart....еми явно ще си остана със 6тицата.... а пък F8 трябва да има повечко тестване !
Wednesday, May 09, 2007
В дебрите на DirectShow или как да ползваме ISampleGrabber
Днеска за пореден път се сблъсках с добре структурираната и позотворна информация за DirectShow. Целта беше да ползвам ISampleGrabber филтърът за да направя няколко картинки от филмче. Example-и има много за това... обаче тайната как да ги компилираш я няма абсолютно никъде. Проблема е, че освен стандартното PlatformSDK трябва и DirectX SDK заради един header файл. След това обаче се набозват някакви недекларирани макроси и става яко мазало. Грешката която се получава е:
...mmstream.h(332) : error C2061: syntax error : identifier '__RPC__deref_out_opt'"
...mmstream.h(335) : error C2061: syntax error : identifier '__RPC__out'
...mmstream.h(339) : error C2061: syntax error : identifier '__RPC__in_opt'
и така още около 102 пъти :-)
В крайна сметка печелившата комбинация от include-и е следната:
rpcsal.h
dxtrans.h
qedit.h
Първият rpcsal.h е най-важен за тези макроси.
...mmstream.h(332) : error C2061: syntax error : identifier '__RPC__deref_out_opt'"
...mmstream.h(335) : error C2061: syntax error : identifier '__RPC__out'
...mmstream.h(339) : error C2061: syntax error : identifier '__RPC__in_opt'
и така още около 102 пъти :-)
В крайна сметка печелившата комбинация от include-и е следната:
rpcsal.h
dxtrans.h
qedit.h
Първият rpcsal.h е най-важен за тези макроси.
Wednesday, December 27, 2006
Защо Windows Explorer-а зависва
Мда учудващо но факт често ми се случваше да си отворя един explorer и да чакам..чакам..чакам.. докато сепокаже великия прозорец (или поне да се рефрешне). Накрая реших да погледна к'во става, вирус ли, троянец ли кво има все пак... Пуснах си един ethereal и що да видя :-) При всяко отваряне на explorer прозорец се праща по един SYN пакет към порт 1666. Поразгледах малко какви програмки имам инсталирани и по-точно тия които са в контекстното меню (или file extension-ите) и гледам имам едно perforce..което има add / sync и бла бла .. все необходими неща които иначе не мога да достъпна през Windows GUI клиента му :-) Ами решението беше:
regsvr32 /u p4exp
и всичко заспа... сега експлорера е бърз както никога :-)
regsvr32 /u p4exp
и всичко заспа... сега експлорера е бърз както никога :-)
Sunday, December 17, 2006
Microsoft Visual Studio freezes on "Add New Class" wizard
Мда...Понякога и най-хубавите неща зависват...какво да говорим за останалите :-) Както и да е... Проблема възниква когато във Visual Studio-to на един проект дадеш Add new class и се почва едно чакане... В краина сметка wizarda се появява но със доста закъснение. Решението на проблема е описано ето тук:
http://support.microsoft.com/kb/290398
На кратко проблематиката е че MDM s CLSID {0C0A3666-30C9-11D0-8F20-00805F2CD064} няма необходимите permission-и. Решението:
1) ot cmd-то пишете dcomcnfg.exe
2) отваряте DCOM обектите и намирате MDM (ако го няма пак от конзолата mdm.exe /regserver)
3) отваряте properties и Security tab-а click-вате на Use custom permission (навсякъде където може).
4) Добавяте следните user-и
Interactive
System
Administrators
IWAM_<ComputerName>
http://support.microsoft.com/kb/290398
На кратко проблематиката е че MDM s CLSID {0C0A3666-30C9-11D0-8F20-00805F2CD064} няма необходимите permission-и. Решението:
1) ot cmd-то пишете dcomcnfg.exe
2) отваряте DCOM обектите и намирате MDM (ако го няма пак от конзолата mdm.exe /regserver)
3) отваряте properties и Security tab-а click-вате на Use custom permission (навсякъде където може).
4) Добавяте следните user-и
Interactive
System
Administrators
IWAM_<ComputerName>
Subscribe to:
Posts (Atom)
