User Tools

Site Tools


Sidebar


Tags Cloud
start

Last updates

Быстрое удаление большого количества файлов

generate files

for i in $(seq 1 1000000); do echo testing >> $i.txt; done

rm

time rm -f *
-bash: /bin/rm: Argument list too long
real    0m11.126s
user    0m9.673s
sys     0m1.278s

find with -exec rm

time find ./ -type f -exec rm {} \;
real    14m51.735s
user    2m24.330s
sys     9m48.743s

find with -delete

time find ./ -type f -delete
real    5m11.937s
user    0m1.259s
sys     0m28.441s

perl

time perl -e 'for(<*>){((stat)[9]<(unlink))}'
real    1m0.488s
user    0m7.023s
sys     0m27.403s

rsync - empty test dir

rsync -a --delete /home/blanktest/ /home/test/
real    2m52.502s
user    0m2.772s
sys     0m32.649s
2015/02/25 21:59 · kyxap

Ключи для запуска clamav

clamscan -ri --detect-pua=yes --scan-mail=yes --phishing-sigs=yes --phishing-scan-urls=yes --heuristic-scan-precedence=yes --algorithmic-detection=yes --scan-pe=yes --scan-elf=yes --scan-ole2=yes --scan-pdf=yes --scan-html=yes --scan-archive=yes --detect-broken=yes --block-encrypted=yes /path/to/dir
2015/02/24 14:18 · kyxap

Использование GRE-туннеля в качестве транспорта для OpenVPN

Задача состояла в разделении точки входа и точки выхода для openvpn.

Entry node Exit node
OS Linux CentOS 6.x FreeBSD 9.x
Service openvpn server none
External IP 88.32.99.91 162.210.201.13
Internal IP 10.254.10.1 10.254.20.1
OpenVPN network 10.254.0.0/16

Скрипт для инициализации GRE-туннеля на Entry node

/opt/scripts/tunnel.sh
#!/usr/bin/env bash
#
#  - create GRE tunnel between two servers
#  - pass all traffic from specified network to GRE tunel
#
 
####### LINUX #######
 
PATH="/bin:/usr/sbin:/usr/bin:/sbin:/usr/local/bin:/usr/local/sbin"
TUNNEL_IF=gre10
VPN_NETWORK=10.254.0.0/16
 
# entry node
LOCAL_ADDR_EXT=162.210.201.13
LOCAL_ADDR_INT=10.254.10.1
 
# exit node
REMOTE_ADDR_EXT=88.32.99.91
REMOTE_ADDR_INT=10.254.20.1
 
#####################
 
# create gre interface
ip tunnel add "$TUNNEL_IF" mode gre local "$LOCAL_ADDR_EXT" remote "$REMOTE_ADDR_EXT" ttl 255
 
# start interface
ip link set "$TUNNEL_IF" up
 
# setup internal address on interface
ip addr add "$LOCAL_ADDR_INT" dev "$TUNNEL_IF"
 
# add route to exit node
route add -net "${REMOTE_ADDR_INT%.*}.0" netmask 255.255.255.0 gw "$LOCAL_ADDR_INT"
 
# create rule for vpn network
ip rule add from $VPN_NETWORK table 10
 
# add default rule for vpn table
ip route add default via "$LOCAL_ADDR_INT" table 10

Скрипт для инициализации GRE-туннеля на Exit node

/opt/scripts/tunnel.sh
#!/usr/bin/env bash
#
#  - create GRE tunnel between two servers
#
 
####### FREEBSD #######
 
PATH="/bin:/usr/sbin:/usr/bin:/sbin:/usr/local/bin:/usr/local/sbin"
TUNNEL_IF=gre10
 
# exit node
LOCAL_ADDR_EXT=88.32.99.91
LOCAL_ADDR_INT=10.254.20.1
 
# entry node
REMOTE_ADDR_EXT=162.210.201.13
REMOTE_ADDR_INT=10.254.10.1
 
#######################
 
# create interface
ifconfig "$TUNNEL_IF" create
 
# setup internal address on interface
ifconfig "$TUNNEL_IF" "$LOCAL_ADDR_INT" "$REMOTE_ADDR_INT" link1
 
# up tunnel
ifconfig "$TUNNEL_IF" tunnel "$LOCAL_ADDR_EXT" "$REMOTE_ADDR_EXT"
 
# add route to entry node
route add -net "${REMOTE_ADDR_INT%.*}" -netmask 255.255.255.0 "$LOCAL_ADDR_INT"

NAT в Packet Filter (pf)

/etc/pf.conf
nat from 10.254.0.0/16 to any -> 162.210.201.13

Конфигурация сервера OpenVPN

/etc/openvpn/openvpn_tcp.conf
local                 88.32.99.91
port                  1194
proto                 tcp
dev                   tun
dh                    /etc/openvpn/ssl/dh1024.pem
ca                    /etc/openvpn/ssl/ca.crt
cert                  /etc/openvpn/ssl/server.crt
key                   /etc/openvpn/ssl/server.key
server                10.254.0.0 255.255.255.0
push                  "dhcp-option DNS 8.8.8.8"
push                  "redirect-gateway def1"
keepalive             10 120
verb                  0
duplicate-cn
comp-lzo
persist-key
persist-tun
/etc/openvpn/openvpn_udp.conf
local                 88.32.99.91
port                  1194
proto                 udp
dev                   tun
dh                    /etc/openvpn/ssl/dh1024.pem
ca                    /etc/openvpn/ssl/ca.crt
cert                  /etc/openvpn/ssl/server.crt
key                   /etc/openvpn/ssl/server.key
server                10.254.1.0 255.255.255.0
push                  "dhcp-option DNS 8.8.8.8"
push                  "redirect-gateway def1"
keepalive             10 120
verb                  0
tun-mtu               1500
fragment              0
mssfix                0
duplicate-cn
comp-lzo
persist-key
persist-tun

Конфигурация клиента OpenVPN

openvpn_client.conf
client
remote                88.32.99.91
rport                 1194
proto                 tcp
dev                   tun
dh                    dh1024.pem
ca                    ca.crt
cert                  client.crt
key                   client.key
verb                  5
comp-lzo
redirect-gateway
comp-noadapt
persist-key
persist-tun
2015/01/22 07:36 · kyxap

Использование RAM-диска в качестве tmpdir для MySQL

[mysqld]
tmpdir=/tmp/mysql

[mysqldump]
tmpdir=/tmp

[client]
tmpdir=/tmp
Инициализация md в FreeBSD
MYSQL_TMPDIR=/tmp/mysql
if ! /bin/df $MYSQL_TMPDIR | grep -q "^/dev/md[0-9]"; then
  mkdir -p $MYSQL_TMPDIR
  mount_mfs -s 1024m -p 0700 -w mysql:mysql -o noexec md5 $MYSQL_TMPDIR
fi
Инициализация tmpfs в Linux
MYSQL_TMPDIR=/tmp/mysql
mkdir -p $MYSQL_TMPDIR
chown mysql:mysql $MYSQL_TMPDIR
mount -t tmpfs -osize=1024m,uid=mysql,gid=mysql,mode=0700,relatime tmpfs $MYSQL_TMPDIR
2014/12/07 19:36 · kyxap

Настройка автоматических извещений о проблемах в SMART

Активация smartd
start_smartd=yes
smartd_opts="--interval=1800"
Отправка алертов

Системные сообщения от различных сервисов удобно слать на алиас.

mailcollector: [email protected]
Установленные диски

/dev/sda и /dev/sdb - типовые WD RE4 4TB накопители.
/dev/sdc - Intel 320 160GB SSD, у которого необходимо отслеживать атрибуты 232 (Available Reserved Space) и 233 (Media Wearout Indicator).

Обновление базы

Набор устройств постоянно модифицируется и дополняется.

# update-smart-drivedb
Конфигурация дисков для smartd
/dev/sda -a -s (S/../../(1|3|5)/01|L/../../6/23) -m mailcollector -M diminishing
/dev/sdb -a -s (S/../../(1|3|5)/01|L/../../6/23) -m mailcollector -M diminishing
/dev/sdc -a -r 233! -R 233! -r 232! -R 232! -s (S/../../(1|3|5)/01|L/../../6/23) -m mailcollector -M diminishing

Пояснение конфигурационного файла:

-a
  эквивалент
              -Hft -l error -l selftest -l selfteststs -C 197 -U 19
   где

    -H              check the SMART health status
    -f              report failures of Usage (rather than Prefail) Attributes
    -t              track changes in both Prefailure and Usage Attributes
    -l error        report increases in the number of ATA errors
    -l selftest     report increases in the number of Self-Test Log errors
    -l selfteststs  report changes of Self-Test execution status
    -C 197          report nonzero values of the current pending sector count
    -U 198          report nonzero values of the offline pending sector count

-s
  задает тип и расписание выполнения диагностических тестов в виде регулярного выражения.

  Например,
            -s (S/../../(1|3|5)/01|L/../../6/23)
   будет выполнять

  Short self-test каждые понедельник, среду, пятницу с 01 до 02 ночи
  Long self-test каждую субботу после 23 вечера

-m user
  указывает системный аккаунт, на который будут высылаться алерты.
  В данном примере mailcollector является алиасом.

-M behaviour
  модифицирует поведение и интенсивность отправки алертов.
  Флаг diminishing активирует регулярную отправку напоминаний,
  однако интервал (в днях) между напоминаниями будет постоянно увеличиваться: 1,2,4,8,16..N.

-r AttributeID[!]
  К normalized value, которое отслеживается по умолчанию, в отчеты добавляется и raw value атрибута.
  Если атрибут отмечен восклицательным знаком, то изменения в normalized value будут расценены как критические события.

-R AttributeID[!]
  Вместо normalized value начинает отслеживаться raw value атрибута.
  Ключ -R автоматически применяет ключ -r, а в отчеты добавляется normalized value.
  Если атрибут отмечен восклицательным знаком, то изменения в raw value будут расценены как критические события.
2014/11/25 18:13 · kyxap

Простейший скрипт бекапа MySQL

#!/usr/bin/env bash
#
# Daily backup mysql databases
# CLI args: none

#exit on error
set -e

LANG=C
PATH="/bin:/usr/sbin:/usr/bin:/sbin:/usr/local/bin:/usr/local/sbin"

DATE=$(date +%F)
BACKUP_DIR=/home/mysql_backups
DUMP_DIR=$BACKUP_DIR/dumps
LOG=$BACKUP_DIR/backup.log

DAYS=7
DB="all"
OPTS="--order-by-primary --add-drop-database"

#########################

print_error() { echo "$@"; write_log "[ERROR] $@"; exit 1; }
print_info()  { echo "$@"; write_log "[INFO] $@"; }
write_log()   { echo "`date -R -u` $@" >> $LOG; }

##########################

# check dir
[[ -d $DUMP_DIR ]] || mkdir -p $DUMP_DIR

# check permissions on backup dir
if PERMS=$(stat --format="%a" $BACKUP_DIR)
then
  # restore chmod
  [[ $PERMS -eq 700 ]] || chmod 700 $BACKUP_DIR
fi

# check binaries
[[ -f `which mysqldump 2>/dev/null` ]] && MYSQLDUMP=mysqldump || print_error "No mysqldump binary found in $PATH"
[[ -f `which mysql 2>/dev/null` ]] && MYSQL=mysql || print_error "No mysql binary found in $PATH"

# validate $DB and skip default dbs
[[ $DB == all ]] && DB=$(mysql -e 'show databases' | tail -n +2 | grep -v -E "^(information_schema|performance_schema)$")

# create dumps
for db in $DB
do
  # is db exist?
  if ! EXISTS=$($MYSQL -s -N -e "show databases" | tail -n +2 | grep -x $db)
  then
    print_info "No such database: $db"
    break
  fi

  DUMP_FILE=$DUMP_DIR/$DATE/$db.sql.gz
  # is dump exist?
  [[ -s $DUMP_FILE ]] || (
    # log
    print_info "Creating new: $DUMP_FILE"

    # mkdir
    mkdir -p $DUMP_DIR/$DATE

    # add --events to mysql db
    [[ $db == mysql ]] && OPTS+=" --events"

    # dump
    $MYSQLDUMP $OPTS $db | gzip -1 > $DUMP_FILE
  )
done

# remove dirs
if OUTDATED_DIRS=$(find $DUMP_DIR -maxdepth 1 -type d -mtime +$DAYS)
then
  for dir in $OUTDATED_DIRS
  do
    # log
    print_info "Deleting outdated: $dir"

    # rm
    [[ -d $dir ]] && rm -r "$dir" || print_error "Can't remove $dir"
  done
fi

2014/09/01 20:40 · kyxap

Преобразование строк/таблиц/колонок

#!/usr/bin/env bash

export LANG=C # must have

# 1-column to tabs-separated multicolumn
cat 1-col.txt | sort | column

# 1-column to spaces-separated multicolumn
cat 1-col.txt | sort | column | expand

# 1-column to string w/delimiter
cat 1-col.txt | sort | paste -sd:

# multicolumn to 1-column
cat multi-col-spaces.txt | xargs -n 1 | sort

# string w/delimiter to 1-column
cat 1-string-delim.txt | tr ':' '\n' | sort
2014/05/18 04:23 · kyxap
start.txt · Last modified: 2016/09/22 01:27 by kyxap