Показаны сообщения с ярлыком linux. Показать все сообщения
Показаны сообщения с ярлыком linux. Показать все сообщения

пятница, 1 июля 2022 г.

Debian 11 + VirtualBox 6.1.34 + Windows 10 - частые перезагрузки.

С некоторых пор стала глючить виртуальная машина с Windows 10 на моём дебиане.
Симптомы такие: в какой-то момент система начинает притормаживать, иногда появляются на ровном месте в приложениях ошибки выделения памяти, затем система зависает на пару секунд и уходит на перезагрузку.
В системном журнале windows появляются примерно такие сообщения:
Компьютер был перезагружен после критической ошибки. Код ошибки: 0x0000003b (0x00000000c0000005, 0xfffff8050ec1348a, 0xffffbf0efe7f6b10, 0x0000000000000000). Дамп памяти сохранен в: C:\Windows\MEMORY.DMP. Код отчета: 05a343cc-46a1-4a5c-b0a6-4dc93983176d.
с разными кодами ошибок. Или такие:
Система перезагрузилась, завершив работу с ошибками. Возможные причины ошибки: система перестала отвечать на запросы, произошел критический сбой или неожиданно отключилось питание.

Помогло (надеюсь, что помогло) следующее: В свойствах виртуальной машины (Machine -> Settings -> System -> Acceleration) поставить Paravirtualization Interface = None.
UPD: не помогло...

воскресенье, 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

четверг, 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

понедельник, 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

пятница, 30 июня 2017 г.

Linux: PDF-редактор

Оказывается, есть на свете добрые люди.
Обнаружился редактор PDF под линуксом, бесплатный для некоммерческого использования:
Master PDF Editor

воскресенье, 19 февраля 2017 г.

Philips Xenium E181: связь через Bluetooth с Linux

Всё началось, как обычно, с пустяка. Как я уже когда-то говорил, с незапамятных времён мне верой и правдой служил замечательный сотовый телефон Samsung SGH-X100. Это была удобная звонилка, компактная, с приятным интерфейсом и прикольным белым медведем на заставке. Конечно не без недостатков - на ней как-то странно выглядели кириллические ответы на запрос баланса, MMS-сообщения не открывались и т.д. Да и с компьютером я её не успел подружить: сначала было как-то не нужно, а когда стало нужно, найти соответствующий USB-кабель оказалось проблематично.

Но всему приходит конец. В последнее время сотик постарел - испортилась пластмассовая защелка аккумулятора - и стал отключаться в самый неподходящий момент. Поэтому было принято трудное решение: купить другую звонилку. Выбор пал на Philips Xenium E181. Во-первых, какие-то зашкаливающие показатели аптайма, и, во-вторых, конечно, цена.

Сам телефон прост и безыскусен. Скорее даже это аккумулятор с возможностью позвонить. Умеет заряжаться от компьютера через micro-USB. Умеет работать с двумя симками (мне это не актуально). Есть слот для micro-SD (карту памяти надо покупать отдельно). Есть полноразмерный female USB-порт - для подзарядки(!) других устройств (открытый, могли бы положить заглушку, а то в кармане в него лезет всякий мусор, пришлось заказывать резиновую затычку на алиэкспрессе). Есть фотокамера 0.3 Mpx (качество снимков, разумеется, никакое). Есть радио. Есть фонарик (вот это полезно). Есть диктофон. Что ещё надо для счастья!

Как выяснилось, для счастья надо, чтобы была возможность обмениваться файлами с этим чудом инженерной мысли. Если подключить телефон по USB, он предлагает перейти в режим накопительного устройства, но моя убунта 15.10 его в качестве флэшки, увы, не воспринимает. Поэтому возникла надежда наладить файловый обмен через Bluetooth. С этой целью с дальней полки был вытащен, очищен от пыли и воткнут в свободный порт компьютера некий Bluetooth-адаптер. Линукс его, к счастью, без проблем подхватил, о чем свидетельствует вывод команды lsusb:
Bus 003 Device 002: ID 1310:0001 Roper Class 1 Bluetooth Dongle
Дальше началась терра инкогнита.

Оказывается, для работы с блютусом под линуксом используется некий программный продукт bluez и куча утилит, нещадно его эксплуатирующих. В частности, для настройки подключения к устройствам Bluetooth можно использовать утилиту bluetoothctl. Выглядит это так:
$ sudo bluetoothctl
[NEW] Controller 00:0B:0D:09:04:DF BlueZ 5.40 [default]

(включили блютус)
[bluetooth]# power on
Changing power on succeeded

(включили сканирование окружающего пространства на предмет наличия других блютус-устройств)
[bluetooth]# scan on
Discovery started
[CHG] Controller 00:0B:0D:09:04:DF Discovering: yes
[NEW] Device 89:61:8F:C0:48:BA Philips E181

(посмотрели информацию о своём адаптере)
[bluetooth]# show
Controller 00:0B:0D:09:04:DF
 Name: BlueZ 5.40
 Alias: BlueZ 5.40
 Class: 0x000104
 Powered: yes
 Discoverable: yes
 Pairable: yes
 UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
 UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
 UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
 UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
 UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
 Modalias: usb:v1D6Bp0246d0528
 Discovering: no

(посмотрели информацию о найденном телефоне)
[bluetooth]# info 89:61:8F:C0:48:BA
Device 89:61:8F:C0:48:BA
 Name: Philips E181
 Alias: Philips E181
 Class: 0x5a0204
 Icon: phone
 Paired: no
 Trusted: no
 Blocked: no
 Connected: no
 LegacyPairing: yes

(сказали, что мы этому устройству доверяем)
[bluetooth]# trust 89:61:8F:C0:48:BA
[CHG] Device 89:61:8F:C0:48:BA Trusted: yes

(попытались сделать сопряжение и обломились)
[bluetooth]# pair 89:61:8F:C0:48:BA
Attempting to pair with 80:61:8F:C0:48:BA
[CHG] Device 89:61:8F:C0:48:BA Connected: yes
Failed to pair: org.bluez.Error.AuthenticationFailed
[CHG] Device 89:61:8F:C0:48:BA Connected: no

(оказывается, надо еще зарегистрировать некого агента)
[bluetooth]# agent on
Agent registered

(попытались сделать сопряжение, на этот раз успешно)
[bluetooth]# pair 89:61:8F:C0:48:BA 
Attempting to pair with 89:61:8F:C0:48:BA
[CHG] Device 89:61:8F:C0:48:BA Connected: yes
Request PIN code
[agent] Enter PIN code: 0000
[CHG] Device 89:61:8F:C0:48:BA Modalias: bluetooth:v0046p0802d0903
[CHG] Device 89:61:8F:C0:48:BA UUIDs: 00001105-0000-1000-8000-00805f9b34fb
[CHG] Device 89:61:8F:C0:48:BA UUIDs: 00001112-0000-1000-8000-00805f9b34fb
[CHG] Device 89:61:8F:C0:48:BA UUIDs: 0000111f-0000-1000-8000-00805f9b34fb
[CHG] Device 89:61:8F:C0:48:BA UUIDs: 00001200-0000-1000-8000-00805f9b34fb
[CHG] Device 89:61:8F:C0:48:BA Paired: yes
Pairing successful
[CHG] Device 89:61:8F:C0:48:BA Connected: no
[CHG] Device 89:61:8F:C0:48:BA Connected: yes
[CHG] Device 89:61:8F:C0:48:BA Connected: no

(На этом счастье закончилось)
[bluetooth]# connect 89:61:8F:C0:48:BA 
Attempting to connect to 89:61:8F:C0:48:BA
[CHG] Device 89:61:8F:C0:48:BA Connected: yes
Failed to connect: org.bluez.Error.NotAvailable
[CHG] Device 89:61:8F:C0:48:BA Connected: no

(заплакали и вышли)
[bluetooth]# exit
В общем, сопрячь телефон с компьютером удалось, а вот наладить постоянный коннект - нет.

Однако, оказалось, не всё потеряно. Гугль посоветовал выполнить такую команду:
$ sdptool browse 89:61:8F:C0:48:BA
Browsing 89:61:8F:C0:48:BA ...
Service Name: Voiceg ateway
Service RecHandle: 0x10001
Service Class ID List:
  "Handsfree Audio Gateway" (0x111f)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 2
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Handsfree" (0x111e)
    Version: 0x0105

Service Name: AUDIO Gateway
Service RecHandle: 0x10002
Service Class ID List:
  "Headset Audio Gateway" (0x1112)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Headset" (0x1108)
    Version: 0x0102

Service Name: OBEX Object Push
Service RecHandle: 0x10003
Service Class ID List:
  "OBEX Object Push" (0x1105)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 5
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Среди этого нам интересен последний пункт, OBEX Object Push. Как видим, для передачи файлов нужно использовать канал 5.
Передачу эту на предварительно сопряженный через bluetoothctl телефон можно успешно осуществить следующей командой:
obexftp -b 89:61:8F:C0:48:BA -B 5 -p myfile.mp3 
Увы, на этом счастье изменило мне окончательно. Получить какой бы то ни было файл в CLI или даже просто просмотреть содержимое карты памяти сотика мне так и не удалось:
$ obexftp -b 89:61:8F:C0:48:BA -B 5 -l /
Connecting..\done
Receiving "/"... Sending ""...|failed: /
failed: /
The operation failed with return code 1
Disconnecting...failed: disconnect

Пришлось обратиться к GUI. В xubuntu нашлась некое приложение blueman-applet, которое, будучи запущенным,
во-первых, позволяет телефону находить компьютер и инициировать подключение, во-вторых, успешно держит коннект с телефоном, и, в-третьих, не менее успешно ловит файлы, отправляемые с этого телефона на компьютер. Единственная тонкость: оно не любит русские буквы в пути, по которому будет сохранять принятые файлы. Точнее, не оно, а питон 2.7, на котором оно написано. В модуле /usr/lib/python2.7/site-packages/blueman/plugins/applet/TransferService.py в методе _on_transfer_completed присутствует строка:
        if os.path.exists(os.path.join(dest_dir, filename)):
            ...
В слаквари перед ней есть костыль:
        # We get bytes from pygobject under python 2.7
        if hasattr(dest_dir, "upper",) and hasattr(dest_dir, "decode"):
            dest_dir = dest_dir.decode("UTF-8")

        if os.path.exists(os.path.join(dest_dir, filename)):
            ...
а в убунте нет, поэтому питон дохнет с ошибкой "Ordinal not in range". Правда, в слаквари с этой утилитой свои тонкости: она "из коробки" не работает - не хватает прав. Пришлось подправить файл /etc/dbus-1/system.d/bluetooth.conf, заменив в нем policy user="root" на policy group="wheel". Говорят, что это моветон, но пусть уж так, чем никак. В общем, может быть, когда-нибудь попробую сделать на том же питоне консольную программку с аналогичными полезными свойствами, но с более понятным жизненным циклом.

Остались за бортом этого краткого обзора некие загадочные и, судя по всему, полезные команды:
hcitool scan
hcitool dev
sudo rfcomm connect /dev/rfcomm0 89:61:8F:C0:48:BA <канал>
но что они означают и как могут облегчить всем жизнь, я вникать пока не стал.

Литература:

https://wiki.archlinux.org/index.php/Bluetooth
https://www.garron.me/en/go2linux/how-transfer-files-bluetooth-linux.html
https://help.ubuntu.com/community/BluetoothSetup

понедельник, 28 марта 2016 г.

Linux: cron и mpg123

Обновился с ubuntu 14.10 до 15.10 - отвалился будильник.

Ну, то есть, в crontab была строчка:
30  07  *  *  1-5  huhmuh   /home/huhmuh/budilnik.sh
которая успешно выполняла скрипт budilnik.sh:
#!/bin/sh
mpg123 -l 0 "/home/huhmuh/budilnik.mp3"
возвращавший меня в реальность каждое утро.

После обновления эта строчка перестала подавать признаки жизни, зато в /var/log/syslog появились такие интересные сообщения:
pulseaudio[12765]: [pulseaudio] source.c: Default and alternate sample rates are the same.
pulseaudio[12765]: [pulseaudio] socket-server.c: bind(): Адрес уже используется
pulseaudio[12765]: [pulseaudio] module.c: Failed to load module "module-esound-protocol-unix" (argument: ""): initialization failed.
pulseaudio[12765]: [pulseaudio] main.c: Module load failed.
pulseaudio[12765]: [pulseaudio] main.c: Не удалось инициализировать демон.
pulseaudio[12762]: [pulseaudio] main.c: Не удалось запустить демон.

Не знаю, что это такое, но побороть как-то удалось. Правда, теперь вышеупомянутая строчка выглядит так:
30  07  *  *  1-5  huhmuh   export XDG_RUNTIME_DIR=/run/user/1000 && /home/huhmuh/budilnik.sh
(конкретное значение переменной окружения XDG_RUNTIME_DIR подсмотрел командой printenv)

среда, 26 августа 2015 г.

Slackware: iptables и правила со множеством сетей

Возникла тут одна небольшая проблема. Пусть есть у нас некий линуксовый сервер, который служит шлюзом между тремя сетями, и в котором в iptables прописано много забавных маршрутов. Две сети - локальные, скажем, 10.0.0.0/8 и 192.168.0.0/16, воткнутые каждая в свою сетевую карточку, и третья - Интернет за NAT c внешним адресом X.X.X.X. И нужно какому-нибудь конкретному локальному адресу, например, 10.Y.Y.Y, дать доступ к ресурсам обеих локальных сетей и в то же время пустить в Интернет.

Было бы прекрасно, если бы можно было в параметрах iptables перечислить несколько подсетей, например, так:
iptables -A POSTROUTING -t nat -s 10.Y.Y.Y -d !10.0.0.0/8,!192.168.0.0/16 --to-source X.X.X.X
но, к сожалению, этот вариант у меня не сработал: iptables не позволил указать несколько подсетей таким образом и заругался на синтаксис.

Насколько я понял, в этом случае решением является следующее: создать отдельную цепочку правил, в которой последовательно проверить назначения пакета:
# создаем цепочку правил
iptables -N MYCHAIN -t nat
iptables -A MYCHAIN -t nat -d 10.0.0.0/8     -j RETURN
iptables -A MYCHAIN -t nat -d 192.168.0.0/16 -j RETURN
iptables -A MYCHAIN -t nat                   -j SNAT --to-source X.X.X.X

# используем цепочку правил
iptables -A POSTROUTING -t nat -s 10.Y.Y.Y -j MYCHAIN

пятница, 10 октября 2014 г.

Linux: передача файлов между компьютерами

Вариант 1, с использованием утилиты scp:
scp   -P ssh-порт   полный-путь-до-моего-файла   удаленный-пользователь@удаленный-хост:полный-путь-до-файла

Вариант 2, с использованием утилиты sshfs:
http://www.linuxjournal.com/article/8904

воскресенье, 8 июня 2014 г.

Linux: создаём зашифрованный контейнер

Наверно, в жизни каждого человека происходят случаи, которые можно охарактеризовать одним словом: "невезуха". Например, ты заказал себе жесткий диск для хранения бэкапов, но твой компьютер не дождался и сгорел за день до получения покупки. Или ты сменил работу, а через месяц твоя новая фирма разорилась. Или ты купил дачу, а рядом с ней с наветренной стороны построили свиноферму. Или ещё что-нибудь.

В середине весны у меня на служебном компьютере умер очередной винчестер, и стало ясно, что так продолжаться не может. Хоть я потерял и не сильно критичные файлы - какие-то старые бэкапы и пиратские дистрибутивы - но это событие всё равно оказалось, что называется, close call. Поэтому было принято стратегическое решение: упорядочить свои данные и работу с ними. Сделал я это следующим образом.

Во-первых, был выполнен аудит имеющейся в моём распоряжении информации и произведено её разделение на три неравные части:

1) Критически важная: продукты моего труда (исходники программ, какие-то запросы, заметки, уникальные документы и т.п.), логины-пароли и т.д.

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

3) Не важная: дистрибутивы, скачанные с инета, временные файлы и т.д. В общем, всё, что можно восстановить или не сильно жалко потерять.

Во-вторых, принят регламент дальнейшей работы:

1) В качестве операционной системы использовать Linux.

2) Те задачи, которые не могут быть перенесены под линукс и которые нужно решать по долгу службы (в частности, у нас существенно используются .NET приложения, часть из которых разрабатывал я сам), будут жить на виртуальной машине под управлением Oracle VM VirtualBox.

3) Не раскидываться по компьютерам. Не должно быть такого: что-то дома, что-то на работе, что-то вообще непонятно, где. Всё, что я делаю, должно храниться в одном месте.

4) Вся моя информация должна быть целиком и полностью под моим контролем. Не должно быть так, что воспользовался, скажем, сетевым хранилищем, а оно послезавтра закрылось или посчитало, что мой контент нарушает чьи-то права, и закрыло меня.

Лучшим решением, наверно, было бы переселиться на ноутбук. Но, во-первых, тупо нет лишних денег, и, во-вторых, лень таскать его с работы домой и обратно. Поэтому в качестве паллиатива был прикуплен внешний жесткий диск (3Q 500Гб USB 2.0) за 1800 рублей. Дальше предполагалось следующее:

1) создать четыре криптоконтейнера (критически важная, важная и не важная информация плюс виртуальная машина)

2) копировать их ежедневно на свой домашний компьютер

3) криптоконтейнер с критически важной информацией закидывать в DropBox (это, кстати, накладывает ограничение на объем этого криптоконтейнера - 2 Гб и служит одной из причин наличия приставки "крипто-" во всей этой истории вообще)

И всё получилось как нельзя лучше, но дальше началась та самая "невезуха". В качестве средства для создания криптоконтейнеров я выбрал знакомый мне с незапамятных виндовских времён TrueCrypt 7.1a. Это было в конце апреля. В конце мая вышеуказанный проект начало как-то подозрительно колбасить, и это заставило меня начать поиск альтернатив.

И тут выяснилась поразительная вещь. Оказывается, всё это время у меня под носом тихо лежало всё необходимое для создания полноценных криптоконтейнеров! Я имею в виду cryptsetup с LUKS. Удивительная всё-таки штука этот линукс. Делается подобное, как я понял, так:

1) Создаётся файл myContainer нужного размера:
dd if=/dev/urandom of=myContainer bs=1M count=2048

2) Этот файл превращается в криптоконтейнер:
sudo cryptsetup luksFormat myContainer

3) Просматривается список занятых loopback-устройств:
sudo losetup -a
и находится первое свободное, скажем, /dev/loop0. Либо это можно сделать сразу командой:
sudo losetup -f

4) Криптоконтейнер ассоциируется с этим свободным устройством:
sudo losetup /dev/loop0 myContainer
либо, опять-таки, минуя п.3 всё это делается сразу:
sudo losetup -f myContainer

5) Открывается криптоконтейнер командой:
sudo cryptsetup luksOpen /dev/loop0 LUKSmyContainer

6) Содержимое криптоконтейнера форматируется командой:
sudo mkfs -t ext4 /dev/mapper/LUKSmyContainer

7) Теперь можно примонтировать криптоконтейнер к заранее созданной точке myMountpoint:
sudo mount /dev/mapper/LUKSmyContainer myMountpoint

То есть в итоге получается такая цепочка:
файл myContainer -> устройство /dev/loop0 -> устройство LUKSmyContainer -> точка монтирования myMountpoint

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

После того, как работа завершена, можно отключить этот криптоконтейнер, выполнив последовательность команд:
sudo umount myMountpoint
sudo cryptsetup luksClose LUKSmyContainer
sudo losetup -d /dev/loop0

Кстати, ещё один приятный момент: cryptsetup всю работу с loopback-устройствами может взять на себя. Так что, если мне потребуется примонтировать криптоконтейнер, я могу воспользоваться более простым вариантом:
sudo cryptsetup luksOpen myContainer LUKSmyContainer
sudo mount /dev/mapper/LUKSmyContainer myMountpoint
(Кстати, в убунте вторая команда не требуется - устройство подхватывается и монтируется автоматически.)

Соответственно, при отключении криптоконтейнера в этом случае понадобятся всего две команды:
sudo umount myMountpoint
sudo cryptsetup luksClose LUKSmyContainer
(И снова кстати - в убунте при отключении тома через файловый менеджер Thunar никаких дополнительных команд не требуется вообще.)

Ну и напоследок: чтобы посмотреть все подключенные в данный момент устройства, включая и криптоконтейнеры, достаточно выполнить команду:
lsblk --fs

воскресенье, 30 июня 2013 г.

Slackware: зависла мышь

С какого-то перепугу стала зависать мышь. Компьютер вроде бы работает, но курсор не двигается, и на нажатия кнопок/прокрутку колеса реакции ноль.
Помогли вот эти две команды в консоли:
sudo rmmod psmouse
sudo modprobe psmouse

понедельник, 29 апреля 2013 г.

Linux: терминал

Почему-то в терминале перестала работать клавиша Delete. Вместо того, чтобы удалять символ, рисует тильду (~).

Решение такое: в ~/.inputrc добавить строку:

"\e[3~": delete-char

среда, 23 января 2013 г.

Slackware: компьютер не виден по netbios

Если с других рабочих станций локальной сети ваш компьютер не может быть найден по его netbios(wins)-имени, можно попробовать сделать следующее:

1. проверить, что это имя корректно прописано в /etc/samba/smb.conf (раздел global, секция netbios name)

2. перезапустить самбу:
sudo /etc/rc.d/rc.samba restart

3. посмотреть логи самбы - вдруг, она почему-то не стартовала.

понедельник, 5 ноября 2012 г.

Slackware 14 x64: Настраиваем icecast

В общем, хочется раздавать по локалке радио, которое получаю из интернета и слушаю при помощи mpg123:
mpg123 -p http://myproxy http://webcast1.emg.fm:55655/retro64.mp3

1. С сайта www.icecast.org скачиваю и устанавливаю icecast-2.3.3. Вроде, без проблем, но для того, чтобы получать звук из /dev/dsp (*), похоже, этого мало - нужен еще ices.

2. Хорошо, пытаюсь установить ices-2.0.2. Ему требуется какой-то libshout.

3. Стаскиваю оттуда же и устанавливаю libshout. Это, оказывается, нужно делать хитро, а именно:
./configure --prefix=/usr/local
make
sudo make install
Но все равно не помогает, попытка продолжить устанавливать ices выдает всё то же:
configure: /usr/bin/pkg-config couldn't find libshout. Try adjusting PKG_CONFIG_PATH

4. Выясняется, что у меня в PKG_CONFIG_PATH сплошные lib64, и требуется команда:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

5. ices наконец собирается, но запускаться отказывается примерно с такой ошибкой:
ices: error while loading shared libraries: libshout.so.3: cannot open shared object file: No such file or directory.
Проверяю, что путь, по которому лежит libshout.so.3, находится в /etc/ld.so.conf, и выполняю команду:
sudo /sbin/ldconfig

6. Дальше беру из /usr/local/share/ices и /usr/local/share/icecast/doc понравившиеся конфиги (мне подошли ices-oss.xml и icecast-minimal.xml), правлю их под себя и запускаю:
icecast -c icecast-config.xml &
ices ices-config.xml &

*) как этот звук туда попадает - отдельный позор (просто соединил шнурком аудиовыход и микрофонный вход ^_^)

суббота, 30 июня 2012 г.

bash - автозавершение команды из истории

Оказывается, это делается довольно просто. Нужно в файл ~/.inputrc вписать следующее:
"\e0A": history-search-backward
"\e[A": history-search-backward
"\e0B": history-search-forward
"\e[B": history-search-forward
"\e0C": forward-char
"\e[C": forward-char
"\e0D": backward-char
"\e[D": backward-char
После этого в командной строке можно набрать несколько символов, нажать стрелку "вверх" и получить автозавершение команды из истории.

понедельник, 5 марта 2012 г.

Linux: Восстановить разрешение экрана xfce

После запуска и некорректного завершения некоторых игрушек под wine, переключающих разрешение экрана в 800x600, хочется научиться восстанавливать "всё как было", что называется, в один клик.

Оказывается, для этих целей подходит команда xrandr. Будучи запущена без параметров, выводит список доступных разрешений экрана. Чтобы сменить разрешение, нужно выполнить, например:
xrandr -s 1024x768

суббота, 5 ноября 2011 г.

DHCP в Debian 6

На сервере:

Оказывается, нужно поставить dhcp3-server (командой sudo apt-get install dhcp3-server). После этого слегка поправить конфиги:

1. Необязательный момент, если интерфейс один: в /etc/default/dhcp3-server прописать:
INTERFACES="eth0"


2. Обязательный момент: в /etc/dhcp/dhcpd.conf прописать:
option domain-name "ylsoftware.com";
option domain-name-servers 192.168.2.10;

subnet 192.168.2.0 netmask 255.255.255.0 {
range 192.168.2.2 192.168.2.254;
option domain-name-servers 192.168.2.1;
option routers 192.168.2.10;
}


3. Если нужна привязка ip к mac, это делается так:
host first {
hardware ethernet 00:E0:4C:B7:C2:59;
fixed-address 192.168.2.3;
}


После этого перестартуем сервер /etc/init.d/isc-dhcp-server restart

На клиенте:

В /etc/network/interfaces пишем:
auto lo eth0
iface lo inet loopback
iface eth0 inet dhcp


И перестартуем: /etc/init.d/networking restart
(или ifdown eth0, ifup eth0, вроде, тоже канает)

Кстати, для статического адреса нужно в /etc/network/interfaces писать следующее:
auto eth0
iface eth0 inet static
address 192.168.2.4
netmask 255.255.255.0
gateway 192.168.2.1

а в /etc/resolv.conf:
nameserver 192.168.2.10


Проверяется конфигурация сети командой ifconfig.

суббота, 10 сентября 2011 г.

Создать animated gif под linux

Попробовал два способа:

1. Короткий.

mplayer video.avi -ss hh:mm:ss.lll -endpos hh:mm:ss.lll -vf scale=160:120 -vo gif89a:fps=3:output=out.gif -nosound

(качество получилось так себе.)

2. Длинный.

выбираем нужный кусок и просматриваем его:
mplayer -ao null -loop 0 -ss 0:11:22 -endpos 5 file.avi
(можно было указывать -endpos не в секундах, а тоже в виде hh:mm:ss)

преобразуем понравившийся кусок в кучку джипегов
mplayer input.avi -ss hh:mm:ss.lll -endpos 5 -vo jpeg:outdir=dirname:quality=80

конвертим джпипеги в гифы
for f in /workdir/*.jpg
do
g="${f%.*}.gif"
convert $f $g
done

собираем анимированный gif:
gifsicle --loopcount=0 --delay 8 --colors 256 -O2 -i --resize 480x_ *.gif > ani.gif

пятница, 8 июля 2011 г.

Настройка принтера под Slackware

Ссылка 1 - debian, но тоже хорошо
Ссылка 2
HP Linux imaging and printing

вкратце как расшарить принтер:

1. заводим юзера smbprint с правами на запись в папку /home/smbprint

2. в /etc/samba/smb.conf пишем:
[global]
printcap name = cups
printing = cups
security = share
[printers]
browseable = yes
printable = yes
public = yes
create mode = 0700
guest only = yes
use client driver = yes
guest account = smbprint
path = /home/smbprint

3. в /etc/cups/mime.convs раскомментируем строчку:
application/octet-stream application/vnd.cups-raw 0 -

4. в /etc/cups/mime.types раскомментируем строчку:
application/octet-stream

5. в /etc/cups/cupsd.conf пишем:
<Location /printers>
AuthType None
Order Deny,Allow
Deny From None
Allow From All
</Location>

6. перезапускаем службы:
/etc/rc.d/rc.samba restart
/etc/rc.d/rc.cups restart

UPD 2012-11-07:
А вот с принтером Xerox Phaser 3130 получилась небольшая проблема. Вроде бы с generic драйвером он работает, однако с завидной периодичностью начинает печатать мусор (кракозябры, псевдографику). Попробовал установить splix-2.0.0, может, поможет.

Спликс этот тоже не без проблем, кстати, собрался. Во-первых, собирать пришлось командой make DISABLE_JBIG=1, и, во-вторых, поправить файл /src/ppdfile.cpp в соответствии с http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=565097

воскресенье, 29 мая 2011 г.

Проблемы со звуком в wine

Что-то странное произошло со звуком в wine, пока я ковырялся с идеей записать через audacity мелодию с nosefart (проигрыватель музыкальных файлов для nes). Сам-то процесс описан тут, но ничего интересного не получилось.

Попутно оказалось, что /dev/dsp в убунту 11.04 отсутствует, зато можно эмулировать oss через alsa примерно так: поставить из репозитория пакет alsa-oss и запускать программы командой
aoss nosefart myFile.nsf

А с wine помогло следующее: в winecfg во вкладке "Аудио" поставил DirectSound - аппаратное ускорение - эмуляция, и вроде, всё запищало нормально.