Апгрейд Oracle Linux с версии el6 до el7

И вот это долгооткладываемое время настало – пришлось апгрейдить сервер под управлением ОС Oracle Linux 6.5 до 7й версии (на данный момент последняя 7.9).

Сначала необходимо обновить систему до последней версии (репозиторий public yum latest должен быть активным):

yum upgrade -y

В моём случае я получал ошибку [Errno 14] problem making ssl connection при попытке что-либо обновить или установить с репозитория public-yum.oracle.com наподобии этой:

error.JPG

Это произошло из-за того, что пакет openssl в релизе 6.5, который был установлен на сервере, был старой версии и не поддерживает более усиленное шифрование, которое используется в репозитории. Проблему эту решил тем, что подмонтировал диск Oracle Linux 6.10 как репозиторий и обновил пакет opensssl с диска. После этого yum стал нормально заходить на интенет-репозиторий. Образ можно скачать тут: https://edelivery.oracle.com/osdc/faces/SoftwareDelivery

Чтобы сделать локальный диск репозиторием, нужно его примонтировать и добавить repo-файл в /etc/yum.repos.d/local.repo

mount /dev/cdrom /mnt/cdrom
[InstallMedia]
name=DVD for Red Hat Enterprise Linux 7.9 Server
metadata_expire=-1
gpgcheck=1
enabled=1
baseurl=file:///mnt/cdrom/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

Теперь необходимо, чтобы ядро линукс было версии 3 или выше. Версия 2 не поддерживается для обновления. Если необходимо – обновите ядро до версии 3/4/5 и загрузитесь в него. https://docs.oracle.com/cd/E37670_01/E64030/html/ol_upuek2_rn64.html

Проверка версий установленных ядер:

yum list installed kernel

Далее необходимо установить необходимые пакеты, для чего необходимо активировать репозиторий Addons в конфиг-файле по пути /etc/yum.repos.d/public-yum-ol6.repo (название файла может отличаться):

[public_ol6_addons]
name=Oracle Linux $releasever Add ons ($basearch)
baseurl=https://yum.oracle.com/repo/OracleLinux/OL6/addons/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

Изменяем enabled на 1, сохраняем, делаем снова yum update. Если понадобиться, то и yum clean all, затем ставим пакеты:

yum install redhat-upgrade-tool preupgrade-assistant preupgrade-assistant-el6toel7 preupgrade-assistant-el6toel7-data-0 preupgrade-assistant-tools preupgrade-assistant-ui openscap

Для проблемных пакетов можно применять опцию –skip-broken. После этого запускаем утилиту проверки совместимости обновления и ждём окончания её работы:

preupg

Результат её работы будет лежать в виде HTML-оформленного отчета в /root/preupgrade/result.html

Необходимо внимательно просмотреть этот отчёт, в нём будут указаны все проблемы, которые были найдены, рабитые по категориям. Рекомендуется обратить внимание и исправить все проблемы категории Error, Needs Action, Needs Inspection. Некоторые проблемы потребуют проверки после обновления, потому сохраните себе отчёт.

Можно перезапускать проверку сколько угодно раз после применения исправлений, результаты проверок будут лежать в папке /root/preupgrade-results

В моём случае ошибка была только одна – система была настроениа на загрузку EFI и обновление вроде как не поддерживается. Оно поддерживается на самом деле, но нужно быть готовым к тому, что система может не загрузиться сразу. Поэтому в случае, если система настроена на загрузку как UEFI/EFI, а не BIOS/Legacy, то обязательно убедитесь, что у вас есть загрузочный диск Oracle Linux 7 и вы можете с него загрузиться. Это также может быть образ, смонтированный как Vertual media в случае брендовых серверов Dell, IBM, HP.

Запускаем утилиту апгрейда релиза с ключем –force – чтобы обновиться несмотря на ошибку с UEFI, используя заранее скачанный на сервер образ:

redhat-upgrade-tool-cli --iso=OL7_ISO --debuglog=/tmp/upgrade.log --cleanup-post --force

Варианты команды обновления, используя сетевой репозиторий и диск в приводе:

redhat-upgrade-tool-cli --network=7.5 --instrepo=OL7_repo_url --debuglog=/tmp/upgrade.log --cleanup-post

redhat-upgrade-tool-cli --device=/dev/cdrom --debuglog=/tmp/upgrade.log --cleanup-post

Дожидаемся окончания обновления. В моём случае после второй перезагрузки сервер не загрузился. Как я выяснил, в Oracle Linux el6 используется загрузчик grub, а в el7 – grub2. Обновление происходит автоматически для типа загрузки BIOS/Legacy, а вот для UEFI скрипт обновления сломал старый загрузчик, но не установил корректно новый – и система осталась без bootloader’а. Совсем. Даже нет возможности зайти в консоль восстановления.

Вот здесь нам и пригодится скачанный образ/диск Oracle Linux 7.9. Загружаемся с диска и в стартовом меню выбираем Troubleshooting -> Rescue installed system. Ниже показан пример только в случае с CentOS:

Нажимаем Enter и входим в установленную систему с помощью chroot:

chroot /mnt/sysimage

Теперь монтируем установочный диск как репозиторий (если есть доступ в интернет – не нужно), как было описано выше, и удаляем загрузчик совсем чтобы избежать конфликта версий зависимостей (как было у меня):

yum remove grub2

Теперь устанавливаем необходимые пакеты:

yum install grub2 grub2-efi-x64 grub2-efi-x64-modules.noarch grub2-pc grub2-tools grub2-tools-extra 

Если установить не все модули, то будет ошибка:

grub-install: error: /usr/lib/grub/x84_64-efi/modinfo.sh doesn't exist. Please specify --target or --directory.

Теперь устанавливаем бутлоадер, который должен сам прописать пункты загрузки для ядер, установленных в системе:

grub2-install --target=arm64-efi --efi-directory=/boot/efi --bootloader-id=grub2

Возможно придётся сначала создать конфиг для grub командой:

grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

Выходим из chroot и перезагружаемся:

exit
reboot

Система должна успешно загрузиться в релиз 7. Не забываем проверить по отчёту всё ли обновилось хорошо там, где были замечания.

Ссылки:

  1. https://docs.oracle.com/en/operating-systems/oracle-linux/7/install/ol7-upgrade.html
  2. https://alldba.com/upgrade-oracle-linux-ol-6-to-ol-7/
  3. https://unix.stackexchange.com/questions/574170/grub2-install-error-modinfo-sh-missing-common-solutions-attempted
  4. https://community.oracle.com/tech/apps-infra/discussion/4490806/errno-14-problem-making-ssl-connection
  5. https://www.thegeekdiary.com/centos-rhel-7-how-to-reinstall-grub2-from-rescue-mode/
  6. https://docs.oracle.com/cd/E37670_01/E64030/html/ol_upuek2_rn64.html
  7. https://access.redhat.com/solutions/1355683
  8. https://bugzilla.redhat.com/show_bug.cgi?id=1509302
  9. https://docs.fedoraproject.org/en-US/quick-docs/bootloading-with-grub2/

Настройка fail2ban для защиты asterisk 1.4, 1.6, 1.8

К сожалению, в сети интернет множество мамкиных хакеров, пытающихся подобрать логин без пароля или иным способом брутфорсить сервера IP телефонии, имеющие доступ из интернет. Отсеять большинство из них помогает смена внешнего порта со стандартного 5060 на какой-либо другой. Но всё же брутфорс иногда возникает, что немного раздражает и представляет призрачную угрозу.

Оговорюсь, что здесь рассмотрен вариант конфигурации довольно старых версий Asterisk – 1.8 и ниже. Для настройки Asterisk начиная с версии 10 и новее с помощью отдельного файла логирования security, советую посмотреть ссылку [1].

Для блокировки подбора пользователей/паролей для различных сервисов существует демон fail2ban, который после указанного количества ошибочных попыток добавляет правило в iptables на блокировку доступа к серверу вообще для IP адреса нарушителя (на указанное время).

Перед началом настройки необходимо установить iptables и fail2ban, если их ещё нет. Также необходимо настроить iptables так, чтобы был доступ к серверу asterisk извне – отключить или добавить правило для порта asterisk. Если вы читаете эту статью, то у вас уже всё должно быть окей с этим.

Настройка ведения логов asterisk

В первую очередь имеет смысл настроить ведение логов asterisk, чтобы информация сразу же начала собираться в нужном нам формате и виде. Для этого в каталоге конфигурации asterisk (по умолчанию это /etc/asterisk) найдите файл logger.conf и раскомментируйте (уберите точку с запятой в начале строки):

dateformat=%F %T ; ISO 8601 date format

Это нужно для того, чтобы asterisk писал в логи дату в правильном формате:
год-месяц-день часы:минуты:секунды

После этого перезапускаем сервис asterisk:

service asterisk restart

Настройка правил фильтрации

Теперь нам необходимо создать фильтр, который будет извлекать из общего потока сообщений астериска потенциально опасные события (неверный логин/пароль, попытка входа с неразрешенного IP адреса, и т.д. и т.п.). При этом нам необходимо не только обнаруживать такие потенциально опасные события, но и вычленять оттуда IP адрес, с которого было выполнено действие. То есть мы не просто ищем определенные строки в файлах событий астериска, а настраиваем правила фильтрации.
Правила фильтрации можно прописать в файле /etc/fail2ban/filter.d/asterisk.conf

Вот образец содержимого этого файла:

# Fail2Ban configuration file
#
#
# $Revision: 250 $
#

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
#before = common.conf


[Definition]

#_daemon = asterisk

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>\S+)
# Values:  TEXT
#

# Asterisk 1.8 uses Host:Port format which is reflected here

failregex = NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Wrong password
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Username/auth name mismatch
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Device does not match ACL
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Not a local domain
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Peer is not supposed to register
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - ACL error (permit/deny)
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Wrong password
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Username/auth name mismatch
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Device does not match ACL
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Not a local domain
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Peer is not supposed to register
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - ACL error (permit/deny)
            NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>:.*' - No matching peer found
            NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>:.*' - Wrong password
            NOTICE.* .*: No registration for peer '.*' \(from <HOST>\)
            NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
            NOTICE.* .*: Failed to authenticate user .*@<HOST>.*
            NOTICE.* <HOST> failed to authenticate as '.*'$
            NOTICE.* .*: Sending fake auth rejection for device .*\<sip:.*\@<HOST>\>;tag=.*
            NOTICE.* .*: <HOST> tried  to authenticate with nonexistent user '.*'
            VERBOSE.*SIP/<HOST>-.*Received incoming SIP connection from unknown peer

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

В asterisk версии 1.4 и более ранних используются строки типа

“… failed for ” …”

а в asterisk 1.8 и выше – строки

“… failed for ‘:.*’ …”

поскольку начиная с версии asterisk 1.8 в логах появилась информация о номере порта, которой нет в asterisk 1.4. Приведенный выше вариант учитывает как старые, так и новые версии asterisk, так что нет необходимости в нем что-либо менять.

Настройка изоляторов (jails) для fail2ban

Теперь нам необходимо создать описания так называемых “изоляторов” (jails) для fail2ban, т.е. “привязать” наши фильтры к fail2ban: объяснить, в каких файлах эти строки искать, и что потом делать.

Для этого откройте файл /etc/fail2ban/jail.conf

Убедитесь, что нет (или не включено) других правил, связанных с asterisk! Для этого достаточно сделать поиск по файлу по имени “asterisk” (без кавычек) и убедиться, что если такие правила есть, для каждого из них свойство enabled установлено в false или закомментировать решетками все строчки с правилами:

enabled = false

В тексте правила нужно будет указать путь к логу asterisk. По умолчанию в астериске основной файл логов называется messages, но (например) в FreePBX это будет файл под названием full (как называется файл у Вас – см. настройки астериска в файле logger.conf).

Добавляем текст правила в конец файла:

[asterisk-iptables]
# Enable the rule:
enabled  = true
# Name of filter used is asterisk in folder /etc/fail2ban/filter.d:
filter   = asterisk
# Which asterisk file is used to search:
logpath  = /var/log/asterisk/messages
# Max retries allowed:
maxretry = 5
# Action period of time in seconds:
bantime = 86400
# Period of time to search logpath for occurancies:
findtime = 3600
# What to do if there are more occurancies during findtime more than maxretry -
# Ban client's IP address using iptables and send report to admin's e-mail:
action   = iptables-allports[name=ASTERISK, protocol=all]
           sendmail-whois[name=ASTERISK, dest=admin@yourdomain.com, sender=asterisk@yourdomain.com]
# Whitelist:
#ignoreip = 192.168.1.0/24

Перезапускаем fail2ban:

service fail2ban restart

Для проверки, что fail2ban запущен успешно и правило загружено, выполните следующую команду, которая показывает статус нашего нового jail:

fail2ban-client status asterisk-iptables

В случае, если Вы только что установили fail2ban / iptables, не забудьте убедиться, что они настроены у Вас стартовать автоматически при загрузке системы!

Проверка работы fail2ban

Теперь важный этап – проверить, что всё работает так, как задумано и нигде нет ошибки. Для этого нужно использовать третий компьютер, кроме сервера asterisk и вашего, с которого вы заходите. Чтобы не забанить самого себя.

Последовательность действий для проверки работы связки fail2ban + iptables:

  1. Убедитесь, что у Вас настроен запуск iptables и fail2ban при старте компьютера.
  2. Запустите SIP-клиент (обязательно не с самого сервера asterisk или того, с которого вы на него зашли удалённо, а с другого компьютера!), и указав неверное имя пользователя для авторизации (IP адрес или доменное имя сервера asterisk должно быть верным), попробуйте авторизоваться более 5 раз (как указано в параметре maxretry.

В качестве тестового sip клиента можно использовать программу sipsak, которая работает из командной строки Linux:

aptitude install sipsak
sipsak -U -s sip:test1@asterisk_server_IP_or_domainname

получите 5 раз сообщения вроде:

received:
SIP/2.0 403 Forbidden (Bad auth)
...
error: didn't received '200 OK' on register (see above). aborting

И на maxretry+1-й раз:

send failure: Connection refused

А также письмо на указанный e-mail, что сигнализирует о том, что всё настроено верно.

Проверяем также iptables на сервере asterisk:

iptables -L -n

В цепочке правил Chain f2b-ASTERISK (1 references) должен появится IP адрес ПК, с которого запускали клиент sip.

Ссылки:

  1. http://linux.mixed-spb.ru/asterisk/iptables_setup.php
  2. https://voipmagazine.wordpress.com/2014/11/18/sip-stress-testing-part-2-sipsak/

Установка python 2.7 в Oracle Linux 6

Дефолтным пайтоном в системе Oracle Linux 6 является версия 2.6. Проблема в том, что эта версия пайтона уже очень устарела и не поддерживается многими библиотеками и даже pip (который надо устанавливать из репозитория Epel) не хочет работать без сильного колдунства – выдаёт ошибку “ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail.”

Потому, если требуется использование модулей, устанавливаемых с помощью pip, то нужно установить более новый пайтон.

Его можно установить из репозитория Software Collection Library для Oracle Linux 6.10. Похожая процедура и для других RHEL 6 систем вроде CentOS 6, но там названия репозиториев и пути могут отличаться.

Выполняем команду:

yum repolist all

И ищем искомый репозиторий (по-умолчанию он выключен – disabled):

Чтобы его включить, выполняем команду:

yum-config-manager --enable public_ol6_software_collections

После чего устанавливаем нужный пайтон и утилиту для управления софтверными коллекциями:

yum install python27 scl-utils

Как зависимости сразу должны подтянуться pip и прочие необходимые пакеты.

Теперь включим пайтон 2.7 для текущей сессии:

scl enable python27 bash

Эта команда запускает новый баш, где по-умолчанию используется 2.7 пайтон вместо 2.6. И можно выполнять скрипты или команды в интерпретаторе. К сожалению, сделать 2.7й системным проблематично.

Чтобы скрипты, запущенные по cron, работали с 2.7 необходимо сделать нижеизложенное.

В задаче крона нужно прописывать путь к интерпретатору 2.7, а не просто к пайтону:

updatedb
locate python2.7

В моём случае это было /opt/rh/python27/root/usr/bin/python

Далее необходимо обновить путь загрузки библиотек, иначе пайтон 2.7, запускаясь по крону, будет выдавать ошибку “ImportError: libpython2.7.so.1.0: cannot open shared object file: No such file or directory”:

locate libpython2.7.so.1.0

В моём случае папка с библотеками пайтона: /opt/rh/python27/root/usr/lib64

Затем добавить этот путь строчкой в этот файл:

nano /etc/ld.so.conf

И выполнить команду:

ldconfig

Всё, теперь скрипты, запущенные по крон, будут работать с пайтоном 2.7. Ну и конечно же в скрипте необходимо указывать абсолютные пути к файлам или командам (например, если вызываете по subprocess).

Также не советую обновлять pip, если он попросит. Иначе вполне вероятно придётся откатывать pip примерно как описано в [6].

Пример задачи, которая выполняется раз в месяц и логирует вывод консоли вместе с ошибками, если таковые будут, в файл job.log:

0 7 1 * * su user -c "/opt/rh/python27/root/usr/bin/python /home/user/project/script.py" > /home/user/project/job.log 2>&1

Ссылки:

  1. https://stackoverflow.com/questions/20842732/libpython2-7-so-1-0-cannot-open-shared-object-file-no-such-file-or-directory
  2. https://yum.oracle.com/oracle-linux-python.html
  3. https://stackoverflow.com/questions/51646558/unable-to-install-python-packages-using-pip-in-ubuntu-linux-insecureplatformwar/54582701#54582701
  4. https://stackoverflow.com/questions/29134512/insecureplatformwarning-a-true-sslcontext-object-is-not-available-this-prevent
  5. https://access.redhat.com/documentation/en-us/red_hat_software_collections/3/html/packaging_guide/sect-enabling_the_software_collection
  6. https://iamsysadmin.net/2019/01/17/how-to-roll-back-pip/

Python, как сконвертировать файл .csv в .xlsx

Нижеприведённый код для конвертации csv -> xlsx работает на python 2.7. На 2.6 мне не удалось установить openpyxl с помощью pip install openpyxl, а на 3й версии io.open нужно заменить на просто open:

import io
from openpyxl import Workbook
# Convert to XLSX
csvfile = 'path_to_file.csv'
xlsxfile = 'path_to_file.xlsx'
workbook = Workbook(xlsxfile)
worksheet = workbook.add_worksheet()
with io.open(csvfile, 'rt', encoding='utf8') as f:
    reader = csv.reader(f)
    for r, row in enumerate(reader):
        for c, col in enumerate(row):
            worksheet.write(r, c, col)
workbook.close()

Ссылки:

  1. https://stackoverflow.com/questions/17684610/python-convert-csv-to-xlsx
  2. https://openpyxl.readthedocs.io/en/stable/index.html

Debian пропадают правила iptables после перезагрузки

На старом сервере под управлением Debian 6 такая беда была – после перезагрузки все добавленные правила iptables исчезали. Что было не особо удобно.

Дабы это побороть, сначала сохраняем правила в файл (путь и имя могут быть любые):

iptables-save > /root/iptables.conf

Добавляем следующую команду в /etc/rc.local для применения правил после ребута:

iptables-restore < /etc/iptables.conf

Лучше добавить полный путь к команде, узнать который можно с помощью

which iptables-restore

Также можно добавить крон – каждый час восстанавливать правила. А то у меня они почему-то даже без ребута исчезали периодически.

Ссылки:

  1. https://unix.stackexchange.com/questions/52376/why-do-iptables-rules-disappear-when-restarting-my-debian-system

Windows, автоматическое добавление маршрутов при включении VPN.

Если вы заходите на VPN средставами Windows PPTP/L2TP (не CISCO и т. п. сторонними программами), то у вас есть 2 выбора:

  • весь трафик будет идти через VPN
  • только тот, для которого прописаны маршруты.

Первый вариант – по-умолчанию. Но он плох, т. к. если вы скачиваете/загружаете большие объемы информации, то это неплохо грузит маршрутизатор, который раздаёт доступ в VPN (надо шифровать траффик) и увеличивает задержку вашего соединения (пинг).

При втором варианте – нужно при каждом подключени идобавлять маршруты на те подсети, к которым вы хотите иметь доступ, находясь в VPN. Это можно автоматизировать, о чём я и расскажу ниже.

Для начала нужно отключить передачу всего траффика через VPN. Открываем Центр сетей и общего доступа (Networking and sharing center) в Панели Управления и, зайдя в свойства VPN-соединения, отключаем шлюз по-умолчанию:

Disable default gateway

Далее нам надо создать скрипт .netsh, который будет выполняться и добавлять роуты при подключении. Создаём, например, файл C:\scripts\vpn_route.netsh с содержимым:

interface ipv4
add route prefix=192.168.23.0/24 interface="Work_VPN" store=active
add route prefix=172.16.99.0/24 interface="Work_VPN" store=active
exit

где “Work_VPN” – название VPN соединения в Центре управления сетями и общим доступом. Маршрутов может быть сколько угодно, в примере указаны два.

Далее для выполнения всей магии, необходимо создать задачу в Планировщике, которая будет выполняться при подключении. Открываем консоль cmd от администратора и выполняем команду:

schtasks /create /F /TN "VPN Routes Add" /TR "netsh -f C:\scripts\vpn_route.netsh" /SC ONEVENT /EC Application /RL HIGHEST /MO "*[System[(Level=4 or Level=0) and (EventID=20225)]] and *[EventData[Data='Work_VPN']]"

где указываем путь к созданному ранее netsh файлу и снова же имя VPN соединения. Остальное менять не нужно.

Всё.

Ссылки:

  1. https://oxo42.github.io/windows/2015/03/25/windows-add-route-on-vpn-connect

Как изменить настройки сети в VMWare vCenter Server 6.7 (VCSA)

Недавно возникла необходимость поменять шлюз по умолчанию (default gateway) на vCenter Server 6.7.

Сначала зашел в VAMI (vCenter Server Appliance Management Interface): https://<IP>or<FQDN>:5480 на вкладку Networking:

Нажал Edit, открылся мастер настройки сети, ввёл всё, что необходимо и…. и в итоге он ничего не поменял)

Как оказалось, надо было по-другому действовать.

Нужно зайти на VSCA по ssh.

Для начала включим возможность подключения по ssh на вкладке Access:

Не зря же заходили в VAMI. Теперь заходим по ссх и вводим shell

В консоли вводим команду:

/opt/vmware/share/vami/vami_config_net

Выбираем 0, смотрим текущую конфигурацию.

Затем выбираем то, что нужно изменить. В моём случае это пункт 2. Далее в меню всё интуитивно понятно что вводить и нажимать.

Изменения должны сохраниться и после перезагрузки не пропадут.

Ссылки:

  1. https://digitalkungfu.wordpress.com/2015/02/25/how-to-fix-vcsa-ip-settings-from-command-line/
  2. https://communities.vmware.com/t5/vCenter-Server-Discussions/Changing-default-gateway-on-vCenter-Appliance-version-6/td-p/433249

Как переместить файлы Bluestacks (эмулятор Андроид) на другой диск

Недавно возникла необходимость перенести файлы эмулятора ОС Андроид Bleustacks на другой диск. Можно сделать “бекап, переустановка, восстановлени”, но я нашел путь проще – создать ссылку на новое расположение, чтобы “обмануть” старую инсталляцию.

Итак делаем следующие шаги:

  1. Закрываем Bluestacks
  2. Перемещаем файлы например из изначальной папки D:\Programs в новую F:\Program Files\Bluestacks
  3. Открываем консоль (открываем стартовое меню, находим cmd и запускаем от имени администратора, если нужно)
  4. Создаём ссылку:
mklink /D /J D:\Programs\Bluestacks "F:\Program Files\BlueStacks"

Результат:

Junction created for D:\Programs\Bluestacks <<===>> F:\Program Files\BlueStacks

Ссылки:

  1. https://android.stackexchange.com/questions/140598/how-can-i-copy-program-files-bluestacks-folder-to-another-drive
  2. https://www.bluestacks.com/

Linux, команда для траблшутинга загрузки I/O подсистемы

Быстрая заметка. Иногда случается что дисковая I/O подсистема чем-то сильно нагружена и не понятно, каким именно процессом. В определении виновника может помочь следующая команда:

top -b -n 1 | awk '{if (NR <=7) print; else if ($8 == "D") {print; count++} } END {print "Total status D (I/O wait probably): "count}' > topsave.txt

Bluetooth клавиатура для Android.

В общем, приобрел на AliExpress клавиатурку для телефона kemile Russian Language Wireless Bluetooth 3.0 keyboard. Цель была – иметь компактную, но при этом функциональную клавиатуру для путешествий или поездок, которую можно подключить к смартфону на базе ОС Android для работы в консоли, удалённого администрирования и т. п.

Работает через блютуз БЕЗ адаптера.

Клавиатура оказалась довольно приятная при наборе текста – как у ноутбуков.

Питается от двух батареек ААА. Для моих задач это лучше, чем от встроенного аккумулятора. Потому что можно не боятся, что аккумулятор убьётся (китайский же) или разрядится быстро. Вставил две батарейки, которые можно купить где угодно (или аккумуляторы формата ААА) – и работай когда это нужно.

Подключается по блютуз к девайсам на ОС андроид, iOS, Windows.

Но конечно же, как и с большинством китайских девайсов, без танцев с бубном не обошлось. Эти танцы заключались в переключении раскладки клавиатуры. В комментариях к товару было много вариантов, у меня (ОС Андроид 9) заработал следующий:

Чтобы переключать языки надо зайти в настройки устройства и найти там пункт «Язык и ввод». Там найти раздел «Физическая клавиатура» (если клавиатура отключена, он в настройках не появится), а в нем пункт «Выбор раскладки клавиатуры». Нужно отметить русскую и английскую (США) раскладки, после чего можно будет переключать раскладку по нажатию Ctrl + Пробел. 

Из других вариантов, что у меня не заработали: Command (Win) + Пробел

Также должен отметить, что раскладка у меня на телефоне чуть не совпадает. К примеру,

  • клавиша Delete это Backspace на самом деле
  • клавиша ?/ (возле правого шифта) набирает ‘|’, почему-то ‘&’ с зажатым шифтом, а с зажатой кнопкой Fn – долгожданный ‘/’. Это в англ раскладке. В русской печатает то, что написано, плюс ‘.’ с зажатым Fn.
  • значек $ не на 4ке, а на 8ке в англ раскладке. в русской всё норм.

В общем, после выяснения вышесказанного, пользоваться этой клавой приятно и я бы рекомендовал к покупке для телефона, планшета или тв-приставки, тем более что цена приятная.