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
/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 будут расценены как критические события.
#!/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
#!/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
include='iproute,iputils-ping,lsb-security,bash-completion,build-essential,debian-keyring,debian-archive-keyring,checkinstall,chkconfig,dselect,bzip2,cpio,p7zip,pbzip2,tar,unzip,pigz,zip,gzip,p7zip-full,xz-utils,lzma,lrzip,busybox,coreutils,fakeroot,less,locales,sed,dos2unix,mysqltuner,mytop,sqlite3,diffutils,gcc,gdb,libc6-dev,make,patch,strace,dnsutils,nano,vim,dosfstools,e2fsprogs,ext3grep,extundelete,fuse,lvm2,mdadm,ntfs-3g,parted,perl,python,ruby,uw-mailutils,aria2,arping,bridge-utils,curl,ethtool,fping,hostname,ipcalc,iperf,ipmitool,iproute,lftp,libwww-perl,mtr,netcat,openipmi,rsync,snmp,tcpdump,telnet,wget,whois,xinetd,alien,checkinstall,procps,psmisc,bash,bash-completion,dash,tcsh,zsh,bzr,cvs,git,mercurial,subversion,bc,chkconfig,cron,dmidecode,findutils,hdparm,htop,iotop,lm-sensors,logrotate,lsof,ntp,parallel,pciutils,pwgen,rsyslog,screen,tmux,usbutils,geoip-bin,geoip-database,links,chkrootkit,ebtables,iptables,nmap,rkhunter,unhide,monit,sysstat'
./mkimage-debootstrap.sh pro-manage.net/debian wheezy http://mirrors.linode.com/debian/
docker ps -a | tail -n+2 | awk '{print $1" "$2}' | xargs -n2
docker images | tail -n+2 | awk '{print $1}' | while read i; do docker save $i > $(echo $i | tr '/' '_').tar.gz; done
ls *.tar.gz | xargs -n1 docker load -i
#!/usr/bin/env bash # Usage: $0 with no args set -e PATH="/sbin:/bin:/usr/sbin:/usr/bin:/sbin:$PATH" MAIL_TO='[email protected]' SCRIPTS_DIR=/etc/openvpn/easy-rsa ACCOUNTS_DIR=/etc/openvpn/KEYS ##################################### function error_print { echo "ERROR $1" 1>&2 exit 1; } # read account [[ -z $account ]] && echo -n "Provide account name to add: " || error_print "No account provided" read account [[ -z $account ]] && error_print "No account provided" # cd scripts dir [[ -d $SCRIPTS_DIR ]] && cd $SCRIPTS_DIR || error_print "No such dir $SCRIPTS_DIR" # read vars [[ -f vars ]] && source vars || error_print "No such file vars" echo "Creating cert and key for $account" # build key [[ -x pkitool ]] && ./pkitool $account || error_print "No such file pkitool" # make account dir mkdir -p /etc/openvpn/KEYS/$account # copy account cert & key cp $SCRIPTS_DIR/keys/${account}.crt $SCRIPTS_DIR/keys/${account}.key $ACCOUNTS_DIR/$account/ # copy ca cert and tls key cp $SCRIPTS_DIR/keys/ca.crt $SCRIPTS_DIR/keys/ta.key $ACCOUNTS_DIR/$account/ # generate ovpn config cat > $ACCOUNTS_DIR/$account/${account}.ovpn << EOF client remote SERVER'S.EXTERNAL.IP port 1194 proto tcp dev tun nobind persist-key persist-tun ca ca.crt cert ${account}.crt key ${account}.key tls-auth ta.key 1 cipher BF-CBC #log-append /var/log/ovpn_$account.log EOF # remove old archive if exists [[ -f $ACCOUNTS_DIR/${account}.zip ]] && rm -f $ACCOUNTS_DIR/${account}.zip cd $ACCOUNTS_DIR # creating archive [[ -f `which zip 2>/dev/null` ]] && zip ${account}.zip -r $account # sending email [[ -f `which uuencode 2>/dev/null` ]] && uuencode ${account}.zip ${account}.zip | sendmail $MAIL_TO
Предполагается что AMT изначально активирован через UEFI (CTRL+P при загрузке, все доступные опции в ENABLE), а так же в web-интерфейсе (https, port 16692) используется выделенный IP.
Единственный NIC обслуживает как плату AMT, так и сеть хоста. При этом вы НИКАК не можете получить доступ из хостовой системы к AMT: одно из многочисленных проявлений security модели Intel, которое невозможно обойти.
Включение VNC производится только со стороннего компьютера, через WS-Management API. Для работы с ним я использовал клиент wsmancli, который присутствует в репозитории Ubuntu, но отсутствует в Debian.
К сожалению, по прошествии полугода уже не могу вспомнить ключи, передаваемые MEI CLI для активации http-интерфейса, но могу сказать точно: предоставляемая Intel версия CLI не работает с ядрами от Debian Squeeze/Wheezy, а качество исходников требует множества правок, экспериментов с версиями gcc и веселых упражнений с флагами компилятора.
В целом, активация VNC оказалась несколько нетривиальной задачей, т.к. на поддержку управления новыми версиями контроллера в Linux товарищи из Intel забили где-то в районе 2008-2009 года.
Для Debian Wheezy можно использовать следующий ubuntu-пакет и его зависимости:
Методом вдумчивого изучения документации к SDK AMT, был изготовлен следующий скрипт.
Основным затыком в процессе настройки стал пароль, который визуально соответствовал требованиям безопасности Intel и принимался API без ошибки - но настройки попросту не менялись.
It must be a strong password – exactly eight characters long, containing a capital letter, a lower case letter, a digit, and at least one 7-bit ASCII non alpha-numeric character above 32, (e.g. '!', '$', ';'). Note that “_” is considered alphanumeric. The password cannot contain the characters '"', ',', and ':'.
С описанием использованных параметров можно ознакомиться тут.
#!/usr/bin/env bash CIM=http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2 AMT=http://intel.com/wbem/wscim/1/amt-schema/1 IPS=http://intel.com/wbem/wscim/1/ips-schema/1 # configure parameter HOST=192.168.111.100 # admin password, defined through initial UEFI setup ADMIN_PW=yiexoob8Miup$ # password to access VNC remotely VNC_PW=VaeZ1reu4aizi$ auth="-h $HOST -P 16992 -u admin -p $ADMIN_PW" wsman put $IPS/IPS_KVMRedirectionSettingData $auth -k "SessionTimeout=10" -k "OptInPolicy=false" -k "RFBPassword=$VNC_PW" -k "Is5900PortEnabled=true" -k "RequestedState=2" # DEBUG: track changes #wsman get $IPS/IPS_KVMRedirectionSettingData $auth
Примеры копирования при использовании авторизации по ssh-ключам.
Закрывающий слеш в пути к исходной директории обязателен.
Задание представляет из себя текстовый файл.
lftp -f tasks.lftp
open sftp://root:@192.168.111.83 mirror -c -P10 -R --allow-chown /LOCAL_DIR/ /REMOTE_DIR exit
open sftp://root:@192.168.111.83 mirror -c -P10 --allow-chown /REMOTE_DIR/ /LOCAL_DIR exit
rsync в один поток - ресурсоемкий и медленный процесс.
xargs позволит запустить несколько процессов копирования отдельных директорий, но это скажется на скорости работы дисков.
В целом, использовать для копирования lftp предпочтительнее.
-W отключает просчет checksum --delay-updates выполнять синхронизацию ПОСЛЕ анализа, а не во время -e 'ssh -o "Compression no" -c arcfour' не использовать сжатие данных и минимизировать нагрузку на CPU --only-write-batch=file вместо синхронизации с удаленным сервером готовит бинарный апдейт для развертывания на удаленном сервере. Полезно при большом количестве мелких файлов.
rsync -aHAXv --progress --numeric-ids -e 'ssh -o "Compression no" -c arcfour' --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/media/*,/lost+found} /* [email protected]:/