Oбрывки в скоросшивателе
Клочки бумаги, на которых обычно ведутся записи, имеют обыкновение теряться, если их вовремя не подшить. Мысли на тему линукса, а может и не только его, - чтоб не забыть.
2019-11-29
2017-08-22
Использование снапшотов LVM как точки восстановления
Это вольный перевод найденного в инете комментария. В ubuntu синтаксис немного отличается в части указания названия томов, например не "lvrename lvm root root-old", а "lvrename /dev/lvm/root /dev/lvm/root-old". В остальном все соответствует.
Потребуется
несколько перезагрузок.
Для начала
переименуем оригинальный root во что-то
новое, чтобы дать это имя снапшоту.:
# lvrename lvm root
root-old
# lvcreate -n root
-s lvm/root-old -L 10G
Перезагрузимся,
чтобы «новый» root смонтировался и мы
могли произвести изменения. После этого
мы можем их протестировать, а также
вернуться к старой системе.
# lvrename lvm root
root-new
# lvrename lvm
root-old root
# reboot
Если мы хотим
откатить изменения и вернуть все как
было, выполняем (из старой системы)
# lvremove
lvm/root-new
Если мы хотим
применить изменения, выполняем (из
старой истемы)
# lvconvert --merge
lvm/root-new
или из новой
системы
# lvrename lvm root
root-new
# lvconvert --merge
lvm/root-new
# lvrename lvm
root-old root
# reboot
Система
откажется применять изменения на
открытых томах, так что мердж произойдет
во время загрузки.
2017-06-18
Тормозит Lightroom 5, неожиданное решение
Долгое время страдал от диких тормозов в лайтруме. Тормоза были при скроллинге фоток во вьювере, при их обработке - решительно во всех местах лайтрума, причем независимо от размера каталога. В инете можно нагуглить приличное количество решений проблемы - изменение размера кэша Camera RAW, или включение поддержки использования видеокарты (в какой-то версии лайтрума) - но все они мне не помогли.
Совершенно неожиданно проблема таилась в совершенно неожиданном месте - в галочке "Использовать системное сглаживание шрифтов"
Невероятно, но факт - когда-то я видимо зачем-то снял эту галку и забыл о ней, и все это время страдал от тормозов, но после возвращения этой опции назад тормоза улетучились! Что это было - непонятно, но надеюсь кому-то эта галка поможет как и мне =))
Совершенно неожиданно проблема таилась в совершенно неожиданном месте - в галочке "Использовать системное сглаживание шрифтов"
Невероятно, но факт - когда-то я видимо зачем-то снял эту галку и забыл о ней, и все это время страдал от тормозов, но после возвращения этой опции назад тормоза улетучились! Что это было - непонятно, но надеюсь кому-то эта галка поможет как и мне =))
2017-04-13
Как избавиться от вируса EIMG001.exe и NsCpuCNMiner32.exe в большой сети
Если в вашей большой корпоративной сети обнаружилась движуха с сабжевым вирусом, который расползся по компам, проще всего заблокировать его запуск через GPO - это позволит прекратить или как минимум ограничить его распространение.
Для этого нужно иметь под рукой файлы вируса (большой самораспаковывающийся архив EIMG001.exe и файлы самого майнера, которые можно достать из него: NsCpuCNMiner32.exe и NsCpuCNMiner64.exe). Политика запрета будет выглядеть примерно так (кликабельно):
Указаны два варианта: через Software Restriction Policies, или Application Control Policies - оба в целом равноценны. В обоих случаях файлы можно добавлять по имени или по хэшу, предпочтителен второй вариант на случай попыток вируса переименовать исполняемые файлы.
Для этого нужно иметь под рукой файлы вируса (большой самораспаковывающийся архив EIMG001.exe и файлы самого майнера, которые можно достать из него: NsCpuCNMiner32.exe и NsCpuCNMiner64.exe). Политика запрета будет выглядеть примерно так (кликабельно):
Указаны два варианта: через Software Restriction Policies, или Application Control Policies - оба в целом равноценны. В обоих случаях файлы можно добавлять по имени или по хэшу, предпочтителен второй вариант на случай попыток вируса переименовать исполняемые файлы.
2017-02-15
Как перенести Linux с одного mdamd-raid на другой
Сегодня я бы хотел поговорить о такой серьезной с точки зрения надежности вещи, как линуксовый софтварный рейд. А, вернее, показать, как можно спасти систему, которая требует замены дисков, на которых она и была установлена. Я рассмотрю 2 дистрибутива линукса - CentOS 7 и Debian 8 - которые будут поставлены в идентичные исходные условия. Также, так как тема мне кажется достойной лишней наглядности, помимо традиционных скриншотов и текста, в конце я оставлю ссылки на видео, в которых полностью показана вся процедура: от момента установки исходной системы, до восстановления ее работоспособности на новых дисках.
Когда бэкап приготовился, гасим машину и устанавливаем 2 новых харда, которые составят новое зеркало.
Также я использую убунтовый live cd "Boot-Repair" для дальнейших операции, но, собственно, встроенной функцией автоматического восстановления пользоваться не буду. Так что на месте этого диска может быть любой другой Live CD, главное чтобы совпадала архитектура и были доступны утилиты mdadm, chroot, и parted (в моем случае он идет с GUI)
Итак, теперь у нас есть машинка с тремя дисками: половинка бывшего рейда, от которой нам нужен только файл бэкапа; и два новых неотформатированных диска.
После загрузки с лайва, закрываем все выплывающие окошки и открываем редактор разделов. sda1 - бэкап, sdb и sdc - пустые
На дисках sdb и sdc создаем таблицу разделов (Device -> Create Partition Table). Я использую GPT, потому что она подразумевает возможность использования разделов большого объема, а также создает дополнительные сложности для восстановления системы.
Второй раздел нужен для установки загрузчика GRUB2 на GPT. Также необходимо этим разделам добавить флаг. После применения разметки, нужно кликнуть правой мышкой по разделу, выбрать Manage Flags и отметить флаг bios_grub. Это необходимо сделать также на обоих новых дисках.
Теперь, когда разделы подготовлены, открываем терминал и первым делом я устанавливаю mdadm, так как его нет на этом Live CD.
Файлик бэкапа у нас в каталоге /mnt/backup/mnt/, теперь нужно приготовить новый рейд и залить на него бэкап.
С этого момента пути восстановления дебиана и центоси расходятся
Она покажет ID нашего рейда /dev/md1.
Этот ID нужно прописать в /etc/fstab вместо имеющегося там.
Далее выполняем
Собственно всё. Вытаскиваем старые диски, отключаем сидиром, перезагружаемся и видим наш дебиан в целости и сохранности.
Эта команда выдаст ID нашего нового рейда.
Этот ID нужно указать в файлике /etc/default/grub вместо старого
Теперь
Перезагружаемся (один раз система перезагрузится автоматически - это нормально) и радуемся ожившей системе.
Общая часть: приготовление и восстановление бэкапа
В качестве исходной системы у нас Дебиан/Центось, установленные на один ext4-раздел, который зеркалится на 2 физических диска (скриншоты с центоси).
Легким движением руки выдираем один из дисков, создавая деградацию рейда.
Время делать бэкап =)
Конечно лучше если бэкап уже есть, но в нашем простом случае сделать бэкап также легко:
Эта команда создаст сжатую копию всего корня, за исключением трех директорий содержимое которых регенерируется автоматически, и директории /mnt, в которой у нас в данном случае нет ничего, кроме файла бэкапа.tar -czpvf /mnt/backup.tgz --exclude=/dev --exclude=/proc --exclude=/sys --exclude=/mnt /
Когда бэкап приготовился, гасим машину и устанавливаем 2 новых харда, которые составят новое зеркало.
Также я использую убунтовый live cd "Boot-Repair" для дальнейших операции, но, собственно, встроенной функцией автоматического восстановления пользоваться не буду. Так что на месте этого диска может быть любой другой Live CD, главное чтобы совпадала архитектура и были доступны утилиты mdadm, chroot, и parted (в моем случае он идет с GUI)
Итак, теперь у нас есть машинка с тремя дисками: половинка бывшего рейда, от которой нам нужен только файл бэкапа; и два новых неотформатированных диска.
После загрузки с лайва, закрываем все выплывающие окошки и открываем редактор разделов. sda1 - бэкап, sdb и sdc - пустые
На дисках sdb и sdc создаем таблицу разделов (Device -> Create Partition Table). Я использую GPT, потому что она подразумевает возможность использования разделов большого объема, а также создает дополнительные сложности для восстановления системы.
После создания таблицы, на обоих дисках создаем симметричную конфигурацию: 2 неотформатированных раздела - первый большой под систему, второй маленький (я оставил буквально 10 мегабайт в конце диска).
1 2 | sudo bash apt install mdadm |
Так как архив у нас лежит не на простом диске, а диске, который некогда был частью рейда, необходимо этот самый рейд обнаружить.
(Warning! Обратите внимание, что в результате выполнения первой команды, при восстановлении центоси создается устройство /dev/md127, а при восстановлении дебиана - /dev/md0. Нижеследующий блок справедлив для центоси)
(Warning! Обратите внимание, что в результате выполнения первой команды, при восстановлении центоси создается устройство /dev/md127, а при восстановлении дебиана - /dev/md0. Нижеследующий блок справедлив для центоси)
1 2 3 4 5 6 7 | # сканируем систему на наличие рейдов # эта команда создаст устройство, в моем случае /dev/md127 - нашу # половинку зеркала с бэкапом mdadm --assemble --scan # создаем папку /mnt/backup и монтируем в нее найденный рейд mkdir /mnt/backup mount /dev/md127 /mnt/backup |
Файлик бэкапа у нас в каталоге /mnt/backup/mnt/, теперь нужно приготовить новый рейд и залить на него бэкап.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # создаем новое устройство рейда # имя может быть любым незанятым, # например /dev/md1 # --level=1 - зеркало # --raid-devices=2 - 2 диска в рейде mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1 # форматируем новый рейд mkfs.ext4 /dev/md1 # создаем директорию и монтируем рейд в нее mkdir /mnt/root mount /dev/md1 /mnt/root # распаковываем архив tar -xpvf /mnt/backup/mnt/backup.tgz -C /mnt/root/ |
После распаковки нужно чрутнуться в корень восстанавливаемой системы.
1 2 3 4 5 6 7 8 9 10 11 | # создаем недостающие директории mkdir /mnt/root/dev mkdir /mnt/root/proc mkdir /mnt/root/sys mkdir /mnt/root/mnt # к первым трем монтируем рабочие директории лайва mount -o bind /dev/ /mnt/root/dev/ mount -o bind /proc/ /mnt/root/proc/ mount -o bind /sys/ /mnt/root/sys/ # чрутимся chroot /mnt/root/ |
С этого момента пути восстановления дебиана и центоси расходятся
Debian
После чрута выполняем команду
blkid
Она покажет ID нашего рейда /dev/md1.
Этот ID нужно прописать в /etc/fstab вместо имеющегося там.
Далее выполняем
1 2 3 4 5 6 7 8 9 10 | # прописываем в конфиг данные актуального рейда mdadm --detail --scan | grep md1 > /etc/mdadm/mdadm.conf # пересобираем initrd update-initramfs -u # обновляем конфиг загрузчика update-grub2 # устанавливаем загрузчик на оба # физических диска grub-install /dev/sdb grub-install /dev/sdc |
Собственно всё. Вытаскиваем старые диски, отключаем сидиром, перезагружаемся и видим наш дебиан в целости и сохранности.
CentOS
С центосью возни чуть больше, чем с дебианом, но ненамного.
После чрута правим /etc/fstab, заменяя айдишник корня на имя устройства. В нашем случае /dev/md1
(Attention! на картинках ниже везде используется /dev/md0 - не обращайте внимания, просто я его так назвал во время экспериментов с центосью)
(Attention! на картинках ниже везде используется /dev/md0 - не обращайте внимания, просто я его так назвал во время экспериментов с центосью)
После этого правим /etc/dracut.conf, раскомментируем параметр mdadmconf и присвоим ему значение yes.
Далее выполняем
mdadm --detail --scan | grep md1
Эта команда выдаст ID нашего нового рейда.
Этот ID нужно указать в файлике /etc/default/grub вместо старого
Теперь
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # прописываем в конфиг данные актуального рейда mdadm --detail --scan | grep md1 > /etc/mdadm.conf # пересобираем initrd, # смотрим на ВАШ файлик *.img в директории /boot # и меняем версию по аналогии, если она отлична от моей dracut /boot/initramfs-3.10.0-514.el7.x86_64.img 3.10.0-514.el7.x86_64 --force # обновляем конфиг загрузчика grub2-mkconfig -o /boot/grub2/grub.conf # устанавливаем загрузчик на оба # физических диска grub2-install /dev/sdb grub2-install /dev/sdc # создаем специальный файлик, без которого магии не случится touch /.autorelabel |
Перезагружаемся (один раз система перезагрузится автоматически - это нормально) и радуемся ожившей системе.
Вот и сказке конец
Обещанное в начале видео:2017-01-27
Abaqus: Unable to validate FLEXnet server
На днях с коллегой столкнулись с проблемой при установке abaqus, на которую потратили бессовестно много времени. Ошибка возникала при указании сервера лицензий (FlexLM) и в сокращенном виде звучала как "Unable to validate FLEXnet server".
Сервер лицензий при этом исправно работал, пинговался и, в целом, не показывал хоть сколько-нибудь адекватных предпосылок для такого облома. К несчастью выгуглить реальную причину так и не удалось ("Technical details" инсталлятора оказались бесполезны), попытки обновить сервер до последней версии к успеху не привели, а причина оказалась довольно проста. Выяснить ее удалось, установив рядом с абакусом сервер лицензий (но без запуска).
В составе сервера лицензий идет утилита, которая позволяет опрашивать сервера лицензий. Для начала мы стукнулись в сервер по айпишнику.
А потом, добавив в hosts имя сервера лицензий (в нашем случае мы работаем с айпишниками), повторили запрос но уже подставив это имя. И о чудо - утилита выдала в консоль список доступных лицензий.
Оказалось, что FlexLM крайне щепетильно относится к запросам клиентов, и требует чтобы запрос шел или по имени, или по айпишнику, и зависит это от того, что написано в файлике с лицензией! В нашем случае там было указано имя сервера, поэтому при попытке обратиться по IP - сервер считал что спрашивают, возможно, кого-то другого =) Исправить проблему оказалось довольно просто - всего-то нужно поменять имя на IP в первой строке файла лицензий. Можно было бы обращаться к серверу по имени - в большинстве случаев это вообще более правильный подход, но в конкретно нашем случае первый вариант был много проще.
2016-10-28
Как сменить заголовок (dash) стрима на сервисе restream.io с помощью скрипта.
Сервис restream.io позволяет не только разливать стримы на несколько стрим-сервисов, но и централизованно управлять заголовками (дашами, по терминологии твича) на таких сервисах как Twitch или Youtube.
К сожалению разработчики не предоставили никакого апи для этого, так что пришлось заколхозить скрипт, который логинится на сайт и имитирует ручной ввод. Опять таки к сожалению форма ввода даша выполнена на JS, что усложнило заскриптовывание. К счастью, при помощи хромиума и модуля selenium для питона удалось написать скрипт, который делает все что нужно, при том - на безиксовом сервере.
Актуальная версия тут: https://github.com/qiwichupa/restream.io_title_change
К сожалению разработчики не предоставили никакого апи для этого, так что пришлось заколхозить скрипт, который логинится на сайт и имитирует ручной ввод. Опять таки к сожалению форма ввода даша выполнена на JS, что усложнило заскриптовывание. К счастью, при помощи хромиума и модуля selenium для питона удалось написать скрипт, который делает все что нужно, при том - на безиксовом сервере.
Актуальная версия тут: https://github.com/qiwichupa/restream.io_title_change
2016-10-25
Очистка временных папок во всех профилях терминального сервера
Не обязательно терминального и вообще сервера, но скрипт набросал именно для этой задачи. Не самый оптимальный вариант, но решение вышло вполне себе рабочим и надежным.
1 2 3 4 5 6 7 8 9 10 11 12 | Get-ChildItem -Path 'C:\Documents and Settings' -Force ` | foreach { $profilePath = $_.Fullname $path = $profilePath + "\\Local Settings\\Temp\\" Get-ChildItem -Path $path -Force | foreach {$_.FullName Remove-Item $_.FullName -Recurse -Force } $path = $profilePath + "\\Local Settings\\Temporary Internet Files\\" Get-ChildItem -Path $path -Force | foreach {$_.FullName Remove-Item $_.FullName -Recurse -Force } } |
2016-09-12
Proxmox и SMB/CIFS-хранилище
Использую Proxmox дома и столкнулся с неприятной проблемой - при бэкапе относительно больших (несколько гиг) виртуалок на сетевую хранилку (бомжовый QNAP), подключенную по NFS, Proxmox затыкался и повисал вхлам. Вероятно в этом виновата хранилка, возможно, не очень тянущая NFS, может быть в проксмоксе с этим какие-то проблемы, но я решил что пусть оно работает через самбу. Делать перманентное подключение не хотелось, так что я воспользовался autofs, которая неплохо зарекомендовала себя на моем ноуте.
Итак, ставим autofs на сервер проксмокса
aptitude install autofs
Создаем корневую папку для шар
mkdir /mnt/autofs
Редактируем /etc/auto.master, добавляя строку
/mnt/autofs /etc/auto.smb --timeout=300
Рестартим сервис
/etc/init.d/autofs restart
Тут надо сказать что это очень упрощенный подход без использования логина и пароля (моя шара домашняя и открыта для всех), и без указания конкретной шары. После всего проделанного, через корень /mnt/autofs будет доступно все сетевое окружение. Например мой NAS имеет IP 192.168.1.2 и шару Public, и я могу теперь обратиться к ней:
ls /mnt/autofs/192.168.1.2/Public
Далее все просто. Создаем папку для проксмокса
mkdir /mnt/autofs/192.168.1.2/Public/proxmox
Добавляем эту папку в стораджи как локальную директорию.
Такой метод вполне подходит для хранения бэкапов, темплейтов и исошников.
2016-09-08
Бэкап всех баз MySQL с ротацией (удалением старых) бэкапов
Скрипт делает дампы всех БД сервера, сохраняя в папки именованные по дате и времени создания. Сохраняются последние N (переменная $BACKUPS) бэкапов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # Optional variables for a backup script MYSQL_USER="root" MYSQL_PASS="password" BACKUP_ROOT=/var/backups/mysql; BACKUPS=2; BACKUP_DIR="$BACKUP_ROOT/$(date +%Y-%m-%dT%H_%M_%S)"; # Create folders test -d "$BACKUP_DIR" || mkdir -p "$BACKUP_DIR" # Get the database list, exclude information_schema for db in $(mysql -B -s -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' | grep -v information_schema) do # dump each database in a separate file mysqldump -u $MYSQL_USER --password=$MYSQL_PASS "$db" | gzip > "$BACKUP_DIR/$db.sql.gz" done # backup cleanup ls "$BACKUP_ROOT" \ | head -n$(expr $(ls "$BACKUP_ROOT" | wc -l) - $BACKUPS) \ | while read in; do rm -rf "$BACKUP_ROOT/$in"; done |
2016-09-03
Aimp: database disk image is malformed
При возникновении такой ошибки стоит проверить файлы баз данных, которые использует AIMP. Они расположены в папке профиля: %appdata%\AIMP и немногочисленных подпапках.
Файлы баз имеют расширение *.db, проверить их можно утилитами для работы с sqlite, например: SqliteBrowser
Поврежденный файл можно просто удалить, если не удается его восстановить. При этом, конечно, в зависимости от файла может потеряться часть настроек - например обнулится медиатека.
2016-08-03
Поиск живых компьютеров в Active Directory
Скрипт для поиска компов, которые меняли свой внутренний пароль в AD в течение последних трех дней:
Выполнять лучше на контроллере соответствующего домена
Если требуется собрать и свести в один файл информацию о комьютерах из разных доменов, можно использовать такой скрипт
Важно! На контроллерах доменов должна работать служба Active Directory Web Services.
Для контроллеров на Windows 2003, если данная служба не установлена, потребуется установить NET Framework 3.5 SP1, а также патч на фреймворк KB969166 (у микрософта доступен только через общение с саппортом так что выкладываю архив), ну и саму службу
1 2 3 4 5 6 7 8 9 | Import-Module ActiveDirectory $lastCheckDays = 3 $filter = (get-date).AddDays(-$lastCheckDays).ToString("dd/MM/yyyy") get-adcomputer ` -filter "Passwordlastset -gt '$filter'" ` -properties * ` | Select name,passwordlastset,OperatingSystem |
Выполнять лучше на контроллере соответствующего домена
Если требуется собрать и свести в один файл информацию о комьютерах из разных доменов, можно использовать такой скрипт
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | Import-Module ActiveDirectory $tempfile = 'c:\temp\comp.csv.temp' $resultfile = 'c:\temp\comp.csv' function DoDomain($dc) { $lastCheckDays = 30 # Максимум дней с обновления пароля $filter = (get-date).AddDays(-$lastCheckDays).ToString("dd/MM/yyyy") $error.clear() try {Get-ADDomain -server "$dc" | Out-Null } # проверка доступности контроллера catch {"[Error] $dc" } if (!$error){ # если контроллер доступен - понеслась... # Вытаскиваем список живых компов, # экспортируем во временный файл, вырезая заголовки get-adcomputer ` -filter "Passwordlastset -gt '$filter'" ` -server "$dc"` -properties name,CanonicalName,passwordlastset,OperatingSystem ` | Select name,CanonicalName,passwordlastset,OperatingSystem ` | ConvertTo-Csv -NoTypeInformation ` | Select-Object -Skip 1 ` | Out-File "$tempfile" #импортируем временный файл с другими заголовками, $tmp = Import-Csv -Header Name,Domain,Date,OS $tempfile # из поля с указанием домена и OU компьютера вырезаем все кроме домена # для удобства фильтрации по домену например в экселе $tmp | ForEach-Object {$_.Domain = [regex]::replace($_.Domain,'/.*','') } # выбираем добавлять ли заголовок во временный файл. # Добавляем, если результирующий файл еще не был создан и, следовательно # это первый обработанный домен. Записываем временный файл if (Test-Path "$resultfile") { $tmp | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Out-File "$tempfile" } else { $tmp | ConvertTo-Csv -NoTypeInformation | Out-File "$tempfile" } # Добавляем временный файл в конец результирующего [System.IO.File]::ReadAllText("$tempfile") | Out-File "$resultfile" -Append # пробегаемся по результирующему файлу, удаляя пустые строки # (опять же важно для экселя, чтобы первую строку сделать фильром) [System.IO.File]::ReadAllText("$resultfile") -replace '\s+\r\n+', "`r`n" | Out-File "$resultfile" Remove-Item "$tempfile" } } Remove-Item "$resultfile" DoDomain("dc.domain1.local") DoDomain("dc.domain2.local") DoDomain("dc.domain3.local") |
Важно! На контроллерах доменов должна работать служба Active Directory Web Services.
Для контроллеров на Windows 2003, если данная служба не установлена, потребуется установить NET Framework 3.5 SP1, а также патч на фреймворк KB969166 (у микрософта доступен только через общение с саппортом так что выкладываю архив), ну и саму службу
2016-05-21
proxmox: shrink lxc container
Proxmox 4.2
Container: 101
Storage: iSCSI with group "iscsi-lvm-group"
Current size: 20G
Container: 101
Storage: iSCSI with group "iscsi-lvm-group"
Current size: 20G
Needed size: 10G
- BACKUP FIRST!
- Stop VM
lcx-stop -n 101 - Check disk
e2fsck -f /dev/iscsi-lvm-group/vm-101-disk-1
(use tune2fs if "MMP check failed" error, and e2fsck again) - Do your disk little smaller that you want
resize2fs /dev/iscsi-lvm-group/vm-101-disk-1 9G - Reduce LVM size to what you want
lvreduce -L 10G /dev/iscsi-lvm-group/vm-101-disk-1 - Resize your disk without size parameter
resize2fs /dev/iscsi-lvm-group/vm-101-disk-1 - Check disk
e2fsck -f /dev/iscsi-lvm-group/vm-101-disk-1
(use tune2fs if "MMP check failed" error, and e2fsck again) - Edit disk size in container config
vi /etc/pve/lxc/101.conf - Run the container
2016-05-12
Поиск левого DHCP для самых маленьких
Маленькая детективная история, которая началась с того, что у клиентов начали появляться трудности с доступом к сетевым ресурсам. Выяснилось что они получают IP-адреса с какого-от левого источника (да, это можно предотвратить, но что не сделано - то не сделано).
Что делаем:
Что делаем:
- на компе, получившим левый адрес, делаем
ipconfig /all
смотрим IP DHCP-сервера: в моем случае 192.168.1.1, он же шлюз - типичная ситуация "кто-то умный принес домашний роутер".
(Для полноты картины качаем Rogue Checker - утилиту для поиска DHCP-серверов в сети. Полезно для мониторинга ситуации со стороны) - Имея комп с левый адресом пингуем IP DHCP-сервера
ping 192.168.1.1
и дальше
arp -a
последняя команда выдаст MAC-адрес DHCP-сервера - ищем MAC-адрес на свичах, выясняем порт на котором висит "злоумышленник" (я для этого использую богоподобный скрипт port_report.py)
- Если порт подписан и понятно где находится розетка - идем и рассказываем человеку о безопасности на предприятии. Если розетка не подписана - смотрим какие мак-адреса висят на том же порту, если таковые есть - это скорее всего какое-то оборудование предприятия - компы, ip-телефоны и т.д., которые были воткнуты в принесенный роутер.
В моем случае человек принес роутер чтобы к одной розетке подключить несколько компов. При этом использовал его как хаб, таким образом клиентский порт роутера оказался соединен с нашей локалкой, что и вызвало проблемы. К счастью, по засветившимся на порту мак-адресам мы быстро установили какому оборудованию принадлежат маки (спасибо автоматической базе инвентаризации) и на ком это оборудование числится.
2016-05-07
Исправление крестовины (D-Pad) геймпада Retro-bit SNES Gamepad
Для удобства игры на старой Super Famicom прикупил себе пару беспроводных геймпадов Retro-bit (ebay). Нареканий в части беспроводной работы к ним не возникло, но выяснилось, что крестовина (aka directional pad, aka D-Pad) у них самая премерзкая - при нажатии одного из направлений практически неизбежно прожимается одно из смежных. К счастью это оказалось несложно исправить.
2016-04-07
Как убить лишние копии процесса в windows
Потребовалось сотворить костыль, убивающий незавершающиеся копии процесса, на всякий случай оставив последние из запущенных. В моем случае это костыль, но в целом кому-то может и пригодиться, так что выкладываю рецепт на powershell:
Сгенерировано: hilite.me
$processName = "php-cgi" $survivorsCount = 6 $processList = Get-Process -Name $processName $doomedCount = $processList.Count if ($doomedCount -gt $survivorsCount) { $bulletCount = $doomedCount - $survivorsCount $bulletCount $killkillkill = $processList | Select-Object -first $bulletCount | Stop-Process -force }
2016-04-01
Простейший пингер с логированием под bash
Собственно пингуем, ведем лог и это все что надо )
#!/bin/bash if [[ -z "$1" ]]; then echo "Please enter IP, ex.: $0 127.0.0.1" exit else echo "Logfile: /tmp/ping_$1" fi while true do while ! ping -c1 $1 &>/dev/null do echo "Ping Fail - `date`" >> /tmp/ping_$1 done echo "Host Found - `date`" >> /tmp/ping_$1 sleep 1 done
2016-03-08
Как по порядку переименовать файлы, скачанные wget по списку
Решил скачать комикс из вконтакта, полученный список (listfile.txt) для скачивания имел примерно такой вид:
Собственно, после скачивания wget'ом (wget -i listfile.txt) я получил неудобоваримый набор файлов с рандомными названиями, и мне захотелось переименовать их в вид 001.jpg 002.jpg, согласно порядку, в котором они были в исходном файле. Хорошенько попотев, получил такой однострочник:
Или, для читаемости, так:
Немного пояснений:
https://pp.vk.me/c307313/v307313650/1e94/bj560KCwYY4.jpg https://pp.vk.me/c307313/v307313650/1692/yFPMOuXHLvw.jpg ... https://pp.vk.me/c307313/v307313650/1e7b/d-MXTKSZr34.jpg https://pp.vk.me/c307313/v307313650/1e84/Oj_DhH9Fbvw.jpg
Собственно, после скачивания wget'ом (wget -i listfile.txt) я получил неудобоваримый набор файлов с рандомными названиями, и мне захотелось переименовать их в вид 001.jpg 002.jpg, согласно порядку, в котором они были в исходном файле. Хорошенько попотев, получил такой однострочник:
cat ./listfile.txt | tr -d '\r' | while read url; do n=$((n+1)); file="`echo $url| sed -e 's/.*\///'`"; newfile="`printf \"%03d\" $n`"; mv ./"$file" ./"$newfile".jpg ; done |
Или, для читаемости, так:
cat ./listfile.txt | tr -d '\r' | while read url; do n=$((n+1)); file="`echo $url| sed -e 's/.*\///'`"; newfile="`printf \"%03d\" $n`"; mv ./"$file" ./"$newfile".jpg ; done
Немного пояснений:
tr -d '\r' - исходный файл у меня был виндовосформирован, поэтому в каждой строке там был лишний символ перевода коретки, который мешался
while read url - стандартный цикл построчного чтения файла в переменную url
n=$((n+1)) - переменная n для нового имени файлов, которая будет прирастать на единицу
file="`echo $url| sed -e 's/.*\///'`" - старое имя файла, которое получается путем обрезания левой части ссылки
newfile="`printf \"%03d\" $n`" - новое имя файла, которое состоит из переменной n сформатированной в трехсимвольное отображение (1,2,3 -> 001, 002, 003).
file="`echo $url| sed -e 's/.*\///'`" - старое имя файла, которое получается путем обрезания левой части ссылки
newfile="`printf \"%03d\" $n`" - новое имя файла, которое состоит из переменной n сформатированной в трехсимвольное отображение (1,2,3 -> 001, 002, 003).
2016-02-15
Не подключаются мобильные устройства по MTP
Если после установки антивируса касперского к компьютеру перестали подключаться смартфоны, стоит проверить ветку реестра:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{EEC5AD98-8080-425F-922A-DABF3DE3F69A}
Если в ней есть ключи UpperFilters или LowerFilters - удалите их. Массово это можно сделать, проимпортировав политиками reg-файл:
Также в интернете встречаются упоминания о ветках:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000} - наличие фильтров тут может привести к неработоспособности всех юсб-устройств,
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318} - ветка, отвечающая за CD-ROM'ы
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{EEC5AD98-8080-425F-922A-DABF3DE3F69A}
Если в ней есть ключи UpperFilters или LowerFilters - удалите их. Массово это можно сделать, проимпортировав политиками reg-файл:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{EEC5AD98-8080-425F-922A-DABF3DE3F69A}] "UpperFilters"=- "LowerFilters"=-
Также в интернете встречаются упоминания о ветках:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000} - наличие фильтров тут может привести к неработоспособности всех юсб-устройств,
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318} - ветка, отвечающая за CD-ROM'ы
2016-01-26
Подписаться на:
Сообщения (Atom)