Отравка почтовых уведомлений

Пока никто не оставлял комментариев, не знал что не работают почтовые уведомления о коментариях . Оказалось что на сервере необходимо было установить sendmail. Кроме того, чтобы почта отправлялась нормально, необходимо наличие в * /etc/hosts* строки:

127.0.0.1 localhost.localdomain localhost yourhostname

поиск по истории команд в bash

Создать ~/.inputrc и добавить следующее:

$include /etc/inputrc
"\e[A":history-search-backward
"\e[B":history-search-forward

загрузка по сети

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

Во-первых непроходимо установить и настроить tftp-сервер на устройстве, откуда будет идти загрузка (в моем случае NAS). В папке tftp-сервера необходимо создать папку pxelinux.cfg, а в ней файл default, который будет грузиться по умолчанию:

default menu.c32
prompt 0
timeout 300
label archboot
menu label ARCHBOOT
menu default
kernel arch/vmlinuz_x86_64
append initrd=arch/initramfs_x86_64.img
label clonezilla
menu label CLONEZILLA
kernel clonezilla/vmlinuz
APPEND initrd=clonezilla/initrd.img boot=live config noswap nolocales edd=on nomodeset 
ocs_live_run="ocs-live-general" ocs_live_extra_param="" keyboard-layouts="" 
ocs_live_batch="no" locales="" vga=788 nosplash noprompt
fetch=tftp://<ip-адрес tftp-сервера>/clonezilla/filesystem.squashfs#

Во-вторых необходимо объяснить dhcp-серверу откуда будут по сети загружаться машины. Тут все зависит от используемого dhcp-сервера. Например в mikrotik’е это Next Server (ip-адрес tftp сервера) и Boot File Name (имя файла который будет загружаться: pxelinux.0). Ну и в-третьих в биосе компьютера включить загрузку по сети.

UPD: Для clonezill’ы актуальные опции ядря стоит брать из файла syslinux/syslinux.cfg образа откуда бралось ядро и фс.

Дополнительные ссылки:

Использование нескольких ssh-ключей

Чтобы можно было использовать несколько ssh-ключей необходимо создать файл ~/.ssh/config следующего содержания:

Host example.com
    IdentityFile ~/.ssh/example/id_rsa
    User username
Host another_example.com
    IdentityFile ~/.ssh/another_examplel/id_rsa
    User username

Ключи положить в соответствующие папки.

OpenVPN и NetworkManager

Хочется одним нажатием кнопки в NetworkManager’е подключаться к vpn серверу? Для этого придется немного модифицировать client.ovpn файл:

  • Блок между тегами <ca></ca> поместить в файл client.ca
  • Блок между тегами <cert></cert> поместить в файл client.crt
  • Блок между тегами <key></key> поместить в файл client.key
  • Блок между тегами <tls-auth></tls-auth> поместить в файл client.tls
  • Удалить перечисленные теги вместе с содержимым из файла client.ovpn, так же удалить стоку “key-direction 1”
  • Перед BEGIN RSA SIGNATURE вставить:
ca client.ca
cert client.crt
key client.key
tls-auth client.tls 1

Готово. Теперь в NetworkManager’е Управление соединениями->VPN->Импорт импортировать client.ovpn и можно подключаться. Единственная проблема с которой еще не разобрался — NetworkManager не отображает информацию о соединении ( ip-адрес и т. д.)

Доступ к памяти из userspace

Доступ к памяти из юзерспейса linux’a может понадобиться для доступа к axi-регистрам, к целому куску физической памяти или чего-нибудь еще.

Существует как минимум два способа:

  1. использование /dev/mem
  2. использование userspace i/o

Преимуществом первого способа является то, что дополнительно ничего делать не нужно, доступно все адресное пространство. Это же является и недостатком — одно неосторожное действие с указателем и мы изменили чужой кусок памяти.

Поэтому буду рассматривать второй способ. Во-первых, необходимо включить драйвер ядра: CONFIG_UIO=y и CONFIG_UIO_PDRV_GENIRQ=y. Во-вторых, в dts-файл добавить примерно следующее:

regs@43c00000 {
compatible = "generic-uio";
reg = <0x43c00000 0x1000>;

, где 0x43c00000 — адрес нужного куска в физическом адресном пространстве (в данном случае это axi-регистры), а 0x1000 — длина.

После сборки ядра и загрузки linux’a должно появиться устройство /dev/uio0, для работы с которым нужен следующий код:

const unsigned int _MAP_SIZE = 0x1000;
int fd;
fd = open("/dev/uio0", O_RDWR);
if (fd < 1)
{
    return -1;
}
ptr = mmap(NULL, _MAP_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
{
    return -1;
}

//делаем все что нужно

munmap(ptr,_MAP_SIZE);
close(fd);

Вступление

В последнее время немного столкнулся с разработкой под ARM, конкретнее для SoC Zynq . Это два ARM-ядра и FPGA.

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