2010-10-06

Вперде в Финку

Всё, я свободный человек, то есть с загран. паспортом и военником. Сходил сегодня в консульство - сказали, что надо предоставить какие-то подтверждения того, что я с Юлькой живу вместе уже два года, для того, чтобы она тоже могла со мной поехать...Фиг знает, что предоставлять...А так сказали искать жилье и валить уже нафиг, заждались типа...

2010-08-19

Загран

Ура, сегодня наконец-то сдал документы на загран. паспорт. Делал в локальном отделении УФМС. Пришел в 11:40. Ушёл в 12:00. Йа ф шоке. Может потому что все ломятся в единый центр документов. А в локальных ни очередей, никаких проблем в итоге. Лепота.

Ржако =)

Вот такую ржаку мне подарила подруга :-)

2010-08-16

Подарочек на ДР

Организовал себе подарочек на ДР - Thinkpad Edge 14 на i5. Шикарно. Кстати, это мой первый личный комп. К тому же более менее современный. Сбылась мечта идиота =)

2010-06-21

Вождение

Сегодня доехал до работы по КАДу на машине отца. Так круто, за полчаса до работы с комфортом. Шикарно! Надо срочно покупать какое-нить ведро.

2010-05-20

Powershell и управление принтерами

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

  1. # Ближайший до пользователя принт-сервер. Просто некоторые принтеры подключены к нескольких сервакам. Зачем? Никто не знает.  
  2. $prefer_server = "chel2.example.com"  
  3. # Подрубаемся к домену  
  4. $domain = "LDAP://dc=example,dc=com"  
  5. $root = New-Object DirectoryServices.DirectoryEntry $domain  
  6. $adFind = New-Object Directoryservices.DirectorySearcher  
  7. $adFind.SearchRoot = $root  
  8. # Возьмем имя пользователя из окружения  
  9. $username = $env:username  
  10.   
  11. # Ничего не делать, если скрипт выполняется на win2k3 и у пользователя в DN есть Full Users (То есть фулл юзверь подключился к терминал-серверу)  
  12. # Т.к. у нас в домене есть терминальщики и полноценники, то полноценникам не надо подключать принтера в терминальную сессию  
  13. # Т.к. они у нас в разных OU, проверку выполняем по DN.  
  14. $adFind.Filter = "(&(objectClass=user)(!(ObjectClass=computer))(sAMAccountName=$username))"  
  15. $user = $adFind.FindOne()  
  16. if ($user.Path.Contains("Full_Users")) {  
  17.     $osname = (gwmi -class Win32_OperatingSystem).Caption     
  18.     if ($osname -match ".*2003.*") {              
  19.             exit(0);  
  20.     }  
  21. }  
  22.   
  23. # Перечисление всех доступных принтеров  
  24. $ad_printers = @{}  
  25. $adFind.Filter = "(objectClass=printqueue)"  
  26. $adFind.FindAll() | Sort-Object -Property Properties.servername | foreach-object {  
  27.     if ($ad_printers.Contains($_.Properties.printername[0])) {  
  28.         # Добавить шару принтера на предпочитаемом сервере. Удалить на непредпочитаемом  
  29.         if ($_.Properties.servername[0] -eq $prefer_server) {  
  30.             $ad_printers.Remove($_.Properties.printername[0])  
  31.             $ad_printers.Add($_.Properties.printsharename[0],$_.Properties.uncname[0])  
  32.         }  
  33.     } else {  
  34.         $ad_printers.Add($_.Properties.printsharename[0],$_.Properties.uncname[0])  
  35.     }  
  36. }  
  37.   
  38. # Удалить не локальные принтеры  
  39. # На терминалах удалять драйвера стрёмно. На обычных компах в общем тоже, но сказали надо. Значит удаляём драйверы в том числе.  
  40. # Так же есть еще проблема - принтеры не на принт-серверах, а на локальных компах в филиалах  
  41. # В этом случае при запуске скрипта он удалит нах все сетевые принтаки и будет пытаться подключить перечисленные в AD принтеры  
  42. # А если принтак на локальном компе, и этот комп выключен - принтак не поставится. Пользователь звереет на глазах.  
  43. # Для таких принтеров в комментарии прописываем 'do_not_delete' и скрипт удалять такой принтер не будет  
  44. $del_printers = gwmi win32_printer -Filter "Local='$false'"  
  45. if ($del_printers) {      
  46.     # system name  
  47.     $osname = (gwmi -class Win32_OperatingSystem).Caption  
  48.     $del_drivers = $true  
  49.     if ($osname -match ".*2003.*") {  
  50.         $del_drivers = $false  
  51.     }  
  52.     foreach ($printer in $del_printers) {  
  53.         if (!(  
  54.               ($printer.Comment -ne $null) -and ($printer.Comment.Contains('do_not_delete'))  
  55.               )) {  
  56.             $driver = $printer.DriverName  
  57.             $printer.psbase.Delete()  
  58.             if ($del_drivers) {  
  59.                 write "Deleteting driver $driver"  
  60.                 $rundll32="$env:windir\System32\RUNDLL32.EXE printui.dll,PrintUIEntry /dd /q /m '$driver'"  
  61.                 write $rundll32  
  62.                 invoke-expression -Command $rundll32  
  63.             }  
  64.         }  
  65.     }  
  66. }  
  67.   
  68. # Поиск и установка назначенных принтеров  
  69. $printers_to_install = @()  
  70. $adFind.Filter = "(&(objectClass=user)(!(ObjectClass=computer))(sAMAccountName=$username))"  
  71. # Format: "printer_name:next_printer_name:last_printer_name"  
  72. # Принтеры прописаны в AD у каждого пользователя в поле "Комната". Получим их.  
  73. $printers = ($adFind.FindOne()).Properties.physicaldeliveryofficename -split ":"  
  74.   
  75. if (!$printers) {  
  76.     # no defined printers!  
  77.     write "No defined printers!"  
  78.     exit  
  79. }  
  80. # Найдем в списке всех принтеров AD те, которые нужны нам.  
  81. foreach ($printer in $printers) {  
  82.     if ($printer.Length -ne 0) {  
  83.         if ($ad_printers.Contains($printer)) {  
  84.             $printers_to_install = $printers_to_install + $ad_printers.Item($printer)  
  85.         }  
  86.     }  
  87. }  
  88.   
  89. # Проверить, есть ли локальные принтеры. Если есть - не надо ставить дефолтный принтер  
  90. $local_printers = gwmi win32_printer -Filter "Local='$true'"  
  91. $set_default = $true  
  92. if ($local_printers) {  
  93.     foreach ($local_printer in $local_printers) {  
  94.         # Проверка на "псевдо"-принтеры  
  95.         if ($local_printer.Name -match ".*XPS.*") {  
  96.             $set_default = $true  
  97.         } elseif ($local_printer.Name -match ".*Microsoft.*") {  
  98.             $set_default = $true  
  99.         } else {  
  100.             $set_default = $false  
  101.             $local_printer.setdefaultprinter()  
  102.             break  
  103.         }  
  104.     }         
  105. }  
  106.   
  107. # Установка принтеров  
  108. foreach ($printer in $printers_to_install) {  
  109.     write "installing $printer"  
  110.     $(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection("$printer")  
  111. }  
  112.   
  113. # Установка принтера по-умолчанию. По-умолчанию пропишется тот принтер, что в поле у юзвера стоит первым.  
  114. if ($set_default) {  
  115.     $all_pr = gwmi win32_printer -Filter "Local='$false'"  
  116.     foreach ($printer in $all_pr) {  
  117.         $a = $printer.ShareName  
  118.         if ($printers[0] -eq $a) {  
  119.             $printer.setdefaultprinter()  
  120.         }  
  121.     }  
  122. }  

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

Запускается у клиентов таким батником:

xcopy \\example.com\NETLOGON\printers\printers_chel.ps1 %temp% /Y
%windir%\system32\windowspowershell\v1.0\powershell.exe -NonInteractive -NoLogo -WindowStyle Hidden -Command ". %temp%\printers_chel.ps1"

Так же в group policy добавлен шаблон, который ставит уровень запуска powershell как unrestricted. Иначе powershell будет ругаться, что по политике нельзя запустить левый скрипт, неподписанный.

Вроде работает =)

Экзамен в ГИБДД

Вчера был экзамен в ГИБДД. Сдали теорию и оба с Юлькой завалили нах площадку. Обыдно. Оба завалились на параллельной парковке. Не встали. А все из-за того, что на школьной площадке задний автомобиль имитируют две фишки, а на гаишной площадке - три фишки. Включился тупой автомат, наработанный в школе, и я оба раза начинал выкручивать руль влево, увидев вторую фишку (когда надо было доехать до третьей). Причем оба раза!!! Нет чтобы почитать книжку перед экзаменом, как делается парковка и увидеть, съезжая с эстакады, что там три фишки. Мда, epic fail. Вот не понимаю я, куда девается мой моск в таких случаях. Ведь я видел, что фишки стоят как-то больно уж близко, что странно. И второй раз решил заехать дальше за вторую фишку (смотря в левое зеркало), но на автомате снова вывернул руль, когда увидел вторую фишку. В итоге машина стоит идеально ровно, но левыми колесами на линии фишек...Пересдача через 7 дней.

Шикарно =)


Last login: Tue May 11 18:04:38 2010 from 10.10.1.211
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
        The Regents of the University of California.  All rights reserved.

FreeBSD 7.1-RELEASE-p5 (GWCHEL-2009-05-04) #0: Mon May  4 17:29:39 YEKST 2009
$ uname -av
FreeBSD gw_chel.domain.ru 7.1-RELEASE-p5 FreeBSD 7.1-RELEASE-p5 #0: Mon May  4 17:29:39 YEKST 2009     root@gw_chel.domain.ru:/usr/obj/usr/src/sys/GWCHEL-2009-05-04  i386
$ uptime
13:44  up 356 days,  5:47, 1 user, load averages: 0,06 0,01 0,00

2010-05-11

Грёбанный гугл

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

2010-04-07

Вождение, часть M+1

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

Маршрутец получился весьма забавный.

Просмотреть увеличенную карту

Особенно забавно трэк выглядит на самой площадке =)

Косяки
1. Поворачивал налево на перекрестке с крайней левой. Поворот налево разрешен с двух полос. Справа никого не было, ну я и повернул налево в крайнюю правую. Косяк.
2. Подъезжал в светофору, горит красный. Ну я и еду. А там автобусная стоянка и пешеходный переход. На переходе тоже висел светофор. Маленький какой-то, еще и висел как-то далеко слева. Никого не было, светофора я не видел. Инструктор сказала что я чудак с буквы М, т.к. проехал на красный. О_о
3. Проезжаю перекрестки и иногда не обращаю внимания на знаки. Уступи дорогу вижу конечно, а вот главную могу и не заметить. Из-за этого туплю на проезд и еду, когда уступают явно. Инструктор вечно спрашивает, что была за дорога...а я и не знаю ^_^
4. На площадке первый раз на эстакаде заглох, во второй что-то перегазовал до 5к оборотов. Получил люлей. В последующие разы нормально заехал.
5. Параллельная парковка. В общем целом легко, но иногда машина слишком смещена в сторону проезжей части. Ну это дело опыта я думаю.

А в общем все прекрасно=) Даже (афигеть!) по круговому сегодня прокатился.

2010-03-29

Военкомат, part2

Итаг, прошел месяц. Ну ладно ладно, не месяц а 28 дней. Звоню в московский военкомат. Прошу перевести на внутренний номер 211. Первый раз никто не взял трубку. Через полчаса звоню снова, прошу перевести, женщина говорит: "А че надо? Ты вроде звонил уже". Хм, запомнила. Говорю, что хочу узнать, пришло или нет личное дело. Женщина спрашивает фамилию (O_o), причем разговаривает со мной как с человеком (o_О). Проверяет у себя, говорит что нифига нету (лучи поноса...). Говорит: "Попробуй позвони в петроградку, спроси у них, выслали они дело, или нет...). Ок, спасибо за совет (Все-таки там работают нормальные люди ^_^). Звоню в петроградку:
- Добрый день, у кого можно узнать про моё личное дело...
- Ни у кого, у них телефона нет, приезжайте сами (мужик, тупым голосом с дикого бодуна)
- Фак, че я туплю, полтора месяца мне тоже самое сказали. Пока пока.

epic fail :-D Так и хочется сказать слово, которое ненавидит мой брательник...

Ах да, я что-то сегодня такой радостный, откатал вождение без сучка, без задоринки, хотя в пятницу два зуба вырвали О_О

FreeBSD mbr->gpt. Миграция с одного диска на другой

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

# 1. На существующей машине поправим fstab для загрузки по ufsid (т.к. на второй машине есть винт, и фиг знает кто пойдет первый, sata или ide)
# ufsid можно посмотреть командой dumpfs _mount_point | head -2
[root@gw1 ~]# mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1e on /tmp (ufs, local, soft-updates)
/dev/ad0s1f on /usr (ufs, local, soft-updates)
/dev/ad0s1d on /var (ufs, local, soft-updates)
[root@gw1 ~]# dumpfs / | head -2
magic   19540119 (UFS2) time    Wed Feb 24 11:49:23 2010
superblock location     65536   id      [ 4baa0c99 45991624 ]
[root@gw1 ~]#
# Собственно эти метки прописываем в fstab, это позволит беспроблемно загрузиться на другой машине
# Единственный вопрос - swap. На нём нет fs, поэтому сделаем метку вручную через glabel
[root@gw1 ~]# sysctl kern.geom.debugflags=16
kern.geom.debugflags: 0 -> 16
[root@gw1 ~]# glabel label swap /dev/ad0s1b
[root@gw1 ~]# swapinfo
Device          1K-blocks     Used    Avail Capacity
/dev/ad0s1b        524288        0   524288     0%
[root@gw1 ~]# swapoff -a
swapoff: removing /dev/ad0s1b as swap device
[root@gw1 ~]# glabel status
      Name  Status  Components
label/swap     N/A  ad0s1b
# Ага, есть метки. Приводим fstab к нужному виду
[root@gw1 ~]# cat /etc/fstab
# Device                        Mountpoint      FStype  Options         Dump    Pass#
/dev/label/swap                 none            swap    sw              0       0
/dev/ufsid/4baa0c9945991624     /               ufs     rw              1       1
/dev/ufsid/4baa0ca057f22ea0     /tmp            ufs     rw              2       2
/dev/ufsid/4baa0ca2a832fcc5     /usr            ufs     rw              2       2
/dev/ufsid/4baa0ca724335a95     /var            ufs     rw              2       2
[root@gw1 ~]#
# В общем все, винт готов к вставке в другую машину. В моему случае проблем не было вообще, 
# т.к. вместе с винтом в новую машину переехали две 3com сетевухи, и не нужно было прописывать 
# сетевые настройки на новой машине.
# FreeBSD загрузилась на новой машине, смотрим винты
[root@gw1 ~]# # ls -l /dev/ad*
crw-r-----  1 root  operator    0,  67 Mar 29 11:53 /dev/ad0
crw-r-----  1 root  operator    0,  68 Mar 29 11:53 /dev/ad0s1
crw-r-----  1 root  operator    0,  69 Mar 29 15:53 /dev/ad0s1a
crw-r-----  1 root  operator    0,  70 Mar 29 15:53 /dev/ad0s1b
crw-r-----  1 root  operator    0,  71 Mar 29 11:53 /dev/ad0s1c
crw-r-----  1 root  operator    0,  72 Mar 29 15:53 /dev/ad0s1d
crw-r-----  1 root  operator    0,  73 Mar 29 15:53 /dev/ad0s1e
crw-r-----  1 root  operator    0,  78 Mar 29 11:53 /dev/ad4
# Ага, нужный винт появился. Надо его нарезать на разделы (Этот диск в виртуалке, размер реального винта был 120 гигов)
[root@gw1 ~]# gpt show ad4
     start      size  index  contents
         0  16777216
[root@gw1 ~]# gpt create -f ad4 # -f - затереть mbr, если есть.
[root@gw1 ~]# gpt show ad4
     start      size  index  contents
         0         1         PMBR
         1         1         Pri GPT header
         2        32         Pri GPT table
        34  16777149
  16777183        32         Sec GPT table
  16777215         1         Sec GPT header
# Установим загрузчик
[root@gw1 ~]# gpt boot ad4
# Нарезаем разделы (-s размер раздела в секторах. Сектор hdd 512 байт. (2Gb * 1024^3) / 512 = 4194304
# Под корень
[root@gw1 ~]# gpt add -s 4194304 -t ufs ad4
# Аналогично для других разделов с соответствующими разделами. Для swap меняем -t на swap. 
# Результаты в удобном виде можно посмотреть командой gpart show
# Чисто как пример (это с виртуалки)
[root@gw1 ~]# gpart show
=>      34  16777149  ad1  GPT  (8.0G)
        34       128    1  freebsd-boot  (64K)
       162   4194304    2  freebsd-ufs  (2.0G)
   4194466  12582717       - free -  (6.0G)
[root@gw1 ~]#
# Соответственно в /dev
[root@gw1 ~]# ls -l /dev/ad4*
crw-r-----  1 root  operator    0,  78 Mar 29 12:05 /dev/ad4
crw-r-----  1 root  operator    0,  89 Mar 29 11:53 /dev/ad4p1
crw-r-----  1 root  operator    0,  91 Mar 29 11:53 /dev/ad4p2
.....
# Надеюсь, мы запомнили схему разбивки винта и у нас не возникнет проблем с сопоставлением разделов

Ну а далее все не просто, а очень просто. Делаем newfs на нужные разделы (но не надо забывать, что на корень soft updates не делают!),
стопаем все сервисы на серваке, dump'им текущие файловые системы, ресторим дампы на примонтированные новые разделы (вот где главное не ошибиться!).
Правим fstab на примонтированном новом корне (я сделал все также по ufsid и glabel на swap).
Отмонтируем новые разделы, выключаем сервак, вынимаем старый винт - PROFIT!

Замечу, что я делал это все через ssh, сервак был далеко, соответственно делал через multiuser.
Если возникнут проблемы - можно подоткнуть старый винт на время и исправлять ошибки. Операция в общем-то тривиальная. На серваке в этот момент стояло: апач (web-морда для почты, управление прокси-сервером, mpd, никаких сайтов для клиентов), mysql, racoon, sams, mpd, isc-dhcpd. Ничего особенного. После переезда все чувсвтуют себя хорошо.

2010-03-23

Военкомат

Месяц назад встал на учет в военкомат. Это 3.14здец. Извините, других слов не имею. Дело с другого военкомата идет месяц. Работают только в среду и пятницу. Звонишь прошлую неделю - "Там все болеют и никого нет, звоните на следующей неделе". Окей. Звоню в понедельник. Нет ответа, никого нет. Звоню во вторник, сначала попал в обед. Окей. Звоню после обеда, дежурная женщина тупым голосом специально для имбецилов, медленно, с повторением каждого второго слова, говорит, что во вторник она не принимает и на звонки не отвечает, однозначно сука!. Звоню по второму телефону, отвечает мужик, прошу его перевести на внутренний номер, переводит. Жду минуту, мужик говорит, что там трубку не берут. Лучи поноса....перезваниваю, ура, попал на мужика, прошу перевести - переводит звонок на внутренний номер...снимают трубку, УРА!!!! Я дозвонился...хоп и трубочка тут же вешается обратно...короткие гудки...epic fail...рашка бл@

Снова про вождение

Записал сегодня трэк поездки. Прикольно покатались, не то что вчера - 20 минут на АЗС и 40 минут в пробке. Сегодня покатался от души, ввиду хорошего настроения ни разу не заглох и нигде не накосячил, ну почти :-) Проблема с габаритами, нифига я их не чувствую, и инструктор вечно меня ругает, что я правым бортом попадаю часто в ямы...

Писец, смотрю на трэк...оказывается я в основном по домам езжу ^_^

Просмотреть увеличенную карту

2010-03-19

Вождение, часть N, нет, M

Итаг, сегодня откатался с утречка, шикарно, мне так нравитсо :-). Дорога была плохая, мокрый снег, в итоге около трех раз сработала АБС, жуткий звук.

Косяки
1. Поворачиваю направо, посмотрел на пешеходный переход справа - никого нету. Ну я и еду, мля, налево забыл посмотреть. Инструктор орёт: "Внимательно". Тут же смотрю налево - там тетенька идёт. Сцепление и тормоз в пол, машина юзом (хотя наверно логичнее было продолжить движение, ибо тетка еще до моей полосы не дошла), в салоне звучит фраза инструктора "Бляха-муха", я себя ощущаю мудаком. Хвала яйцам, скорость маленькая и сзади никого не было. Уяснил для себя, что на переходе нужно всегда вращать головой в обе стороны, а не тока направо. Надо как-то сделать это рефлексом.

2. Еду по дороге, висит знак - дети. Снижаю скорость до 20, еду себе. На дороге стоит тётко. Я плавненько останавливаюсь, инструктор говорит, что не надо было её пропускать, нефиг ходить вне пешеходного перехода. Странно.

3. Поворачиваю налево и въезжаю на левую полосу. Инструктор ругаеццо, что нефиг ехать по левой полосе на учебной машине. Надо уяснить себе, что поворачивать налево надо по возможности в правую полосу.

А так, все отлично. Прочувствовал сцепление до конца, ни разу ни дернулся. Правда с чего-то заглохнул один раз, когда поворачивал вслед за машиной направо О_О. Вроде правильно все делал, не бросал сцепление, видать газу не хватило...А еще какой-то мудак на вольве обогнал меня справа, чуть ли не по тротуару, забрызгал гавном все лобовое и уехал, сук@

2010-03-16

Вождение, часть 2

Это просто бугага. Заглох сёдня в пробке на узкой улочке возле СКК. Начал ехать, машина еле еле ползет, что за фигня, наверно колеса проскальзывают...сбросил газ, а сцепление не выжал, идиот, вот и заглох...самая ржака - завожу движок, а ключ вправо не идет (фича такая, или бага). Инструктор (Ирина Александровна) говорит: "Ключ на себя, потом от себя". Фак, мой моск выпал в kernel panic...как можно ключ зажигания на себя потянуть, нет чтобы сказать сначала влево, потом вправо...ну в общем я с лицом дебила потянул ключ на себя, брелочек на ключе тока изогнулся...естественно безрезультатно...представляю как это со стороны выглядело :-D Инструктор ключ повернула налево, потом направо, фух...завелись

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

Вот такие дела. А катался сегодня более уверенно, не колбасило уже. Четко и плавно, даже направо пару раз перестроился перед перекрестками без проблем, спасибо тем кто ехал справа, уступили. Помигал аварийкой =)

2010-03-15

FreeBSD, переводим живую фс на журнал

В общем то тривиальная операция, но решил на память записать:

Итаг, задача.

Нужно к живой фс (2 Tb) прикрутить журнал (gjournal), ибо при нештатном выключении fsck занимает достаточно долгое время, чтобы пользователи начали орать в стиле: "Аааааааа, где наша почта!!!! Отдел ИТ казлы!!!!!". Background fsck + soft updates не решение, ибо пока раздел чекается при загруженной системе, работать с почтой невозможно, ибо все аццки тупит. Ибо, ибо...пора завязывать с этим словечком...Так вот, нужен журнал (который,кстати, все равно не отменяет fsck). Под это дело мудрые разработчики придумали gjournal. В процессе действия я еще переведу раздел на gpt (просто захотелось экспы)

Сложность заключается в том, что все это я провернул из дома, т.к. сидеть в выходные на работе не хотелось. Спас отца русской демократии ip-kvm.
Поехали:

flanker# uname -a
FreeBSD flanker.domain.ru 7.2-RELEASE-p7 FreeBSD 7.2-RELEASE-p7 #0: Fri Mar 12 14:18:18 MSK 2010     root@flanker.domain.ru:/usr/obj/usr/src/sys/FLANKER-2010-03-12  i386
# Переводим систему в single mode
flanker# shutdown now
# Теперь в single mode (надо консоль, ssh не будет,у меня ip-kvm)
# отмонтируем нужный раздел (у меня var)
# Кстате, здесь у меня наступил тупняк, я запустил dump в multiuser, но он повис..
# Причем повис так, что даже init не смог его убить. Написал ему kill -9, но он никак не отреагировал, из-за этого не давало отмонтировать var.
# Спустя 20 минут сервак очнулся..фух...
flanker# umount /var
# Дампим текущую фс куда-нить, я заблаговременно подключил терабайтник и смонтировал его в /backup + ночью до этого у меня вся почта забэкапилась на другой сервак, так, на всякий случай.
flanker# dump -0 -f - /dev/aacd1s1d > /backup/var.img
# Ждал около часа (хотя в сумме там 300 гигов всего)
# Все, дамп сделался, теперь курочим разделы
# Создадим таблицу GUID разделов, -f говорит, что надо затереть mbr
flanker# gpt create -f /dev/aacd1
# Теперь нарезаем разделы (на журнал я сделал 10 гигов, с огромным запасом)
# -s это размер в секторах (512 байт на сектор)
# Надо -s == (10G * 1024^3) / 512 == 20971520
flanker# gpt add -s 20971520 -t ufs aacd1
# Далее раздел под собственно сами данные, -s не указываем - утилита сделает максимально возможный по объему раздел
flanker# gpt add -t ufs aacd1
# Посмотрим что получилось
flanker# gpt show aacd1
start        size         index  contents
0            1                   PMBR
1            1                   Pri GPT header
2            32                  Pri GPT table
34           20971520     1      GPT part - FreeBSD UFS/UFS2
20971554     2908897213   2      GPT part - FreeBSD UFS/UFS2
2929868767   32                  Sec GPT table
2929868799   1                   Sec GPT header
flanker# ls -l /dev/aacd1*
crw-r-----  1 root  operator    0,  77 Mar 13 14:09 /dev/aacd1
crw-r-----  1 root  operator    0,  87 Mar 13 14:16 /dev/aacd1p1
crw-r-----  1 root  operator    0,  98 Mar 13 14:16 /dev/aacd1p2
# Отлично, сделаем ufs на разделе с данными
# -J - флаг журнала, O2 - UFS2 (хотя можно и не указывать, это дефолтно), 
# Soft Updates нафиг не нужны c журналом
flanker# newfs -J -O2 /dev/aacd1p2
# Все, сделали фс, посмотрим что как на всякий случай:
flanker# tunefs -p aacd1p2
tunefs: ACLs: (-a)                                         disabled
tunefs: MAC multilabel: (-l)                               disabled
tunefs: soft updates: (-n)                                 disabled
tunefs: gjournal: (-J)                                     enabled
tunefs: maximum blocks per file in a cylinder group: (-e)  2048
tunefs: average file size: (-f)                            16384
tunefs: average number of files in a directory: (-s)       64
tunefs: minimum percentage of free space: (-m)             8%
tunefs: optimization preference: (-o)                      time
tunefs: volume label: (-L)
# Так, все хорошо. Прикрутим журнал
# Маленькой отступление - я журнал вкомпилировал в ведро
# Добавил туда, хотя хэндбук говорит только про 2 опцию, которая по дефолту в ядре
# options         GEOM_JOURNAL            # GEOM class for journaling
# options         UFS_GJOURNAL            # Enable gjournal-based UFS journaling
# Кому влом пересобирать ядро надо
# 1. kldload /boot/kernel/geom_journal.ko
# 2. echo geom_journal_load="YES" >> /boot/loader.conf
# Итак, непосредственно включаем журналирование:
# первый идет провайдер данных, второй провайдер журнала!
flanker# gjournal label /dev/aacd1p2 /dev/aacd1p1
# Усе, получили журналируемую файловую систему, смонтируем ее
flanker# mount /dev/aacd1p2.journal /var
# Ресторим на нее дамп
flanker# cd /var
flanker# restore -vrf /backup/var.img
# Правим fstab
flanker# vim /etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
...
# Важно поменять pass с 2 на 1
/dev/aacd1p2.journal    /var            ufs     rw,async        1       1
# Выходим в multiuser
flanker# exit
# PROFIT!!!
Вот и прикрутили журнал к фс на серваке, без потери аптайма =)

Вождение

На втором практическом занятии по вождению поехал в город =) Прикольно, тока вот приехали на площадку сначала - я и думал, ща будем круги нарезать, или маневры маневрировать, а инструктор говорит: "Что-то здесь скучно, и кататься негде, поехали по городу поездим". Ну и поехали, из-за резкой смены обстановки даже колбасить немного начало, руки трястись =) Жуть...но ни разу не заглох, не дернул сцепление, со всех светофоров плавно и четко)) Правда пару раз 2 передачу не дожал, прожужжал коробкой)) Понравилось, завтра ищщо поеду. И теперь солидарен с брательником по поводу автомата, удобно наверно, запарилсо дергать сцепление в пробке =) Хотя МКПП мне все равно больше нравитсо =)

2010-01-12

FreeBSD IPsec VPN

Итак, на очередной халтурке встала задача организовать vpn между двумя сетями. OpenSSL vpn (а ля openvpn) надоел, хочется пачку experience, поэтому vpn я задумал на IPsec. Начитавшись хэндбука и статьи у многоуважаемого Лиссяры, а также теории насчет IPsec и isakmp, решил потренировацца на кошках. То есть на VirtualBox'е. В итоге всё получилось :-)

Значитца так, первым делом надо сделать сертификаты. Проводить первую фразу с помощью psk мне не захотелось, по сертификатом прикольнее как-то =)

Скажу честно, не осилил ман по openssl, многа букаф, разбираться было влом, поэтому я взял скрипты из папки easy-rsa для openvpn :-D Единственная подстава для тру-админов в том, что те скрипты требуют bash (Или может у меня руки не из того места), но bash я и так всегда ставлю, поэтому для меня сложностей это не составило.

С их помощью нагенерил себе сертификатов. Сначала генерим certificate authority, потом сами сертификаты. Сертификаты действительны в течении 10 лет вроде. Прописываем пути в vars, прописываем значения для экспорта ключенй KEY_*.
Далее:
gw2# pwd
/root/easy-rsa
gw2# vim vars
....
export KEY_DIR='/usr/local/etc/ipsec_certs/'
....
export KEY_COUNTRY=RU
export KEY_PROVINCE=SPB
export KEY_CITY=Saint-Petersburg
export KEY_ORG="example"
export KEY_EMAIL="root@example.ru"
:wq
[root@gw2 ~/easy-rsa]# . vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on /usr/local/etc/ipsec_certs/
[root@gw2 ~/easy-rsa]# ./build-ca
Generating a 1024 bit RSA private key
....................++++++
.....++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [SPB]:
Locality Name (eg, city) [Saint-Petersburg]:
Organization Name (eg, company) [example]:
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:gw2.example.ru
Email Address [root@example.ru]:
[root@gw2 ~/easy-rsa]# ./build-key gw2.example.ru
Generating a 1024 bit RSA private key
....++++++
.............................++++++
writing new private key to 'gw2.example.ru.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [SPB]:
Locality Name (eg, city) [Saint-Petersburg]:
Organization Name (eg, company) [example]:
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:gw2.example.ru
Email Address [root@example.ru]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /root/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'SPB'
localityName          :PRINTABLE:'Saint-Petersburg'
organizationName      :PRINTABLE:'example'
organizationalUnitName:PRINTABLE:'IT'
commonName            :PRINTABLE:'gw2.example.ru'
emailAddress          :IA5STRING:'root@example.ru'
Certificate is to be certified until Dec 28 13:11:49 2019 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Аналогично, генерим сертификат для второго шлюза. С сертификатами всё, копируем сертификаты машин и ca, а также ключи на машины в папку, указанную в конфиге ракуна. Надо пересобрать ведро для IPsec. Начиная, если я не ошибаюсь, с 7 ветки фряхи, для IPsec достаточно добавить следующие значения в конфигурацию ядра:
# IPSEC
options         IPSEC
# Debug необязательно, но рекомендуется.
options         IPSEC_DEBUG
device crypto
Собираем значит ядро, ставим. Обновляем порты и ставим ipsec-tools.
В итоге почти все. Итак, сейчас все делаем на машине, у которой следующее:
[root@gw2 ~]# ifconfig -a
re0: flags=8843 metric 0 mtu 1500        options=389b
        ether 00:26:18:ed:bc:16
        inet 10.10.2.1 netmask 0xffffff00 broadcast 10.10.2.255
        media: Ethernet autoselect (100baseTX )
        status: active
xl0: flags=8843 metric 0 mtu 1500
        options=9
        ether 00:01:02:6e:e2:de
        inet 195.208.xx.zz netmask 0xffffffc0 broadcast 195.208.xx.zzz
        media: Ethernet autoselect (100baseTX )
        status: active
lo0: flags=8049 metric 0 mtu 16384
        inet 127.0.0.1 netmask 0xff000000
Поехали
[root@gw2 ~]# vim /usr/local/etc/racoon/racoon.conf
# Только опции, которые менял йа
....
path certificate "/usr/local/etc/racoon/certs/";
....
log debug2;
listen
{
        isakmp 195.208.xx.yy [500];
}
# Здесь адрес другого шлюза
remote 85.114.aa.bb
{
        exchange_mode main,aggressive;
        my_identifier asn1dn;
        certificate_type x509 "gw2.example.ru.crt" "gw2.example.ru.key";
        peers_identifier asn1dn;
        peers_certfile x509 "gw1.example.ru.crt";
        verify_identifier on;
        ca_type x509 "ca.crt";
        lifetime time 8 hour;
        nonce_size 16;
        initial_contact on;
        proposal_check strict;  # obey, strict, or claim
        proposal {
                encryption_algorithm 3des;
                hash_algorithm sha1;
                authentication_method rsasig;
                lifetime time 30 sec;
                dh_group 2;
        }
}

sainfo anonymous
{
        pfs_group 2;
        lifetime time 10 hour;
        encryption_algorithm 3des;
        authentication_algorithm hmac_sha1;
        compression_algorithm deflate;
}
Все, racoon настроили. Теперь для него еще надо настроить записи IPsec SPD (Security Policy Database)

И вот тут я запутался. Вообще ipsec может работать в двух режимах: transport и tunnel.
Соответственно вариантов настройки несколько. Если использовать tunnel mode, то надо указать, что шифровать будем трафик между двумя LAN, создавая туннель между реальными ip машин. Как-то так:
[root@gw2 ~]# vim /usr/local/etc/racoon/setkey.conf
flush;
spdflush;
# 10.10.2.0 - LAN. Соответственно, она идет в out. Это для исходящего трафика
# 10.10.1.0 - это LAN на другом шлюзе. Эта сетка соответственно in
# require означает, что для прохождения трафика нужна соответствующая SA,
# то есть должно быть установлено шифрованное соединение, как я понял
spdadd 10.10.2.0/24 10.10.1.0/24 any -P out ipsec esp/tunnel/195.208.xx.zz-85.114.aa.bb/require;
spdadd 10.10.1.0/24 10.10.2.0/24 any -P in  ipsec esp/tunnel/85.114.aa.bb-195.208.xx.zz/require;

Но это еще не все. Если запустить ракуны в такой конфигурации, то мы уже получим IPsec VPN в котором все пакеты между сетями будут шифроваться. Но в этом случае расшифрованные пакеты IPsec сует прямо в сетевой стек, как их выцепить файрволом я не понял. Не гут. Чтобы как раз фаером выцеплять пакеты, используют gif туннели. Весь трафик между внутренними сетями идет через gif туннель. То есть трафик вываливается из gif'a в виде инкапсулированных пакетов ipencap, и дальше этот ipencap шифруется и передаётся в туннеле, который построил джек IPsec.

Но тут тоже интересный момент. Нахрена еще один лишний туннель, построенный с помощью IPsec? Как у Лиса, и в англ. версии хэндбука. Я вот как-то не вкурил. Настроил spd на транспортный режим, чтобы шифровать трафик, который вываливается из gif:
[root@gw2 ~]# vim /usr/local/etc/racoon/setkey.conf
flush;
spdflush;
spdadd 195.208.xx.zz 85.114.aa.bb ipencap -P out ipsec esp/transport//require;
spdadd 85.114.aa.bb 195.208.xx.zz ipencap -P in  ipsec esp/transport//require;

Работает. Чтобы все поднималось после ребута машин, надо добавить следующее в /etc/rc.conf
[root@gw2 ~]# vim /etc/rc.conf
....
# IPSEC
racoon_enable="YES"
cloned_interfaces="gif0"
gif_interfaces="gif0"
gifconfig_gif0="195.208.xx.zz 85.114.aa.bb"
ifconfig_gif0="inet 10.10.2.1 10.10.1.1 netmask 0xffffffff mtu 1480"
ipsec_enable="YES"
ipsec_file="/usr/local/etc/racoon/setkey.conf"
static_routes="srv2"
route_srv2="10.10.1.0/24 -interface gif0"
На другой машине соответственно зеркально наоборот. Посмотреть, что ракуны договорились, можно командой setkey -D. Она ничего не покажет, если ракуны не договорились. Если ракуны не договорились - пакеты не будут бегать, т.к. spd запрещает передачу ipencap без шифрования.
Кто объяснит разницу в использовании туннеля и транспорта - тому ставлю пиво :-)