воскресенье, 7 февраля 2021 г.

Ubuntu: установка на программный raid+uefi

До недавнего времени мне верой и правдой служил компьютер под управлением убунты, купленный в 2010 году и с тех пор не обновлявшийся (только HDD добавил, и память дополнительную вставил, с 2Гб до 6Гб, когда началась эта чехарда с коронавирусом и zoom-ом на удалёнке). Но время не стоит на месте, программы становятся всё требовательнее, да и менеджер пакетов убунты пару лет назад стал сбоить, в общем, пришла пора подумать о замене.

В прожорливые игры я не играю, фильмы в высоком качестве не смотрю, единственное из ресурсоёмких задач - это докер и виртуальные машины. Ну, и квартира маленькая, так что живём мы с этим оборудованием, что называется, бок о бок. Поэтому основными критериями выбора стали такие:
1) отказоустойчивость
2) малошумность
3) сносное быстродействие

Первый критерий привёл к мысли, что нужна материнская плата с RAID на борту, второй - что нужен процессор с низким тепловыделением, а третий - что диски будут SSD. Тут надо признать, что в железе я не разбираюсь совершенно. Поэтому сборка работоспособной машины превратилась в увлекательный квест.

Покопался на сайте одного известного магазина, повыбирал комплектующие на свой вкус, купил, собрал - не работает. Выяснилось, что в современном мире слова "DDR4" и "AM4" гарантируют только, что память и процессор удастся запихнуть в соответствующие слоты, а их работоспособность с данной конкретной материнской платой никто не обещал. К счастью, недостаток знаний удалось отчасти скомпенсировать финансовыми вливаниями, но изучать списки совместимости, искать и докупать на замену пришлось чуть ли не всё.

В итоге я стал счастливым обладателем материнской платы ASRock B450 Pro4, процессора Athlon 200GE, двух плашек ОЗУ A-Data XPG Gammix D10 [AX4U266638G16-SBG] (8+8 ГБ) и двух M.2 SSD A-Data XPG SX6000 Lite [ASX6000LNP-128GT-C] (128+128 ГБ) - для RAID-а. На процессор повесил здоровенный кулер DEEPCOOL REDHAT, вентилятор прицеплять не стал, машина получилась достаточно тихой, с одним вентилятором в блоке питания и непривычно пустым системным блоком в корпусе DEXP DC-101B - ни тебе дисководов, ни сидиромов, ни жестких дисков... Прогресс, однако. Осталось дело за малым - поднять RAID и установить операционную систему.

Первым делом включил raid, покопавшись в настройках материнской платы. К сожалению мануал, рассказывающий о том, как это делается, попался под руку не сразу. А всё оказалось просто - заходим в UEFI Setup Utility и там включаем пару опций:

Boot -> CSM (Compatibility Support Module) -> Disabled
Advanced -> AMD PBS -> NVMe RAID mode -> Enabled
Advanced -> Storage Configuration -> SATA Mode -> RAID
После перезагрузки в UEFI Setup Utility появится дополнительный пункт "RAIDXpert2 Configuration Utility", и там уже можно объединить два диска в массив. Правда, оказалось, что не любые два диска в этом пункте меню видны, и не зря на одном из слотов материнки была наклейка "Ultra M.2". Выяснилось, что и M.2 диски бывают разные, и в слот с этой наклейкой следует пихать тот, у которого есть опция NVMe. Второму M.2 разъёму, правда, не важно, что за диск в него подсунут, с NVMe или без, а вот первый в этом плане привередлив. Так или иначе, с этой проблемой удалось справиться, вот только это не сильно помогло: при установке убунта упорно продолжала видеть мой RAID-массив как два отдельных диска.

Пришлось изучать вопрос дальше, пока в одном из обсуждений попалась ссылка на статью, рассказывающую о разных вариантах реализации RAID. Есть Hardware RAID - когда одновременность чтения-записи на диски обеспечивается на аппаратном уровне, есть Software RAID - когда вся кухня реализована на уровне драйверов операционной системы, и есть Fake RAID - когда операционка вроде бы видит RAID, а на самом деле он реализовывается при помощи программного обеспечения, зашитого в материнскую плату. И, судя по цене материнки, мой случай именено такой. В то же время куча форумов пестрит утверждениями, что под линуксом все эти низкоуровневые RAID не нужны, а пользуйтесь лучше программными RAID-ами, граждане. Поэтому я, скрепя сердце, свой с трудом созданный массив размонтировал:

Boot -> CSM (Compatibility Support Module) -> Disabled
Advanced -> AMD PBS -> NVMe RAID mode -> Disabled
Advanced -> Storage Configuration -> SATA Mode -> AHCI
и приступил к третьей части - установке операционной системы.

Установка операционной системы меня тоже не порадовала. Выяснилось, что установщик моей любимой XUbuntu из коробки RAID не поддерживает, поэтому - либо качайте и ставьте сервер, либо делайте пару дополнительных пассов руками. Кроме того, наступило будущее, и на смену BIOS+MBR пришел UEFI+GPT. В моём случае будущее выразилось в том, что все 128 Гб превратить в RAID-1 не удастся: вышеупомянутая опция "Boot -> CSM (Compatibility Support Module) -> Disabled" приводит к тому, что при загрузке UEFI ищет не MBR, а раздел, носящий имя ESP. Этот раздел размечен fat32 и помечен флагом efi, на нём, собственно, и хранятся инструкции по дальнейшей загрузке операционной системы. При этом обнаружился приятный бонус - оказывается, современные версии линуксового загрузчика GRUB умеют поддерживать в идентичном состоянии несколько ESP, причудливо разбросанных по разным дискам. Поэтому моё первоначальное стремление сделать так:

Disk1: [RAID-1: [ESP...] [всё остальное............] ]
Disk2: [ -"- ........................................]
превратилось в:
Disk1: [ESP...] [RAID-1: [всё остальное............] ]
Disk2: [ESP...] [ -"- ...............................]
И про это самое "всё остальное" следует сказать особо.

В принципе, если массив поднят, можно запускать инсталлятор убунты, разбивать им свободное место на разделы и вообще двигаться дальше. Но под линуксом есть ещё одна полезная прослойка, которая называется LVM. Штука эта, Logical Volume Manager, очень интересная. Результат её действия таков, что логические тома, т.е., "разделы", видимые в файловой системе, на самом деле не являются привычными разделами, в виде единого целого хранящимися на диске, а являются мозаикой, элементы которой собираются из кусочков, раскиданных по разным дискам и прочим устройствам. Эти логические тома допускают, по слухам, большую гибкость в настройке, в частности, их размер можно менять как угодно, расширять за счет добавления в машину новых дисков и т.п. Поэтому итоговая структура дисков моего нового компьютера выглядит так:

Disk1: [ESP...] [RAID-1: [LVM: (Том: /.......) (Том: swap.......) (Том: /home.......) ] ]
Disk2: [ESP...] [ -"- ..................................................................]
ну, или в виде вывода команды lsblk -a:
$ lsblk -a

nvme0n1          259:0    0 119,2G  0 disk         (первый SSD A-Data XPG SX6000 Lite)
├─nvme0n1p1      259:2    0   128M  0 part             (efi раздел)
└─nvme0n1p2      259:3    0 119,1G  0 part             (раздел под всё остальное)
  └─md0            9:0    0 119,1G  0 raid1                (raid массив)
    ├─myVG-rootv 253:0    0    40G  0 lvm   /                  (логический том)
    ├─myVG-swapv 253:1    0    16G  0 lvm   [SWAP]             (логический том)
    └─myVG-homev 253:2    0  63,1G  0 lvm   /home              (логический том)

nvme1n1          259:1    0 119,2G  0 disk         (второй SSD A-Data XPG SX6000 Lite)
├─nvme1n1p1      259:4    0   128M  0 part             (efi раздел)
└─nvme1n1p2      259:5    0 119,1G  0 part             (раздел под всё остальное)
  └─md0            9:0    0 119,1G  0 raid1                (raid массив)
    ├─myVG-rootv 253:0    0    40G  0 lvm   /                  (логический том)
    ├─myVG-swapv 253:1    0    16G  0 lvm   [SWAP]             (логический том)
    └─myVG-homev 253:2    0  63,1G  0 lvm   /home              (логический том)

Теперь, наконец, опишу последовательность шагов, приведших к такому результату.

0. Создание инсталляционной флэшки

Берём понравившийся образ, например, отсюда https://mirror.yandex.ru/ubuntu-cdimage/xubuntu/releases/20.10/release/, подключаем флэшку - будем считать, что она села на /dev/sdh - и заливаем:

sudo dd if=xubuntu-20.10-desktop-amd64.iso of=/dev/sdh bs=1M

1. Подготовка к установке

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

sudo add-apt-repository -y ppa:yannubuntu/boot-repair
sudo apt update
apt install boot-repair
Устанавливаем средство для управления программными RAID массивами:
sudo apt install mdadm
Размечаем диски:
sudo fdisk /dev/nvme0n1
sudo fdisk /dev/nvme1n1
так, чтобы lsblk -a рисовал примерно такую картинку:
$ lsblk -a

nvme0n1          259:0    0 119,2G  0 disk
├─nvme0n1p1      259:2    0   128M  0 part
└─nvme0n1p2      259:3    0 119,1G  0 part
nvme1n1          259:1    0 119,2G  0 disk
├─nvme1n1p1      259:4    0   128M  0 part
└─nvme1n1p2      259:5    0 119,1G  0 part
Размечаем ESP под fat:
sudo mkfs -t fat -F 32 /dev/nvme0n1p1
sudo mkfs -t fat -F 32 /dev/nvme1n1p1
Создаём RAID:
mdadm --create /dev/md0 --metadata=0.90 --level 1 --raid-disks 2 /dev/nvme0n1p2 /dev/nvme1n1p2
этот процесс небыстрый, нужно подождать, пока диски синхронизируются, текущий статус массива можно глянуть командой cat /proc/mdstat. Когда всё закончится, настраиваем LVM. Передаём под его отвественность наш свежесозданный раздел /dev/md0:
pvcreate /dev/md0
Создаём группу томов, в которую включаем /dev/md0:
vgcreate myVG /dev/md0
Создаём логические тома:
lvcreate -L 40G myVG -n rootv
lvcreate -L 16G myVG -n swapv
lvcreate -l +100%FREE myVG -n homev
После этого конфигурация приобретёт законченный вид, и можно приступать к собственно процессу установки.

2. Процесс установки

Сама установка сложностей не представляет - запускаем процесс по ярлыку на рабочем столе, аккуратно указываем соответствие точек монтирования /, /home логическим устройствам и расположение раздела подкачки. По окончании процесса установки на перезагрузку, однако, не соглашаемся - надо на свежепоставленную систему взгромоздить mdadm, использующийся для программного RAID. Поэтому выбираем опцию "Продолжить работу" и возвращаемся в терминал.

3. Дополнительная настройка

Монтируем корень нашей новой системы и подготавливаемся к тому, чтобы в эту новую систему переключиться:

sudo mount /dev/myVG/rootv /mnt
mount -o bind /dev /mnt/dev
mount -o bind /dev/pts /mnt/dev/pts
mount -o bind /sys /mnt/sys
mount -o bind /proc /mnt/proc
cat /etc/resolv.conf >> /mnt/etc/resolv.conf
Переключаемся:
chroot /mnt
Доустанавливаем в свежеустановленную систему необходимые пакеты:
apt install mdadm
apt install grub-efi-amd64
apt remove grub-efi-amd64-signed
Включаем показ меню GRUB при запуске системы:
vi /etc/grub.d/10_linux # изменить значение quick_boot на 0
И, наконец, перезагружаемся.

4. Настройка GRUB для работы с двумя копиями ESP

Если повезло, и система загрузилась, нужно настроить GRUB. это делается командой:

dpkg-reconfigure grub-efi-amd64
там в какой-то момент конфигуратор выведет список найденных ESP и предложит отметить галочками, какие из них синхронизировать. Правда, говорят, эта опция доступна только с недавних пор - дистрибутивы, выпущенные ранее 2019 года, такой возможности не имеют. Я поставил обе галочки напротив nvme0n1p1 и nvme1n1p1. Буду надеяться, GRUB не подведёт.

Литература:

Установка Linux на software raid
Install Ubuntu 18.04 desktop with RAID 1 and LVM on machine with UEFI BIOS
How to install Ubuntu server with UEFI and RAID1 + LVM
Как установить Ubuntu на программный RAID-1
Лабораторная работа: настраиваем lvm, raid на linux

четверг, 28 января 2021 г.

Ubuntu: при подключении через rdp ошибка CredSSP required

С незапамятных времён пользовался rdesktop для подключения к windows-машинам:

rdesktop -g 1280x972 -r disk:shared=~/shared host:port

Но с windows 10 возникает проблема: Failed to connect, CredSSP required by server (check if server has disabled old TLS versions, if yes use -V option). В принципе, можно это поправить: Панель управления -> Система и безопасность -> Система -> Защита системы -> вкладка "Удаленный доступ" -> снять галочку с "Разрешить подключения только с компьютеров, на которых работает удаленный рабочий стол с проверкой подлинности на уровне сети (рекомендуется)", но получается как-то неизящно.

Оказывается, есть вариант использовать другой клиент, xfreerdp. В убунте устанавливается из репозитория командой sudo apt-get install freerdp2-x11. Ну, и параметры командной строки немного другие:

xfreerdp /w:1280 /h:972 /u:"domain\\username" /drive:shared /v:host:port

Не без багов (например, не работает /drive:name,shared позволяющее присвоить шаре нужное имя), но работает.

четверг, 21 января 2021 г.

Антивирус Касперского и внедрение скриптов

Оказывается, KIS перехватывает веб-трафик и внедряет на страницы свой скрипт примерно такого вида (см. ниже), отчего иногда другие скрипты, написанные альтернативно одарёнными разработчиками, перестают нормально функционировать:

<script type="text/javascript" src="https://gc.kis.v2.scr.kaspersky-labs.com/01234567-8901-2345-6789-012345678901/main.js?attr=abcdefghijklmnopqrstuvwxyz" charset="UTF-8"></script>

Чтобы KIS отучить от этого нехорошего поведения, нужно покопаться в настройках - снять галочку вот тут:

Settings -> Additional -> Network -> Inject scripts into web traffic to interact with web pages

Литература:
How to disable Kaspersky Antivirus javascript injection?

четверг, 26 ноября 2020 г.

Linux: не осталось свободного места на диске

Интересная проблема обнаружилась. Предположим, есть жесткий диск с файловой системой ext4 на борту, забитый почти под завязку всяким файловым барахлом. Если с ним работать под рутом, то всё хорошо: можно файлы создавать/писать/читать/удалять. Если же это пропробовать делать с правами непривилегированного пользователя, то получим ошибку: на диске не осталось свободного места. Команда df -H тоже показывает, что 0% доступно для непривилегированной учетной записи и 2% для привилегированной.

Оказывается, линукс резервирует на диске 5% для суперпользователя - чтобы даже в случае нехватки свободного места всякие системные процессы продолжали работать, писать журналы, вести дневники и т.п. Поскольку в данном случае такое резервирование не требуется, можно эту величину поправить командой:
sudo tune2fs -m 0 /dev/sdc1

Литература:

https://superuser.com/questions/444269/display-filesystems-free-space-available-to-the-root-user

четверг, 10 сентября 2020 г.

Linux+Windows: Доступ из MS Windows к оконным приложениям X Windows

Захотелось поработать удалённо с оконными приложениями линукса. Насколько я знаю, линукс позволяет такие штуки - когда программа выполняется на одной машине, а окна рисует на другой - поэтому надеялся обойтись без средств удаленного доступа типа TeamViewer или VNC, и эта надежда отчасти оправдалась. Нужна лишь небольшая настройка.

1. Настраиваем линукс, на котором будут выполняться программы. У меня Slackware, но, думаю, под другими вариантами настройка будет примерно такой же. Нужно в конфигурационном файле /etc/ssh/sshd_config найти и раскомментировать следующие строки:

X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

2. Настраиваем Windows, которая будет заниматься отрисовкой окон. Оконные приложения в X11, как я понял, устроены хитро: приложение является клиентом, а окнами занимается сервер, которому, в принципе, всё равно где работать - на этой же машине или на соседней. Поэтому нужно поднять сервер X11. Мой выбор пал на Cygwin/X.

2.1. Устанавливаем Cygwin/X. Это несложный процесс: запускаем установщик cygwin, в которм выбираем для установки пакеты:

xorg-server
xinit
xorg-docs
xlaunch

2.2. Настраиваем Cygwin/X. Как выяснилось, "из коробки" у него не очень хорошо с подключениями tcp, переключением раскладки клавиатуры и глубиной цвета в rdp-сессии.

2.2.1. Переключение раскладки клавиатуры: в папке путь_установки_cygwin/home/имя_пользователя/ создаём файл .XWinrc с таким содержимым:

XKBLayout   us,ru
XKBModel    evdev
XKBOptions  grp:alt_shift_toggle
XKBRules    base
XKBVariant  ,winkeys 

Клавиатура будет переключаться по Alt+Shift. Если хотим Ctr+Shift, надо в XKBOptions указать grp:ctrl_shift_toggle.

2.2.2. Доступ по tcp: изменяем ярлык запуска сервера, дописывая в него параметр -listen tcp после двойного минуса (перед двойным минусом перечисляются параметры, относящиеся к клиенту, после него - к серверу):

путь_установки_cygwin\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; exec /usr/bin/startxwin -- -listen tcp"

Сервер будет ожидать входящие подключения на 6000 порту.

2.2.3. Корректировка глубины цвета: если работа с Windows производится в RDP-сессии, как у меня, то окна отрисовываются почему-то с минимальной глубиной цвета, чуть ли не в 16-цветной палитре. Исправляет это параметр -nocompositewm. То есть, окончательно команда ярлыка запуска сервера приобретает следующий вид:

путь_установки_cygwin\bin\run.exe --quote /usr/bin/bash.exe -l -c "cd; exec /usr/bin/startxwin -- -listen tcp -nocompositewm"

2.3. Настраиваем PuTTY. Переходим в категорию Connection -> SSH -> X11 и выставляем там параметры:

Enable X11 Forwarding              -> true
X11 Location                       -> :0.0
Remote X11 authentication protocol -> MIT-Magic-Cookie-1
X authority file for local display -> путь_установки_cygwin\cygwin\home\имя_пользователя\.Xauthority

После всех настроек можно заходить через PuTTY на линуксовую машину и запускать на ней оконные приложения (xclock, xlogo, firefox и т.д.). Работает всё, правда, небыстро, но тут уж - как есть...

Литература:

http://tolik-punkoff.com/2016/11/21/nastrojka-x11-forwarding-cherez-ssh-s-pomoshhyu-putty-i-xming/

https://datacadamia.com/ssh/x11/cygwinx_remote_client#with_putty

https://stackoverflow.com/questions/34932495/forward-x11-failed-network-error-connection-refused

https://x.cygwin.com/docs/ug/setup.html#setup-cygwin-x-installing

http://cygwin.1069669.n5.nabble.com/X-colormap-problem-when-viewed-via-Microsoft-Remote-Desktop-td132076.html

понедельник, 25 мая 2020 г.

Linux: заменить в файле байты со значением 0x56 на байт со значением 0x65

Задача: поменять в файле file.bin у всех байтов равных, скажем, 0x56 значение на 0x65.

Решение:
xxd -p < file.bin | fold -w2 | sed 's/56/65/g' | xxd -p -r > patched_file.bin

По порядку:

xxd -p < file.bin - печатает содержимое файла file.bin в текстовом виде: "1256340021..."

fold -w2 - разбивает входную строку на строки по два символа:
12
56
34
00
21
...

sed 's/56/65/g' - меняет 56 на 65

xxd -p -r > patched_file.bin - восстанавливает байты обратно из их значений в текстовом виде

Литература:
https://www.commandlinefu.com/commands/view/194/binary-searchreplace

среда, 20 мая 2020 г.

Debian: python-скрипт, sql server 2005 и настройки openssl

Оказывается, если при переезде на новое место жительства скрипт, написанный в незапамятные времена на питоне и общающийся с Sql Server 2005 через pyodbc+unixODBC+msodbcsql (вот такое вот извращение), стал жаловаться примерно так: [ODBC Driver 17 for SQL Server]SSL Provider: [error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol], то можно поправить настройки ssl в файле /etc/ssl/openssl.cnf:
[system_default_sect]
MinProtocol = TLSv1.0
CipherString = DEFAULT@SECLEVEL=1