суббота, 1 августа 2020 г.

Меняем порядок загрузки через ipmitool

Как таковой, как поменять порядок загрузки я пока не нашёл. Есть возможность у supermicro просто сдампить текущий конфиг в текстовом виде (через supermicro update manager), потом его поменять, потом залить обратно.

Но я нашёл интересную штуку - можно загрузить сервер в нужный пункт единожды, типа как bootnext в efibootmgr. При этом это должно работать также и для legacy режима загрузки.
Есть нюансы - непонятно пока как выбрать конкретный диск для загрузки, например. Ну и то что это работает только на серверах, потому что на десктопах нет ipmi.

В мануале ipmitool нашёл про эту возможность аж в нескольких местах.

1) ipmitool chassis bootdev
2) ipmitool chassis bootparam - отличается от предыдущей только тем, что параметры с префиксом force_, типа как force_bios, тогда как в предыдущей - просто bios

3) ipmitool mc chassis bootdev <device> опции. Можно например посмотреть ipmitool mc или bmc chassis bootdev
4) ipmitool mc chassis bootparam set <device> опции. Здесь девайсы с префиксом force_, в отличие от предыдущей команды. А ещё есть опции, ассоциированные с  очисткой BMC Boot Valid Bit. можно очищать valid bit при перезагрузке по питанию, по кнопке reset или мягкой перезагрузке, по таймауту, по какому-то PEF. Но и вообще, кто и где смотрит этот value bit не совсем понятно пока. Догадываюсь, что его смотрит прошивка системы при загрузке, и если выставить устройство в bootnext, и наступит какое-то условие, например, перезагрузка по кнопке, то если bootnext был выставлен с соответствующим параметром сброса, то система не будет учитывать это устройство в качестве приоритетной прогрузки. Но я это не проверял.




При выполнении вариантов 3 и 4 было написано  Invalid mc/bmc command: chassis
Видимо, там поехало форматирование. Либо я скосил. Но параметры описаны действительно в четырёх местах. Возможно второй раз - это более подробное уточнение первого. В общем, посмотреть повнимательнее.

Кстати, вот что выдало bootdev none options=help
Legal options settings are:
       help:   print this message
       valid:  Boot flags valid
       persistent:     Changes are persistent for all future boots
       efiboot:        Extensible Firmware Interface Boot (EFI)
       clear-cmos:     CMOS clear
       lockkbd:        Lock Keyboard
       screenblank:    Screen Blank
       lockoutreset:   Lock out Resetbuttons
       lockout_power:  Lock out (power off/sleep request) via Power Button
       verbose=default:        Request quiet BIOS display
       verbose=no:     Request quiet BIOS display
       verbose=yes:    Request verbose BIOS display
       force_pet:      Force progress event traps
       upw_bypass:     User password bypass
       lockout_sleep:  Log Out Sleep Button
       cons_redirect=default:  Console redirection occurs per BIOS configuration setting
       cons_redirect=skip:     Suppress (skip) console redirection if enabled
       cons_redirect=enable:   Suppress (skip) console redirection if enabled

Интересно. Так можно ли всё-таки задать на постоянку свой boot order с опцией persistent?
И в режиме uefi можно загрузиться с опцией efiboot? Попробовал
 chassis bootdev disk options=efiboot
Но эффекта не дало. Всё равно грузится в legacy. Возможно, надо в bios включить uefi.

Еще кстати непонятно, что за request Safe Mode и Force boot from Diagnostic Partition.
Вот тут в комментах https://ma.ttwagner.com/ipmi-trick-set-the-boot-device/ нашёл что можно использовать такие команды: chassis bootparam get 5
В мануале есть вот это:
get <param #>

                                  Get boot parameter. Currently supported values for <param #> are:

                                  0 - Set In Progress

                                  1 - Service Partition Selector

                                  2 - Service Partition Scan

                                  3 - BMC Boot Flag Valid Bit Clearing

                                  4 - Boot Info Acknowledge

                                  5 - Boot Flags

                                  6 - Boot Initiator Info

                                  7 - Boot Initiator Mailbox
Но команда get 2 и get 1 мне ничего про service partition не выдали на supermicro серваке. Unknown было.


понедельник, 27 апреля 2020 г.

Заметки по FreeSync мониторам для Linux

Чтобы включить freesync, монитор должен быть подключен либо к amd карте (интегрированной или встроенной, но поддерживающей этот режим), либо к nvidia серии 10+. Intel пока не поддерживает Freesync.

Свежее сообщение об intel: https://www.dell.com/community/XPS-Desktops/FreeSync-G-Sync-monitors-compatible-with-Intel-UHD-630-video/td-p/7486449 - февраль 2020
https://www.quora.com/What-is-AMD-free-sync-on-monitors-and-does-it-work-with-Intel-NVIDIA - декабрь 2019

> AMDs own workaround for Adaptive Sync over HDMI
Это FreeSync via HDMI. Используется проприетарный протокол AMD. Работает только на windows. В linux в open source драйвер включать не будут. В linux в amdgpu-pro libgl может быть и включат потом. Как отличить эту технологию? Наверное по спецификации монитора: если он заявляет поддержку FreeSync, при этом версия hdmi ниже 1.2, значит это оно.
В общем, непонятно, стоит ли полагаться на будущее этого варианта. Если покупать моник с нуля, то лучше оттклкиваться сразу с hdmi версией 1.2.

>With HDMI 2.1 there will be an official Adaptive Sync alternative over HDMI, called VRR (Variable Refresh Rate).
Это HDMI VRR. Официално пока нет, ждём когда утвердят стандарт.
https://www.phoronix.com/scan.php?page=news_item&px=AMD-FreeSync-2019-Update
But as for the formal HDMI Variable Rate Refresh (VRR) support, they note it's "pending" but held up by a HDMI VRR conformance test suite being released. So hopefully once that CTS is available, HDMI VRR will be flipped on for Linux users wishing to enjoy Adaptive-Sync/VRR functionality for HDMI displays.
Так что пока ждём. На Linux поддерживаться будет.

Что по Display Port VRR?
Как я понял, так же как и в случае с hdmi. Есть решение через проприетарный протокол, а есть стандарт DP supported via Adaptive Sync spec. Как отличить? По идее, версия DP должна быть определённой.

Какие продукты поддерживают технологию AMD FreeSync™?
К совместимым графическим процессорам относятся все видеокарты AMD Radeon™, начиная с серии Radeon™ HD 7000, выпущенной в 2012 году, и все более новые потребительские видеокарты Radeon.

Можно ли использовать технологию AMD FreeSync™ при подключении через HDMI®?
Да, технология FreeSync поддерживает интерфейс HDMI с самого начала. Многие дисплеи с сертификацией FreeSync поддерживали технологии использования переменной частоты обновления экрана по HDMI задолго до появления HDMI 2.1 и принятия стандарта HDMI VRR.  Покупка дисплея с сертификацией FreeSync, поддерживающего FreeSync по HDMI, позволяет использовать преимущества переменной частоты обновления экрана, даже если дисплей не поддерживает стандарт HDMI 2.1.

А также на этой странице https://wiki.archlinux.org/index.php/Variable_refresh_rate есть интересная инфа по редактированию EDID. Там для разгона монитора применяется, но может пригодиться и в других случаях.

четверг, 23 апреля 2020 г.

I have published my script here:
https://github.com/Ashark/supermicro-oob-activate/blob/master/supermicro-oob-activate

But just in case of DMCA takedown, I will publish the code here as a backup:
#!/bin/bash
# supermicro-oob-activate
#
# This script will autogenerate and activate a SFT-OOB-LIC key for your SuperMicro server,
# so you can perform out-of-band bios update with supermicro-update-manager.

# You should get a BMC mac. You can go to the ipmi web page, but it is inconvenient, because you want to make all things in place via your terminal.
# supermicro-update-manager has a function CheckAssetInfo, which will show you the IPMI mac. But unfortunately, you need OOB node product key to be
# already activated for using this function. However, there is another way how you can get it - via ipmitool.

IPMI_HOST=$1
IPMI_USER="ADMIN"
IPMI_PASSWORD_FILE="$HOME/.private/ipmi-pw.txt"

BMC_MAC=$(ipmitool -I lanplus -H $IPMI_HOST -U $IPMI_USER -f $IPMI_PASSWORD_FILE lan print | grep "MAC Address" | sed "s/MAC Address             : //")
# -I lanplus is required for some motherboards. See https://www.supermicro.com/support/faqs/faq.cfm?faq=23196

LIC_KEY=$(echo -n $BMC_MAC | xxd -r -p | openssl dgst -sha1 -mac HMAC -macopt hexkey:8544E3B47ECA58F9583043F8 | awk '{print $2}' | cut -c 1-24  | fold -w4 | paste -sd'-' -)

# echo Checking licence keys before setting licence key:
# supermicro-update-manager --no_banner -i $IPMI_HOST -u $IPMI_USER -f $IPMI_PASSWORD_FILE -c QueryProductKey
echo Setting licence key:
supermicro-update-manager --no_banner -i $IPMI_HOST -u $IPMI_USER -f $IPMI_PASSWORD_FILE -c ActivateProductKey --key $LIC_KEY
# echo Checking licence keys after setting licence key:
# supermicro-update-manager --no_banner -i $IPMI_HOST -u $IPMI_USER -f $IPMI_PASSWORD_FILE -c QueryProductKey


# Usage:
# $ ./supermicro-oob-activate ipmi.yourdomain.com
# Checking licence keys before setting licence key:
# Number of product keys: 0
# Setting licence key:
# Node product key (OOB) is activated for ipmi.yourdomain.com.
# Checking licence keys after setting licence key:
# [0] OOB
# Number of product keys: 1

# Legality:
# This is not explicitly allowed by SuperMicro, but in reality, nobody cares, because nowadays REDFISH allows much of the functionality of SuperMicro update manager for free,
# (including bios update). This thing is only useful for the old generation of servers without REDFISH.
# The algorithm was kindly provided by white hat hacker Peter Kleissner.
# See this if you are interested: https://peterkleissner.com/2018/05/27/reverse-engineering-supermicro-ipmi/

четверг, 19 сентября 2019 г.

Как в конфиге dhcpd вывести значение переменной в лог

Экспериментировал с ISC DHCP. Хотел сделать конфиг для PXE чтобы могли грузиться как машины с BIOS, так и UEFI. Итак, редактируем /etc/dhcpd.conf
Никак не мог понять почему не срабатывает конструкция
; This one line must be outside any bracketed scope
option architecture-type code 93 = unsigned integer 16;

     if option architecture-type = 0 {
         filename "path/to/BIOS/pxelinux.0";
     } elsif option architecture-type = 9 {
         filename "path/to/EFIx64/syslinux.efi";
     } elsif option architecture-type = 7 {
         filename "path/to/EFIx64/syslinux.efi";
     } elsif option architecture-type = 6 {
         filename "path/to/EFIia32/syslinux.efi";
     }

Нашёл её здесь: https://wiki.syslinux.org/wiki/index.php?title=PXELINUX#UEFI

Оказалось, что проблема в том, что надо указывать не option architecture-type = 0, а option architecture-type = 00:00

Перед тем как это понять, мне пришлось узнать как вообще можно вываести значение переменной (или опции) в лог dhcpd.

Например, так:
set test_var = ff:00;

log (error,
  concat ("--->",
    binary-to-ascii(16,16,".",test_var)
  )
);

Потом используя для мониторинга происходящего команду
journalctl -u dhcpd4.service -f
Мы можем увидеть там нашу строку: "--->ff0"

вторник, 10 сентября 2019 г.

Как выставлять hostname на основе mac адреса при загрузке Linux по PXE

У меня есть pxe сервер, который раздаёт Arch Linux по сети. Я его гружу на разных машинах и дальше захожу в них по ssh. Чтобы проще было различать хосты, мне захотелось, чтобы их хостнеймы задавались автоматически из их mac адреса.
Для этого я пересобрал archiso (инструкция), добавив следующие изменения:

Создаём файл archlive/airootfs/etc/systemd/scripts/bootif-hostname:
#!/bin/bash
# example of kernel parameter: BOOTIF=00-01-02-03-04-05-06
eval $(cat /proc/cmdline | grep -o '\bBOOTIF=[^ ]*')
new_hostname="arch-`echo "${BOOTIF: -8}" | tr -d '-'`"
hostnamectl set-hostname "$new_hostname"
и делаем его исполняемым: chmod +x archlive/airootfs/etc/systemd/scripts/bootif-hostname
Создаём файл archlive/airootfs/etc/systemd/system/bootif-hostname.service:
[Unit]
Description=Start with a hostname based on last three octets of mac address of nic, which was used for pxe booting
Wants=network-pre.target
Before=network-pre.target

[Service]
ExecStart=/etc/systemd/scripts/bootif-hostname
Type=oneshot

[Install]
WantedBy=multi-user.target

В archlive/airootfs/root/customize_airootfs.sh вносим:
...
systemctl enable ... sshd.service bootif-hostname.service

На pxe сервере используется pxelinux. Он автоматически добавляет параметрам ядра BOOTIF=00-01-02-03-04-05-06. Я правда не пойму, откуда берётся самый первый октет.

P.S. чтобы зайти на хосты по ssh, надо либо создать пароль для рута и разрешить руту логиниться по ssh, либо создать отдельного пользователя. Я не стал загромождать статью этими изменениями.

Вот и всё. Теперь, когда мы загружаем ArchLinux по сети, в качестве имени хоста мы видим вот такую строку: arch-040506, которая формируется из трёх последних октетов mac адреса сетевой карты, которая была использована при загрузке машины.

суббота, 7 сентября 2019 г.

sendEmail - отправка копии письма нескольким адресатам - workaround

Расскажу о небольшой проблеме при использовании sendemail (в Arch Linux - sendEmail).
Мне нужно было отправить письмо, кроме основного, ещё и нескольким другим адресатам. Для этого я использовал опцию -cc.
Почему-то man страницы sendemail в системе нет. Но зато есть обычный help. Он показывается если вызвать sendEmail без параметров. Так вот, там есть такое описание:
    -cc ADDRESS [ADDR ...]
Т.е. вроде бы как можно указывать адресатов через пробел. Но у меня так не получилось. Письмо уходило только первому из перечисленных адресов.
Я пробовал и заключать адреса в треугольные скобки, и прописывать их через запятую, и в кавычках - никак не работало: программа жаловалась что адреса некорректные.

В конце концов нашёл рабочее решение - можно использовать опцию -cc несколько раз. То есть например так:

$ sendEmail \
    -f "$NAME_SURNAME <username@domain.com>" \
    -u "$SUBJECT" \
    -t "$MAIN_RECIEVERS" -cc "$CC_RECIEVER1" -cc "$CC_RECIEVER2" \
    -s "$SERVER_AND_PORT" \
    -o tls=yes \
    -o message-charset=utf-8 \
    -xu "username@domain.com" \
    -xp "******" \
    -o message-content-type=html \

    -m "$MAILBODY"

Я нигде не нашёл инструкции что так можно делать. Просто случайно добился рабочего результата. Поэтому решил зафиксировать это в данной заметке - вдруг кому-то ещё пригодится.
Версия sendEmail - sendEmail-1.56 (тоже со страницы help).

среда, 13 февраля 2019 г.

Особенности установки Ubuntu 18.04.1 server



Canonical предоставляет несколько вариантов iso образов LTS дистрибутивов для x86_64 (на февраль 2019):
ubuntu-18.04.1-live-server-amd64.iso - с новым установщиком (Subiquity)
ubuntu-18.04.1-server-amd64.iso - с альтернативным установщиком (Ubiquity)

Новый установщик имеет шероховатости, есть отрепорченные баги, ждём фиксов. Создатели дистрибутива говорят: "If you require advanced networking and storage features such as; LVM, RAID, multipath, vlans, bonds, or re-using existing partitions, you will want to continue to use the alternate installer."

Новый установщик

Если используем Subiquity, то имеем в виду (опять же, на февраль 2019):
стиль разметки будет всегда gpt, вне зависимости от режима загрузки
нужно будет создать раздел на накопителе для /boot. Это должен быть именно раздел на накопителе, sw raid пока не поддерживается. Наблюдаем здесь: https://bugs.launchpad.net/subiquity/+bug/1785332
установщик умеет работать в обоих режимах загрузки.
в режиме bios будет автоматом создан bios_grub
в режиме uefi будет автоматом создан esp

Чтобы загрузиться в режиме uefi на платформах supermicro, жмём F11 при старте платформы, выбираем наш загрузочный носитель, перед которым есть надпись "UEFI:". Лучшего решения пока нет.

Старый установщик

Если используем Ubiquity: этот установщик при партиционировании будет использовать gpt только на накопителях емкостью более 2tb. Как его заставить использовать gpt при напопителях меньшего размера не разбирался, может есть какой-то параметр. Если кто-то знает, подскажите.

В VirtualBox cоздать из gui такие накопители невозможно. Для создания используем команду:
vboxmanage createhd --filename 3TB_storage.vdi --size 3000000 --format VDI --variant Standard
Ubiquity автоматом bios_grub раздел не создаёт (в отличие от sibuiquity), поэтому нужно создать его вручную (выставляем Use as как Reserved BIOS boot area). Если этого не сделать, то получим ошибку на этапе установки загрузчика (Unable to install grub).

Раздел этот должен быть в пределах первых двух терабайт. (Это по логике. Я вот в virtualbox сделал его дальше 2.7Тб, и система грузилась нормально. Это очень странно, надо дальнейшие эксперименты провести и выяснить почему так. На реальном железе не проверял).

bios_grub разделы нужно сделать на всех накопителях, потому что так хочет инсталлер. Иначе он вывалится с критической ошибкой при попытке установить grub на раздел без bios_boot. Размер этого раздела делать более 1Mb не следует, т.к. ёмкость более 1MB всё равно не будет использоваться (туда пишется grub stage 1.5).

За логами можно смотреть на tty4, сам установщик работает на tty1.