Это может пригодиться если вы скачали кучу RPM-пакетов из разных мест и хотите автоматически проапдейтить установленные пакеты на новые. Делаем так.
1. Складываем все новые пакеты в папку, например, /root/updates
2. Устанавливаем пакет createrepo
yum install createrepo
3. Запускаем его с указанием нашего каталога с пакетами:
Иногда появляется необходимость сделать для разных подключающихся клиентов разные исходящие IP-адреса. Большая часть настройки такая же как в статье “Установка OpenVPN на Linux“. Покажу лишь отличия в ситуации с двумя клиентами:
В server.conf:
server 10.10.0.0 255.255.0.0
client-config-dir /etc/openvpn/ccd
Перед установкой вам может понадобиться php-devel, autoconf. Тогда просто ставим их через yum
yum install php-devel
yum install autoconf
cd /usr/local/src
mkdir eAccelerator
cd eAccelerator
wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2
tar -xvjf eaccelerator-0.9.6.tar.bz2
cd eaccelerator-0.9.6
export PHP_PREFIX="/usr/local"
$PHP_PREFIX/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config
make
make install
cd /tmp
mkdir eaccelerator
chmod 0777 eaccelerator
Теперь правим php.ini. Например, при установленных ZendOptimizer, ionCube и eAccelerator он должен быть примерно таким (порядок подключения модулей важен!):
Где
IPADDR_START – первый IP, который вы хотите добавить
IPADDR_END – последний IP, который вы хотите добавить
CLONENUM_START – число, с которого будет начинаться виртуальный интерфейс, например от eth0:1 до eth0:20
При эксплуатации на сервере Fedora Linux рекомендуется отключать дефолтный NetworkManager и включать используемый по умолчанию в CentOS network тогда никаких глюков с добавлением алиасов на интерфейсы и прочим не будет:
chkconfig network on
chkconfig NetworkManager off
service network restart
yum install GeoIP GeoIP-devel
cd /root
wget http://geolite.maxmind.com/download/geoip/api/mod_geoip2/mod_geoip2_1.2.5.tar.gz
tar zxvf mod_geoip2_1.2.5.tar.gz
cd mod_geoip2_1.2.5
apxs -i -a -L/usr/lib -I/usr/include -lGeoIP -c mod_geoip.c
В /etc/httpd/conf/httpd.conf добавляем:
LoadModule geoip_module /usr/lib/apache/mod_geoip.so
GeoIPEnable On
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
/etc/init.d/httpd restart
В случае с FreeBSD:
cd /usr/ports/net/GeoIP && make install
cd /root
wget http://geolite.maxmind.com/download/geoip/api/mod_geoip2/mod_geoip2_1.2.5.tar.gz
tar zxvf mod_geoip2_1.2.5.tar.gz
cd mod_geoip2_1.2.5
apxs -i -a -L/usr/local/lib -I/usr/local/include -lGeoIP -c mod_geoip.c
Иногда, при повышенной сетевой нагрузке из-за большого количества соединений происходит превышение лимита на conntrack соединения. При этом в системном логе появляются сообщения:
Oct 16 21:40:24 my-host kernel: ip_conntrack: table full, dropping packet.
Oct 16 21:40:29 my-host kernel: printk: 817 messages suppressed.
Посмотрим какое ограничение у нас прописано сейчас:
Преимущество aptitude над apt состоит в том, что она лучше справляется с обработкой зависимостей и рекомендуется разработчиками Debian в качестве основного средства для управления пакетами.
Если вы раньше пользовались утилитами apt, то можете просто начать пользоваться aptitude, в большинстве случаев это не вызовет никаких проблем.
Справка по ключам:
install – Установить/обновить пакеты
remove – Удалить пакеты
purge – Удалить пакеты и их файлы конфигурации
hold – Зафиксировать пакеты
unhold – Отменить команду hold для пакета
markauto – Пометить пакет, что он был установлен автоматически
unmarkauto – Пометить пакет, что он был установлен вручную
forbid-version – Запретить aptitude обновлять определённую версию пакета.
update – Загрузить список новых/обновлённых пакетов
safe-upgrade – Perform a safe upgrade
full-upgrade – Perform an upgrade, possibly installing and removing packages
forget-new – Забыть, какие пакеты “новые”
search – Поиск пакета по имени и/или выражению
show – Показать подробную информацию о пакете
clean – Удалить загруженные файлы пакетов
autoclean – Удалить старые загруженные файлы пакетов
changelog – Посмотреть changelog пакета
download – Загрузить файл .deb для пакета
reinstall – Загрузить и (возможно) переустановить уже установленный пакет
Параметры:
-h Этот текст помощи
-s Имитировать действия, но не выполнять их на самом деле.
-d Только загрузить пакеты, ничего не устанавливать и не удалять.
-P Всегда спрашивать подтверждение или действия
-y Предполагать ответ ‘yes’ на простой вопрос yes/no
-F format Задать формат отображения результатов поиска; смотрите руководство
-O order Задать формат сортировки результатов поиска; смотрите руководство
-w width Задать ширину вывода результатов поиска
-f Принудительно исправлять неработоспособные пакеты.
-V Показывать версию устанавливаемых пакетов.
-D Показывать зависимости автоматически изменяемых пакетов.
-Z Показывать изменение размера установки каждого пакета.
-v Отображать дополнительную информацию. (может быть введено несколько раз)
-t [release] Задать выпуск, из которого должны быть установлены пакеты
-q Не выводить индикатор прогресса в режиме командной строки.
-o key=val Вручную установить значение параметра настройки с именем ‘key’
–with(out)-recommends Указать, будут ли рекомендуемые пакеты
трактоваться как строгие зависимости
-S fname Читать aptitude информацию о расширенном статусе из fname.
-u Загрузить список новых пакетов при запуске.
-i Запустить установку при запуске.
После выполнения, например, aptitude search package_name в левой колонке можно увидеть два ряда статусов:
Значения основного статуса следующие:
i (от installed) – пакет установлен в системе:
p (от purge) – пакет не был установлен или был удален “вчистую”
c (от clean) – пакет, удаленный с сохранением конфигурационных файлов;
v (от virtual) – т.н. виртуальные пакеты, то есть просто списки реальных пакетов, один из которых будет использоваться в той или иной ситуации.
Дополнительный статус пакета может принимать такие значения:
A (от Auto) – пакет был установлен не самостоятельно, а автоматически, как зависимость другого пакета;
h (от hold) – для пакета зафиксирована его текущая версия, то есть он не будет обновляться при выполнении операторов upgrade и dist-upgrade (см. ниже);
u (от unpacked) – пакет был получен, распакован, но не инкорпорирован в файловую систему и не сконфигурирован;
C (от half-Configured) – пакет, установка которого оборвалась на стадии конфигурирования;
H (от Half-installed) – пакет, установка которого оборвалась на стадии инсталляции;
B (от Broken) – т.н. “сломанные” пакеты – то есть содержащие ошибки внутри себя или утратившие свои зависимости.
Скрипт может создавать локальный архив из указанных каталогов, с указанными исключениями; архив mysql-баз. Может закачивать их на указанный FTP-сервер. Автоматически удаляет старые архивные копии (два варианта правил). Есть поддержка полного и инкрементального бэкапов. Работает под FreeBSD и Linux. Есть шифрование архивов и отправка уведомления о результатах на электронную почту.
Текст всех файлов ниже. Возможно удобнее будет скачатьархив: файл backup.sh
#!/bin/sh
# Kiloservers.com sample backup script
# Last changes from: 23-07-2009
# Global backup tasks
mysql="YES" # need backup mysql bases? YES || NO
filebackup="YES" # need perform backup local files? YES || NO
savelocalbackup="YES" # need save backup on local drive? YES || NO
uploadbackup="YES" # need upload backup to FTP server? YES || NO
encryptbackup="NO" # need encrypt backup? YES || NO. If "YES" setup "encryptkey".
emailresult="YES" # need send e-mail with the results of backup? YES || NO. If "YES" setup "emailforresult".
# Common parametrs
backuptype="full" # 'full' or 'incremental'-files changed after last full backup
scriptdir="/etc/backup-complect" # homedir of this script
backupdir="/home/backup" # where save local backup
incfile="incfile" # file/dirs include to backup. Change content of this file
exfile="exfile" # file/dirs exclude from backup. Change content of this file
minfreespace="5000" # Minimal free space on backup slice in MB to start backup
encryptkey="" # Secret key to encrypt backup. Min 10 symbols recommended. Make sure that this key is kept in a safe place!
gpgpath="/usr/local/bin/" # path to gpg program
ftppath="/usr/bin/" # path to ftp client program
emailforresult="" # e-mail for backup results
sendmailpath="/usr/sbin/" # path to sendmail program
# SQL settings
sqluser="root"
sqlpass=""
sqlhost="localhost"
allbases="YES" # 'YES' or 'NO'. Backup all bases or only from 'backupsqlbases' parametr
backupsqlbases="mysql" # bases list separate by space
mysqlutilspath="/usr/local/bin/" # path to 'mysql' and 'mysqldump' folder. No need to change.
sqldef="--single-transaction --skip-add-locks --skip-disable-keys --force" # parametrs for mysqldump
#######################
##### just do it! #####
#######################
salt=`< /dev/urandom tr -dc A-Za-z0-9 | head -c8` # random string for more secure ftp uploads
freespace=`df -m $backupdir | grep dev | awk '{print $4}'` # current free space on backupdir slice
hostn=`hostname`
backupstartdate=`date "+%Y-%m-%d %H:%M %Z%n"`
# check to exist backupdir
if [ ! -d $backupdir ]; then
echo "$backupdir backupdir is no exist! Backup canceled."
exit
fi
# check to exist mysql/mysqldump program
if [ $mysql = YES ]; then
if [ ! -f $mysqlutilspath"/mysql" ]; then
mysqlutilspath="/usr/bin/"
if [ ! -f $mysqlutilspath"/mysqldump" ]; then
echo "mysqldump program is not exist on this path $mysqlutilspath ! Backup canceled."
exit
fi
fi
fi
# check to email setup
if [ $emailresult = YES ]; then
if [ $emailforresult = "" ]; then
echo "You should setup emailforresult parametr. Backup canceled."
exit
fi
if [ ! -f $sendmailpath"/sendmail" ]; then
echo "You should setup sendmail before. Backup canceled."
exit
fi
fi
# check to exist ftp client program
if [ $uploadbackup = YES ]; then
if [ ! -f $ftppath"/ftp" ]; then
ftppath="/usr/local/bin/"
if [ ! -f $ftppath"/ftp" ]; then
echo "FTP client program is not exist on this path $ftppath ! Backup canceled."
echo "To install ftp client on CentOS/RHEL:"
echo "yum install ftp"
exit
fi
fi
# remove old ftp logs
if [ -f $scriptdir"/ftpdump.txt" ]; then
rm $scriptdir"/ftpdump.txt"
fi
fi
# check to free space on backupdir
if [ $minfreespace -ge $freespace ]; then
echo "Free space not enought! Backup canceled."
exit
fi
# check gpg and secret key
gpgext=""
if [ $encryptbackup = YES ]; then
if [ $encryptkey = "" ]; then
echo "You must install the encryption key. Exit."
exit
fi
if [ ! -f $gpgpath"/gpg" ]; then
gpgpath="/usr/bin/"
if [ ! -f $gpgpath"/gpg" ]; then
echo "GnuPG v.1 is not found. You must setup path to GnuPG v.1 in gpgpath or setup GnuPG v.1."
echo "To setup GnuPG v.1 on FreeBSD use:"
echo "pkg_add -r gnupg1"
echo "or"
echo "cd /usr/ports/security/gnupg1 && make install"
echo ""
echo "To setup GnuPG v.1 on CentOS/RHEL use:"
echo "yum install gnupg"
echo ""
echo "Backup canceled."
exit
fi
fi
gpgext=".gpg"
fi
# check OS
checkos=`uname -a | grep -c "FreeBSD"`
# if FreeBSD
if [ $checkos = "1" ]; then
newerparam=" --newer-mtime-than "$scriptdir"/metka"
fi
# if Linux
if [ $checkos = "0" ]; then
newerparam=" --newer "$scriptdir"/metka"
fi
# get list of all mysql bases
if [ $mysql = YES ]; then
echo "Get MySQL databases list"
if [ $allbases = YES ]; then
backupsqlbases=`echo "show databases"|$mysqlutilspath'mysql' --user=$sqluser --password=$sqlpass --host=$sqlhost|grep -v "^D"`
fi
fi
# create remote current day folder
if [ $uploadbackup = YES ]; then
echo "Create remote current day folder"
ftp -i -n $ftphost 2>&1 1>>$scriptdir/ftpdump.txt <<END_SCRIPT
quote USER $ftpuser
quote PASS $ftppass
mkdir /$curdate
quit
END_SCRIPT
fi
if [ ! -d $backupdir"/"$curdate ]; then
echo "Creating "$backupdir"/"$curdate
mkdir $backupdir"/"$curdate
chmod 777 $backupdir"/"$curdate
fi
cd $backupdir"/"$curdate
# create and upload mysql bases backup
if [ $mysql = YES ]; then
echo "Begin export databases"
for base in $backupsqlbases
do
$mysqlutilspath'mysqldump' $sqldef --user=$sqluser --password=$sqlpass --host=$sqlhost $base > $backupdir/$curdate/$base.sql
done
# get filesize
if [ $checkos = "1" ]; then
sqlbackupfilesize=`stat -f %z $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz`
else
sqlbackupfilesize=`stat -c %s $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz`
fi
if [ $encryptbackup = YES ]; then
echo "Begin encrypt databases archive"
# get filesize for gpg files
if [ $checkos = "1" ]; then
sqlbackupfilesizegpg=`stat -f %z $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext`
else
sqlbackupfilesizegpg=`stat -c %s $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext`
fi
fi
if [ $uploadbackup = YES ]; then
echo "Begin upload databases archive"
ftp -i -n $ftphost 2>&1 1>>$scriptdir/ftpdump.txt <<END_SCRIPT
quote USER $ftpuser
quote PASS $ftppass
binary
put $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext /$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext
quit
END_SCRIPT
fi
if [ $savelocalbackup = NO ]; then
echo "Remove local copy databases archive"
rm $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz
rm $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext
fi
fi
# create and upload file backup
if [ $filebackup = YES ]; then
echo "Begin compress files archive"
# get filesize
if [ $checkos = "1" ]; then
filebackupfilesize=`stat -f %z $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz`
else
filebackupfilesize=`stat -c %s $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz`
fi
if [ $encryptbackup = YES ]; then
echo "Begin encrypt files archive"
# get filesize for gpg files
if [ $checkos = "1" ]; then
filebackupfilesizegpg=`stat -f %z $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext`
else
filebackupfilesizegpg=`stat -c %s $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext`
fi
fi
if [ $uploadbackup = YES ]; then
echo "Begin upload files archive"
ftp -i -n $ftphost 2>&1 1>>$scriptdir/ftpdump.txt <<END_SCRIPT
quote USER $ftpuser
quote PASS $ftppass
binary
put $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext /$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext
quit
END_SCRIPT
fi
if [ $savelocalbackup = NO ]; then
echo "Begin remove local copy files archive"
rm $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz
rm $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext
fi
fi
# update special file for incremental backup
touch $scriptdir/metka
backupenddate=`date "+%Y-%m-%d %H:%M %Z%n"`
# send result e-mail
if [ -f $backupdir/report ]; then
rm $backupdir/report
fi
if [ $emailresult = YES ]; then
echo "Send a e-mail with the results"
echo "After backup free space on "$backupdir" - "`df -m $backupdir | grep dev | awk '{print $4}'`" MB" >> $backupdir/report
if [ $filebackup = YES ]; then
echo "Current file backup - "$filebackupfilesize" bytes - "$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz >> $backupdir/report
if [ $encryptbackup = YES ]; then
echo "Current encrypted file backup - "$filebackupfilesizegpg" bytes - "$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext >> $backupdir/report
fi
fi
if [ $mysql = YES ]; then
echo "Current mysql backup - "$sqlbackupfilesize" bytes - "$hostn-sql-backup-$curdatewithhours-$salt.tar.gz >> $backupdir/report
if [ $encryptbackup = YES ]; then
echo "Current encrypted mysql backup - "$sqlbackupfilesizegpg" bytes - "$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext >> $backupdir/report
fi
fi
if [ $uploadbackup = YES ]; then
echo "Error during ftp upload: " >> $backupdir/report
cat $scriptdir"/ftpdump.txt" >> $backupdir/report
fi
echo "
Local backup folder statistics:" >> $backupdir/report
if [ $checkos = "1" ]; then
du -hc -d 1 $backupdir >> $backupdir/report
else
du -hc --max-depth=1 $backupdir >> $backupdir/report
fi
cat $backupdir/report | $sendmailpath"/sendmail" $emailforresult
rm $backupdir/report
fi
1. Copy this folder to /etc/
2. Create "backupdir" folder
3. Edit "incfile" (dirs are included in the backup) and "exfile" (dirs deleted from the backup) files
4. If need - create SQL user for backup and set "mysql" to YES
5. If need - set "encryptbackup" to YES and set encryptkey. To decrypt use "gpg -o output_filename.tar.gz -d encrypted_filename.gpg"
6. Setup "emailforresult"
7. Configure spacer.sh to check the free space
8. Create cron task. For example, for full backup, at first day of month .. and check free space:
###################
5 7 1 * * root /etc/backup-complect/spacer.sh 2> /dev/null
15 7 1 * * root /etc/backup-complect/backup.sh 2> /dev/null
###################
9. Perform the test run:
cd /etc/backup-complect
./backup.sh
IMPORTANT!
Do not forget to do a test restore!
Файл spacer.sh
#!/bin/sh
# Kiloservers free space and count files checker.
# The script deletes old files from "backupdir" until not enough free space
# OR
# deletes old files from "backupdir" until number of files reaches the required
# Last changes from: 23-07-2009
# Settings
mode="space" # work mode: "space" or "count".
minfreespace="5000" # Minimal free space in MB. Actual for "space" mode
count="6" # how many files stored. Actual for "count" mode
backupdir="/home/backup" # directory to check
### Begin ###
echo "Mode $mode active"
# check OS
checkos=`uname -a | grep -c "FreeBSD"`
if [ $mode = "space" ]; then
while [ `df -m $backupdir | grep dev | awk '{print $4}'` -lt $minfreespace ]
do
if [ $checkos = "1" ]; then
filetodelete=`find $backupdir -type f -exec stat -f "%Sm %N" -t %Y%m%d%H%M%S {} \; | sort -n | head -1 | cut -d' ' -f2`
else
filetodelete=`find $backupdir -type f -exec stat -c "%Y %n" {} \; | sort -n | head -1 | cut -d' ' -f2`
fi
if [ -z $filetodelete ]; then
echo "No files found. Exit"
exit
else
rm $filetodelete
echo "Deleted $filetodelete"
fi
done
fi
if [ $mode = "count" ]; then
while [ `find $backupdir -type f | wc -l` -gt $count ]
do
if [ $checkos = "1" ]; then
filetodelete=`find $backupdir -type f -exec stat -f "%Sm %N" -t %Y%m%d%H%M%S {} \; | sort -n | head -1 | cut -d' ' -f2`
else
filetodelete=`find $backupdir -type f -exec stat -c "%Y %n" {} \; | sort -n | head -1 | cut -d' ' -f2`
fi
if [ -z $filetodelete ]; then
echo "No files found. Exit"
exit
else
rm $filetodelete
echo "Deleted $filetodelete"
fi
done
fi