2016/02/03

proxmox-lxc и trim

Собственно по мотивам статьи http://vasilisc.com/proxmox-virtio-scsi-discard
Нужно сообразить Trim. И так начнём.
1. Оговорки.
Debian 8.3
Proxmox VE Version: 4.1-5/f910ef5c
Ceph 0.94.5
2. я честно стырил текст из той статьи
Нужно команду TRIM запланировать на работу через планировщик cron. Создайте файл sudo -e /etc/cron.daily/trim, вставьте строки и сохраните файл.

#!/bin/sh
LOG=/var/log/trim.log
echo "*** $(date -R) ***" >> $LOG
fstrim -v / >> $LOG
Не забудьте сделать /etc/cron.daily/trim исполняемым - sudo chmod +x /etc/cron.daily/trim
3. А как же узнать, что свободное место реально возвращается назад? К сожалению, если Ceph используется через абстракцию RBD, то нет простой команды, позволяющей узнать размер виртуального диска конкретной виртуальной машины. Ceph хранит всё в виде объектов, а не в виде готовых файлов-дисков и просто так пощупать их не получится. Это объясняет, но не оправдывает Цеф. Выкрутится можно следующей командой, где в примере vm-112-disk-1 - файл-диск из конфигурационного файла данной виртуальной машины:
rbd diff rbd/vm-112-disk-1 | awk '{ SUM += $2 } END { print SUM/1024/1024/1024 " GB" }'


2015/05/17

Dell Inspiron 11 3000 и сенсор положения

Буду краток
для смены ориентации экрана делаем скрипт
1. тело
#!/usr/bin/python3
import sys, os, gc, time, glob
import subprocess

#const
#Touchscreen
name_screen = "ELAN Touchscreen"
inversion = "Evdev Axis Inversion"
swap = "Evdev Axes Swap"
#Touchpad
name_pad = "DLL064D:00 06CB:2985"
enab = "Device Enabled"
angle = 7.0


def proc(cmd,time = 30,sh = True ):
    p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=sh)
    try:
        outs, errs = p.communicate(timeout=time)
    except subprocess.TimeoutExpired:
        p.kill()
        outs, errs = p.communicate()
    return outs,errs

for device in glob.glob('/sys/bus/iio/devices/iio:device*'):
    if open(device + '/name').read() == 'accel_3d\n':
        scale = float(open(device + '/in_accel_scale').read())
        break

if __name__ == '__main__':
    x = open(device + '/in_accel_x_raw')
    y = open(device + '/in_accel_y_raw')
    position = ""
    try:
        while True:
            x.seek(0)
            y.seek(0)
            current_x = float(x.read()) * scale
            current_y = float(y.read()) * scale
            if current_y <= -angle and position != "normal":
                proc("xrandr -o normal")
                proc("xinput set-prop \"{}\" \"{}\" 0 0".format(name_screen,inversion))
                proc("xinput set-prop \"{}\" \"{}\" 0".format(name_screen,swap))
                proc("xinput set-prop \"{}\" \"{}\" 1".format(name_pad,enab))
                position = "normal"
            elif current_y >= angle and position != "inverted":
                proc("xrandr -o inverted")
                proc("xinput set-prop \"{}\" \"{}\" 1 1".format(name_screen,inversion))
                proc("xinput set-prop \"{}\" \"{}\" 0".format(name_screen,swap))
                proc("xinput set-prop \"{}\" \"{}\" 0".format(name_pad,enab))
                position = "inverted"
            elif current_x >= angle and position != "left":
                proc("xrandr -o left")
                proc("xinput set-prop \"{}\" \"{}\" 1 0".format(name_screen,inversion))
                proc("xinput set-prop \"{}\" \"{}\" 1".format(name_screen,swap))
                proc("xinput set-prop \"{}\" \"{}\" 0".format(name_pad,enab))
                position = "left"
            elif current_x <= -angle and position != "right":
                proc("xrandr -o right")
                proc("xinput set-prop \"{}\" \"{}\" 0 1".format(name_screen,inversion))
                proc("xinput set-prop \"{}\" \"{}\" 1".format(name_screen,swap))
                proc("xinput set-prop \"{}\" \"{}\" 0".format(name_pad,enab))
                position = "right"
            time.sleep(1)
    except KeyboardInterrupt:
        sys.exit(0)


2. делаем автозапуск
создаём файл ~/.config/systemd/user/sensor.service

[Unit]
Description=sensor polozenia
After=network.target
After=display-manager.service

[Service]
Environment=DISPLAY=:0.0
#путь до скрипта меняем на свой
ExecStart=/usr/bin/python3 /home/user/bin/sensor.py
Restart=always
RestartSec=10

[Install]
WantedBy=default.target

systemctl --u daemon-reload
systemctl --u enable sensor.service
systemctl --u start sensor.service
systemctl --u status sensor.service


onboard в debian 8 с systemd

Купил себе ноутбук с сенсорным экраном.
Собственно решил настроить экранную клавиатуру
1. скачиваем с сайта ubuntu пакеты http://packages.ubuntu.com/vivid/onboard
потребуются два пакта onboard и onboard-data
2. ставим их 
sudo dpkg -i ./onboard-data.deb
sudo dpkg -i ./onboard.deb
3. т.к. я использую awesome (а может это и не связано ) выявиться глюк в том что не работало переключение раскладки + если переключить на русский то при нажатии на onboard писало  на английском 
решение [1]
суть надо предварительно выполнить setxkbmap 
4. сделаем автозапуск у своего пользователя onboard через systemd
создаём файл ~/.config/systemd/user/onboard.service
[Unit]
Description=onboard
After=display-manager.service

[Service]
Environment=DISPLAY=:0.0
ExecStartPre=/usr/bin/setxkbmap
ExecStart=/usr/bin/onboard
Restart=always
RestartSec=10

[Install]
WantedBy=default.target


systemctl --u daemon-reload
systemctl --u enable onboard.service
systemctl --u start onboard.service
systemctl --u status onboard.service
смысл команд можно почитать [2]
единственное поясню ключ --u запускает systemd в пространстве пользователя
ссылки: 1. http://www.lubuntu.ru/forum/viewtopic.php?f=19&t=440&start=50#p4923 2. https://wiki.archlinux.org/index.php/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) 3. https://coreos.com/docs/launching-containers/launching/getting-started-with-systemd/ 4. http://www2.kangran.su/~nnz/pub/s4a/s4a_latest.pdf

2015/01/27

winexe

Собственно надо собрать очень нужную в хозяйстве софтину winexe
Официальное README
http://sourceforge.net/p/winexe/winexe-waf/ci/master/tree/

Мой вариант адаптирован для 100% сборки

apt-get install gcc-mingw-w64 comerr-dev libpopt-dev libbsd-dev zlib1g-dev libc6-dev python-dev lib-ldap2-dev
У вас может не хвать установленных либ
но их легко заметить в логе ошибок при сборке
git clone git://git.code.sf.net/p/winexe/winexe-waf winexe-winexe-waf      winexe
cd ./winexe

берём последнюю версию https://download.samba.org/pub/samba/
wget https://download.samba.org/pub/samba/samba-4.1.16.tar.gz
tar -xzf ./samba-4.1.16.tar.gz

cd ./source/
./waf --samba-dir=../samba-4.1.16/ configure build

Забираем готовое в папке build
теперь можно спокойно положить в /usr/local/bin или ~/bin кому как удобней
Если не собирается с текущей версией то берём предпоследнюю
почистив заранее папку smb_static/build


Спасибо за внимание.



2014/09/23

grub2 usb flash efi

Собственно надо создать само достаточный файл bootx64.efi весь в себе
Делается в лёгкую на компе с efi(у меня других нету)
Если у вас нету пк с efi то можно поставить пакеты с бинарными файлами при этом они ни как не повредят текущию загрузку системы
apt-get install grub-efi-amd64-bin  grub-efi-ia32-bin
#!/bin/sh grub-mkimage -o bootx64.efi -O x86_64-efi -p /efi/boot `find /usr/lib/grub/x86_64-efi/*.mod -type f -exec grep -l 'LIC' '{}' \; | xargs | sed -e 's/\.mod//g'`

Создаст в текущей папке файл.
Версия будет такая же что и в системе.
Поиск конфигурационного файла /efi/boot 
Какие ошибки я решил
incompatible license
 -exec grep -l 'LIC' '{}' \; фильтр на модули без лицензий
Делаем bootia32.efi
Думаю не надо объяснять зачем это кому то понадобится :)
привет Intel Atom
#!/bin/sh
grub-mkimage -o bootia32.efi -O i386-efi -p /efi/boot `find /usr/lib/grub/i386-efi/*.mod -type f -exec grep -l 'LIC' '{}' \; | xargs | sed -e 's/\.mod//g'`
Усё.
update 01.01.2015

2014/06/06

готовим обвес для grive

Сегодня будем готовить такую программу как grive.
Она всем замечательна только вот нет защиты от запуска второй копии
поправим это:
0. ставим но без меня
http://searchengines.guru/showthread.php?p=12712870
http://blackdiver.net/it/linux/3029
1. ваяем скрипт следующего содержимого
#! /bin/sh
# инициализация grive -a
# переходим в папку с файлами
cd /home/папка юзера/crypt/
if ! pidof grive
then
grive
# чистим компромант(файлы от ака google)
cd /tmp/
rm `ls ./ | grep changes | grep xml`
fi
2. добавляем его в крон
*/10 * * * *   /bin/sh /полный/путь/до/вашего/скрипта.sh


Да я люблю часто синхронизировать из-за чего у меня по 10 параллельных процессов образовывалось со взаимной блокировкой 

2014/03/06

freerdp и windows 2012 или проброс диска

Собственно квест пробросить диски через rdp в windows 2012
xfreerdp --version
This is FreeRDP version 1.0.2

Моя строка
xfreerdp --plugin rdpsnd --data alsa -- -k 0x00000409 -a 16 -g 1440x884 --plugin rdpdr --data disk:root:/home/user/ -- --plugin cliprdr -d domain -u login -p pass --ignore-certificate server

разбор по параметрам
--plugin rdpsnd --data alsa --     даёт звук и в windows 2012 включает проброс диска (фича)
-k 0x00000409                     раскладка в сессии по дефолту
-a 16                             битность сессии экрана
-g 1440x884                       развертка (т.к. я пользуюсь awesome)  
--plugin rdpdr --data disk:root:/home/user/ -- собственно проброс диска
--plugin cliprdr                  буфер обмена (иногда глючит)
-d domain -u login -p pass        собственно понятно 
--ignore-certificate              игнорируем сертификат(собственно не гут готов рассмотреть варианты)

Решение.
Для пробраса диска в winows 2012 нужно сделать такую строку(порядок переменных обязательно такой)
xfreerdp --plugin rdpsnd --data alsa -- --plugin rdpdr --data disk:root:/home/user/ -- server

где я это нашёл
https://github.com/FreeRDP/FreeRDP/wiki/Plugins

2013/08/15

awesome vm и java

Cуть: Все java приложения отображаются как серые прямоугольники
решение:
#aptitude install suckless-tools
перед запуском java приложения или в авто запуске
$wmname LG3D

2013/08/12

интернет два провайдера с dhcp

Вводная.
  1. два провайдера
  2. у обоих dhcp
  3. хотелка использовать обоих
  4. Все материалы предоставленные в статье вы используете на свой страх и риск (это типа моя отмазка)

Ну что кодим
1. Я взял за основу вот эти статьи + напильник
2. переименовываем сетевые интерфейсы в системе (изменения применяться после reboot) мне нравятся осмысленые названия сетёвок
/etc/udev/rules.d/70-persistent-net.rules
# PCI device 0x1969:/sys/devices/pci0000:00/0000:00:1c.5/0000:08:00.0 (atl1c)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="04:7d:7b:a8:bc:0c", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth_inet1"

# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:1c.1/0000:02:00.0 (iwlwifi)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="74:e5:0b:db:cf:cc", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="eth_inet2"


3. да и не забываем что надо подправить /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth_inet1
iface eth0 inet dhcp


auto eth_inet2
iface eth0 inet dhcp
auto br_kvm iface br_kvm inet static pre-up brctl addbr $IFACE address 172.17.0.1 netmask 255.255.255.0










4. Включаем nat  /etc/sysctl.d/nat.conf
net.ipv4.ip_forward=1

5. делаем две таблицы /etc/iproute2/rt_tables
11    t_eth_inet1
12    t_eth_inet2

6. ставим пакет iptables-persistent и создаём базовый файл
/etc/iptables/rules.v4
# Generated by iptables-save v1.4.14 on Sun Aug 11 16:33:05 2013
*filter
:INPUT DROP [36:4565]
:FORWARD DROP [0:0]
:OUTPUT DROP [1:40]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p udp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Sun Aug 11 16:33:05 2013

7. Переходим к dhcp-client (он у меня выполняет всю грязную работу)
/etc/dhcp/dhclient.conf переопределяем скрипт
script "/etc/dhcp/dhclient-script";

8. копируем скрипт из /sbin/dhclient-script в /etc/dhcp/dhclient-script
и накладываем изменения
--- /sbin/dhclient-script 2013-05-28 03:00:32.000000000 +0600
+++ /etc/dhcp/dhclient-script 2013-08-10 00:10:17.000000000 +0600
@@ -235,7 +235,7 @@
                 fi
 
                 # set default route
-                ip -4 route add default via ${router} dev ${interface} \
+                ip -4 route add default via ${router} dev ${interface} table t_${interface} \
                     ${if_metric:+metric $if_metric} >/dev/null 2>&1
 
                 if [ -n "$if_metric" ]; then
@@ -313,7 +313,7 @@
 
             # set default route
             for router in $new_routers; do
-                ip -4 route add default via ${router} dev ${interface} \
+                ip -4 route add default via ${router} dev ${interface} table t_${interface} \
                     ${if_metric:+metric $if_metric} >/dev/null 2>&1
 
                 if [ -n "$if_metric" ]; then

Делаем так чтоб скрипт писал gw каждого провайдера в свою таблицу

9. Важный скрипт он делает nat, gw
/etc/dhcp/dhclient-exit-hooks.d/nat
# vim:set syntax=sh
#         set >/tmp/000
nat_interface="br_kvm"
nat_subnet="172.17.0.0/24"
gw_list=""

RUN="yes"

if [ "$RUN" = "yes" ]; then
 if [ "$reason" = "BOUND" ] || [ "$reason" = "REBOOT" ] || [ "$reason" = "TIMEOUT" ]; then
      #Файрвол
      if [[ "`iptables -S FORWARD | grep "o ${interface}" | grep ${nat_interface}`" == *${nat_subnet}* ]]; then
         nat_str="`iptables -S FORWARD | grep "o ${interface}" | grep ${nat_interface} | tail -n 1 | cut -f 2- -d' '`"
         iptables -D ${nat_str}
         nat_str="`iptables -S FORWARD | grep "i ${interface}" | grep ${nat_interface} | tail -n 1 | cut -f 2- -d' '`"
         iptables -D ${nat_str}
      fi
      iptables -A FORWARD -s ${nat_subnet} -i ${nat_interface} -o ${interface} -j ACCEPT
      iptables -A FORWARD -d ${nat_subnet} -i ${interface} -o ${nat_interface} -j ACCEPT 
      #nat
      if [[ "`iptables -t nat -S POSTROUTING | grep ${interface}`" == *${nat_subnet}* ]]; then
         nat_str="`iptables -t nat -S POSTROUTING | grep ${interface} | grep ${nat_subnet}| tail -n 1 | cut -f 2- -d' '`"
         iptables -t nat -D ${nat_str}
      fi
      iptables -t nat -A POSTROUTING -s ${nat_subnet} -o ${interface} -j SNAT --to ${new_ip_address}
      #разброс трафика по интерфейсам
      if [[ "`ip rule show | grep ${interface}`" == *t_${interface}* ]]; then
         nat_str="`ip rule show | grep ${interface} | tail -n 1 | cut -f 2- -d':'`"
         ip rule del ${nat_str}
      fi
      ip rule add from ${new_ip_address} lookup t_${interface}
      #gw
      for i in `ifconfig | grep "Link encap" | grep "eth_inet" | awk '{printf $1" "}'`; do
         if [[ `ip route show table t_${i} | grep "default"` == *default* ]] ; then
            gw_list="${gw_list} nexthop `ip route show table t_${i} | grep "default" | cut -f 2- -d' '` weight 1 "
         fi
      done
         ip route del default
         ip route add default scope global ${gw_list}
 fi
fi

Собственно всё
и на последок файл nat.tat.xz https://drive.google.com/folderview?id=0Bxc-zRqh3G-fYUpvZ0NBNGd4c1E&usp=sharing

2013/08/07

PXE загрузка с помощью GRUB 2

Установка 
На момент статьи версия 2.00-15
1. ставим пакет
#apt-get install grub-pc-bin 

2. ставим в папку tftp или tmp(потом сами копируете папку)


grub-mknetdir --net-directory=./tftpboot
папка boot должна быть в корне tftp

3. cd tftp
4. cp ./boot/grub/i386-pc/core.0 ./grub.pxe  (можно не копировать кому как нравится)
5. прописываем загрузочный файл в dhcp сервере /boot/grub/i386-pc/core.0
6. создаем свой файл конфигурации ./boot/grub/grub.cfg
корень tftp сервера обозначается (pxe)/

Из замечаных косяков 
  • не грузит файлы больше 32mb по не понятной причине загрусчик конектится в не правельном режиме есть расширения протокола tftp
  • при использовании графического режима при первой попытке запуска любог пункта меню ругается на отсутствие прав на запись.



Вкусняшки
1. после загрузки нажать "c" попадаем в консоль 
2. команды 
  • set переменные которые у нас есть
  • export name_set делает переменную глобальной нужно для субменю
3. переменные pxe_* не глобальные
 


Ссылки
http://blog.hostileadmin.com/tag/grub2pxe/
http://www.gnu.org/software/grub/manual/html_node/Network.html
http://www.gnu.org/software/grub/manual/html_node/Security.html
http://ipxe.org/
https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-netboot-pxe-config-efi.html

В конечном счете отказался в пользу pxelinux т.к. в нем нет указных глюков возможно вернусь к этому вопросу когда выйдет новая версия

2013/08/01

Установка Lotus Notes 8.5.3 на Debian 7 (64-bit)

Очередная статья об установке Lotus-а.
Буду краток.
Статьи которые мне помогли.

  1. http://ddurdle.blogspot.co.uk/2013/01/this-blog-post-is-strictly-about.html
  2. http://ddurdle.blogspot.co.uk/2012/04/installing-lotus-notes-853-on-linux.html
  3. http://ddurdle.blogspot.co.uk/2013/01/installing-lotus-notes-853-on-32-bit.html
  4. И бескрайний гугл.
Сама установка

  •       Скачиваем с официального сайта файл Lotus_notes853_linuxUb_RU.tar и распаковываем
  • мне понадобились ibm-lotus-notes-8.5.3.i586.deb и ibm-lotus-notes-core-ru-8.5.3.i586.deb
  • далее выполняем от root пользователя
  • распаковываем  
dpkg -x ./ibm-lotus-notes-8.5.3.i586.deb ./ibm-lotus-notes-8.5.3.i586 
dpkg -e ./ibm-lotus-notes-8.5.3.i586.deb ./ibm-lotus-notes-8.5.3.i586/DEBIAN
  • правим файл ./ibm-lotus-notes-8.5.3.i586/DEBIAN/control заменяя две строки
Pre-Depends:
Depends: unzip, bash, libart-2.0-2, libasound2, libatk1.0-0, libc6, libfontconfig1, libfreetype6, libgcc1, libgconf2-4, libglib2.0-0, libglib2.0-0, libice6, libjpeg62, libpango1.0-0, libpng12-0, libpopt0, libsm6, libstdc++6, libx11-6, libxcursor1, libxext6, libxft2, libxi6, libxkbfile1, libxml2, libxp6, libxrender1, libxss1, libxt6, libxtst6, libz1, libxinerama1, libxrandr2, libxcomposite1, libxdamage1, libcups2, libavahi-glib1, libgnome-keyring0, libvorbisfile3, libtdb1, libltdl7, libgtk2.0-0, libcanberra0, libgail18
  • Накатываем патч из не хватающих файлов (которые не поддерживают multiarch) копируем их в папку ./ibm-lotus-notes-8.5.3.i586/opt/ibm/lotus/notes/
libbonobo-2.so.0
libbonobo-activation.so.4
libbonoboui-2.so.0
libcanberra.so.0
libgailutil.so.18
libgdk_pixbuf-2.0.so.0
libgdk_pixbuf_xlib-2.0.so.0
libgdk-x11-2.0.so.0
libgnome-2.so.0
libgnomecanvas-2.so.0
libgnomeprint-2-2.so.0
libgnomeprintui-2-2.so.0
libgnomeui-2.so.0
libgnomevfs-2.so.0
libgtk-x11-2.0.so.0
libORBit-2.so.0
libORBitCosNaming-2.so.0
  • собираем пакет
              dpkg -b ./ibm-lotus-notes/ /tmp/ibm-lotus-notes.deb
  • Ставим  multiarch если не стоит
  • Ставим пакет dpkg -i /tmp/ibm-lotus-notes.deb и доставляем зависимости
  • Пробуем запустить от пользователя без прав на вопрос в консоль отвечаем "1"