NefigTut's Journal
[Most Recent Entries]
[Calendar View]
[Friends]
Below are the 20 most recent journal entries recorded in
NefigTut's LiveJournal:
[ << Previous 20 ]
| Thursday, January 1st, 2015 | | 12:00 am |
Для зачем.
Эта штука - не более чем жж-аггрегатор тех, кого я читаю. Nothing more. upd://Через это политика френдования. Которых [проверить, будет ли] интересно читать - добавляю. Которых [оказалось, что] неинтересно - удаляю. Наличие [отсутствия] меня у вас во френдах - ни разу ниибёт, реакцый не будет. | | Thursday, November 3rd, 2011 | | 4:34 am |
Авторизация, изменение релэя и отправителя в sendmail Я просто оставлю это здесь. Однажды потребовалось настроить sendmail согласно весьма хитрым требованиям клиента.
Требования были следующие:
– письма пришедшие от юзеров user1 и user2 пересылаются через отдельный релэй smtp.mailservice.com
– остальные письма отсылаются как обычно
– письма от этих юзеров отсылаются на релэй от имени autoemail@company.com
– этот релэй слушает на порту tcp/587
– этот релэй требует SMTP-авторизации при отправке
Ниже описано как это было сделано, для истории. Изменения приведены для дефолтного sendmail.mc файла.
- Раскомментировать следующие строки в /etc/mail/sendmail.mc:
FEATURE(masquerade_envelope)dnl
FEATURE(masquerade_entire_domain)dnl
- Добавить следующие строки в /etc/mail/sendmail.mc:
FEATURE(`smarttable')dnl
define(`RELAY_MAILER',`relay')dnl
define(`RELAY_MAILER_ARGS', `TPC $h 587')dnl
FEATURE(`genericstable',`hash -o /etc/mail/genericstable.db')dnl
GENERICS_DOMAIN_FILE(`/etc/mail/generics-domains')dnl
Можно ещё закомментировать директиву EXPOSED_USER(`root’)dnl для тестирования, поскольку по-умолчанию пользователь root не маскарадится.
- Добавить следующую строку в /etc/mail/access:
AuthInfo:smtp.mailservice.com "U:autoemail@company.com" "P:pa$$w0rd" "M:LOGIN"
- Создать файл /etc/mail/smarttableсо следующими строками:
user1@serv11.company.com relay:smtp.mailservice.com
user2@serv11.company.com relay:smtp.mailservice.com
- Создать файл /etc/mail/genericstableсо следующими строками:
user1 autoemail@company.com
user2 autoemail@company.com
- Создать файл /etc/mail/generics-domainsсо следующими строками:
localhost
localdomain
localhost.localdomain
serv11.company.com
company.com
- Скачать M4-шаблон smarttable.m4. Скачивать отсюда, локальная копия или взять из более нового пакета, локальная копия. Пакет sendmail-cf при этом, конечно же, должен быть уже установлен.
# wget http://anfi.homeunix.org/sendmail/smarttable.m4
# mv smarttable.m4 /usr/share/sendmail-cf/feature/
- Перейти в /etc/mail, перестроить хэш-таблицы и конфиг, перестартовать sendmail:
# cd /etc/mail
# makemap hash smarttable < smarttable
# makemap hash genericstable < genericstable
# makemap hash access < access
# make
# service sendmail restart
Вообще, много интересных деталей освещено в http://www.sendmail.org/faq, на буржуйском, естественно.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Tuesday, November 1st, 2011 | | 2:37 pm |
Установка размера пямяти в Xen Dom0 Иногда хочется выделить для Xen Domain-0 (Dom0) побольше памяти. Например, гигабайт вместо 574 Мб, которые Oracle VM выдаёт для Dom0 по умолчанию. Это можно сделать динамически («на лету») от root-а с помощью команды xm mem-set:
[root@ovm01 ~]# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 574 8 r----- 1647.7
[root@ovm01 ~]# xm mem-set Domain-0 1024
[root@ovm01 ~]# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 1024 8 r----- 1649.0
Но после перезагрузки сервера эта настройка будет сброшена к значению по умолчанию в 574 Мб. Правильный способ сохранить настройку при перезагрузке — изменение параметра ядра dom0_mem в конфиге загрузчика GRUB /boot/grub/grub.conf:
[root@ovm01 ~]# cat /boot/grub/grub.conf
...skip...
title Oracle VM Server (xen-3.4.0 2.6.18-128.2.1.4.9.el5ovs)
root (hd0,0)
kernel /xen-32bit.gz dom0_mem=574M
module /vmlinuz-2.6.18-128.2.1.4.9.el5xen ro root=/dev/sda2
module /initrd-2.6.18-128.2.1.4.9.el5xen.img
title Oracle VM Server (xen-64-3.4.0 2.6.18-128.2.1.4.9.el5ovs)
root (hd0,0)
kernel /xen-64bit.gz dom0_mem=574M
module /vmlinuz-2.6.18-128.2.1.4.9.el5xen ro root=/dev/sda2
module /initrd-2.6.18-128.2.1.4.9.el5xen.img
После изменения значения параметра ядра dom0_mem на, например 1024M, после перезагрузки сервера, Domain-0 запустится с гигабайтом памяти.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Saturday, October 29th, 2011 | | 11:39 pm |
История паролей в trusted HP-UX Я просто оставлю это здесь. Иногда бывает надо поставить юзеру тот же пароль, который был недавно. Например, если это какой-то служебный аккаунт и пароль захардкоден («hardcoded») в каком-то софте или скрипте. В trusted HP-UX вам не позволят установить тот же пароль, который был ранее, даже от root-а:
oradb02# passwd oraprd
Changing password for oraprd
Last successful password change for oraprd: Sat Jan 66 66:66:66 1666
Last unsuccessful password change for oraprd: NEVER
Do you want (choose one letter only):
pronounceable passwords generated for you (g)
a string of letters generated (l) ?
to pick your passwords (p) ?
Enter choice here: p
New password:
You may not re-use a previously used password.
Что же делать? Вариант раз — грохнуть файл с историей паролей. Перед этим проверим, что система действительно trusted:
oradb02# grep ^root /etc/passwd
root:*:0:3::/:/sbin/sh
Звёздочка в поле пароля означает, что система trusted, иначе там был бы хэш пароля. Файлы с историей паролей лежат в /tcb/files/auth/system/pwhist. Файлы бинарные, поэтому надо удалять их целиком, возможно, уничтожая историю паролей для других юзеров:
oradb02# ls -la /tcb/files/auth/system/pwhist
total 32
drwx------ 2 root sys 96 Jan 66 16:00 .
drwxrwx--x 3 root sys 96 Jan 66 16:00 ..
-rw------- 1 root sys 14336 Jan 66 16:66 pwhist_0
oradb02# rm /tcb/files/auth/system/pwhist/pwhist_0
После удаления истории старый пароль для юзера можно будет установить даже от него самого. Вариант два (предпочтительный) — временно или постоянно изменить размер хранящейся истории в файле /etc/default/security:
oradb02# grep HIST /etc/default/security
PASSWORD_HISTORY_DEPTH=15
Установить его, например, в ноль. Хотя это, разумеется, адский security violation.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Sunday, October 23rd, 2011 | | 11:22 pm |
Диапазон временных портов Иногда внезапно приходит время поговорить о королях и о капусте о временных (динамически назначаемых) портах.
TCP/IP соединение состоит из двух конечных точек, и каждая конечная точка состоит из IP-адреса и номер порта. Поэтому, когда клиент подключается к серверу, установленное соединение может рассматриваться как набор из 4 значений (IP сервера, порт сервера, IP клиента, порт клиента). Обычно три значения из четырех уже известны — клиентская машина использует свой собственный IP-адрес и при подключении к удаленному сервису, IP-адрес сервера и номер порта службы должны быть уже известны.
Не совсем очевидно то, что, когда соединение установлено, оно использует порт и на стороне клиента. Если клиентская программа не запрашивает явно определенный номер порта, то используется временный (динамически назначаемый системой) номер порта. Временные порты выдаются IP-стеком машины, и назначаются из определенного диапазона портов, выделенного для этой цели. Когда соединение разрывается, временный порт становится доступен для повторного использования, хотя большинство реализаций IP-стека не будет повторно использовать этот номер порта, пока все доступные временные порты из диапазона не будут использованы. Так что, если клиентская программа переподключится, ей будет назначен другой номер порта для её стороны нового соединения. Аналогично, для UDP/IP, когда клиент посылает датаграмму с не заданного номер порта, номер порта назначается автоматически системой, так что сервер на другом конце соединения может ответить отправителю.
Некоторые программы (например, Oracle) могут требовать установить определённый диапазон временных портов. Здесь описано как сделать это на разных операционных системах и не потерять эти настройки при перезагрузке.
AIX использует команду no, чтобы установить параметры сети. AIX использует два разных диапазона временных портов, по одному для TCP и UDP, и оба имеют значения по-умолчанию от 32768 до 65535:
root@aix:/# uname -a
AIX aix 3 5 00CE49XXXXXX
root@aix:/# /usr/sbin/no -a | fgrep ephemeral
tcp_ephemeral_high = 65535
tcp_ephemeral_low = 32768
udp_ephemeral_high = 65535
udp_ephemeral_low = 32768
Изменить диапазоны по-умолчанию можно с помощью команды no. Вот так можно установить диапазоны временных портов для TCP и UDP c 49152 до 65535:
root@aix:/# /usr/sbin/no -o tcp_ephemeral_low=49152 -o tcp_ephemeral_high=65535
Setting tcp_ephemeral_low to 49152
Setting tcp_ephemeral_high to 65535
root@aix:/# /usr/sbin/no -o udp_ephemeral_low=49152 -o udp_ephemeral_high=65535
Setting udp_ephemeral_low to 49152
Setting udp_ephemeral_high to 65535
Установка этих параметров должна быть сделана каждый раз при запуске системы. Один из способов сделать это заключается в редактировании файла /etc/rc.tcpip и вставке команд no перед тем, как скрипт начинает запускать сетевые демоны.
Диапазон временных портов по-умолчанию от 49152 до 65535, как определено в файле /usr/include/netinet/in.h:
#define IPPORT_RESERVED 1024
#define IPPORT_DYNAMIC 49152
#define IPPORT_DYNAMIC_LAST 65535
Похоже, не существует run-time настройки ядра для этого (то есть не доступны соответствующие sysctl параметры), так что для изменения диапазона нужно будет перекомпилировать ядро после изменения этих определений.
FreeBSD использует три диапазона: обычный диапазон временных портов, альтернативный «высокий» диапазон временных портов, альтернативный «низкий» зарезервированный диапазон портов для программ, использующих функцию rresvport(). Эти диапазоны кратко описаны в системном заголовочном файле /usr/include/netinet/in.h:
/*
* Default local port range, used by both IP_PORTRANGE_DEFAULT
* and IP_PORTRANGE_HIGH.
*/
#define IPPORT_HIFIRSTAUTO 49152
#define IPPORT_HILASTAUTO 65535
Запуск sysctl показывает значения по-умолчанию для этих диапазонов:
[root@cool ~]# uname -mnrs
FreeBSD cool.server.com 8.2-RELEASE-p4 amd64
[root@cool ~]# /sbin/sysctl -a | fgrep net.inet.ip.portrange
...skip...
net.inet.ip.portrange.reservedlow: 0
net.inet.ip.portrange.reservedhigh: 1023
net.inet.ip.portrange.hilast: 65535
net.inet.ip.portrange.hifirst: 49152
net.inet.ip.portrange.last: 65535
net.inet.ip.portrange.first: 10000
net.inet.ip.portrange.lowlast: 600
net.inet.ip.portrange.lowfirst: 1023
Чтобы изменить эти значения, отредактируйте файл /etc/sysctl.conf и добавьте (или измените существующие) строки, такие как:
net.inet.ip.portrange.first = 32768
net.inet.ip.portrange.last = 49151
net.inet.ip.portrange.hifirst = 49152
net.inet.ip.portrange.hilast = 65535
Это заставит обычный диапазон временных портов использовать порты от 32768 до 49151, альтернативный диапазон от 49152 до 65535, и оставит зарезервированный диапазон портов без изменений. Система должна быть перезагружена, чтобы изменения в /etc/sysctl.conf вступили в силу, хотя можно вызвать команду sysctl вручную, чтобы внести изменения сразу.
HP-UX использует команду ndd для изменения настраиваемых параметров IP-стека. Временные порты на HP-UX могут быть настроены индивидуально для TCP и UDP, поэтому на самом деле существует два отдельных диапазона временных портов. HP-UX также предоставляет средства для изменения привилегированного диапазона портов (эти порты могут использовать только процессы, запущенные с привилегиями суперпользователя).
Ниже показано, как запросить существующие значения для временных портов TCP, а также изменить их диапазон:
serv02# uname -a
HP-UX serv02 B.11.31 U ia64 4272XXXXXX unlimited-user license
serv02# /usr/bin/ndd /dev/tcp tcp_smallest_anon_port tcp_largest_anon_port
9000
65500
serv02# /usr/bin/ndd /dev/udp udp_smallest_anon_port udp_largest_anon_port
9000
65500
serv02# /usr/bin/ndd -set /dev/tcp tcp_smallest_anon_port 50000
serv02# /usr/bin/ndd -set /dev/tcp tcp_largest_anon_port 61000
serv02# /usr/bin/ndd -set /dev/udp udp_smallest_anon_port 50000
serv02# /usr/bin/ndd -set /dev/udp udp_largest_anon_port 61000
Заметьте, что если вы измените диапазон портов, вам придётся делать это каждый раз при загрузке системы. Предпочтительный способ сделать это для HP-UX заключается в редактировании файла /etc/rc.config.d/nddconf и добавлении записей. Например, вы можете добавить эти строки в ваш файл /etc/rc.config.d/nddconf:
TRANSPORT_NAME[0]=tcp
NDD_NAME[0]=tcp_largest_anon_port
NDD_VALUE[0]=65500
TRANSPORT_NAME[1]=tcp
NDD_NAME[1]=tcp_smallest_anon_port
NDD_VALUE[1]=9000
TRANSPORT_NAME[2]=udp
NDD_NAME[2]=udp_largest_anon_port
NDD_VALUE[2]=65500
TRANSPORT_NAME[3]=udp
NDD_NAME[3]=udp_smallest_anon_port
NDD_VALUE[3]=9000
Если вы сделаете это, убедитесь, что записи нумеруются соответственно. Например, если 4 записи уже присутствуют, то вы увидите их пронумерованными от 0 до 3. В этом случае записи которые вы добавляете должны быть пронумерованы после существующих записей.
К сожалению, IRIX, кажется, не позволяет настроить диапазон временных портов и он статически установлен от 1024 до 65535. Вот выдержка из файла /usr/include/netinet/in.h:
#define IPPORT_RESERVED 1024
#define IPPORT_MAXPORT 65535
Также в команде systune не указаны соответствующие параметры, хотя другие параметры TCP и IP могут быть изменены.
Linux позволяет просмотреть и изменить диапазон временных портов просто используя файл /proc/sys/net/ipv4/ip_local_port_range или параметр ядра net.ipv4.ip_local_port_range:
[root@ololo ~]# uname -a
Linux ololo.server.com 2.6.18-128.2.1.4.37.el5xen #1 SMP Sat Apr 9 05:30:32 EDT 2011 i686 i686 i386 GNU/Linux
[root@ololo ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
[root@ololo ~]# sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 61000
Чтобы поменять границы диапазона, выполните от root:
[root@ololo ~]# echo "49152 65535" > /proc/sys/net/ipv4/ip_local_port_range
или
[root@ololo ~]# sysctl -w net.ipv4.ip_local_port_range="49152 65535"
net.ipv4.ip_local_port_range = 49152 65535
Заметьте, что это нужно будет делать каждый раз при загрузке системы. Так что добавьте одну из команд выше в стартовый системный скрипт вроде /etc/rc.local или (более правильный способ) в файл /etc/sysctl.conf:
[root@ololo ~]# grep ip_local_port_range /etc/sysctl.conf
net.ipv4.ip_local_port_range = 49152 65535
OpenBSD использует команду sysctl чтобы настраивать параметры ядра. У временных портов в OpenBSD на самом деле два отдельных диапазона, обычный диапазон и альтернативный «высокий» диапазон. Ниже приведен пример, показывающий, как использовать sysctl, чтобы просмотреть текущую конфигурацию этих двух диапазонов:
# /usr/sbin/sysctl net.inet.ip.portfirst net.inet.ip.portlast net.inet.ip.porthifirst net.inet.ip.porthilast
net.inet.ip.portfirst = 1024
net.inet.ip.portlast = 49151
net.inet.ip.porthifirst = 49152
net.inet.ip.porthilast = 65535
Чтобы изменить границы диапазонов, отредактируйте файл /etc/sysctl.conf и добавьте (или измените существующие) строки, такие как:
net.inet.ip.portfirst=32768
net.inet.ip.portlast=49151
net.inet.ip.porthifirst=49152
net.inet.ip.porthilast=65535
Эти настройки устанавливают границы обычного диапазона временных портов от 32768 до 49151, а альтернативного диапазона от 49152 до 65535. Система должна быть перезагружена чтобы изменения в /etc/sysctl.conf вступили в силу, хотя вы можете использовать команду sysctl , чтобы применить изменения сразу.
Solaris использует команду ndd для изменения настраиваемых параметров IP-стека. Временные порты в Solaris могут быть настроены отдельно для TCP и UDP, поэтому на самом деле существует два отдельных диапазона временных портов. Solaris также предоставляет средства для изменения привилегированного диапазона портов (эти порты могут использовать только процессы, запущенные с привилегиями суперпользователя).
Ниже показано, как запросить существующие значения для временных портов TCP, а также изменить их диапазон от 49152 до 61000:
[root@pysh /]# uname -a
SunOS pysh 5.10 Generic_118833-17 sun4v sparc SUNW,Sun-Fire-T200
[root@pysh /]# /usr/sbin/ndd /dev/tcp tcp_smallest_anon_port tcp_largest_anon_port
32768
65535
[root@pysh /]# /usr/sbin/ndd /dev/udp udp_smallest_anon_port udp_largest_anon_port
32768
65535
[root@pysh /]# /usr/sbin/ndd -set /dev/tcp tcp_smallest_anon_port 49152
[root@pysh /]# /usr/sbin/ndd -set /dev/tcp tcp_largest_anon_port 61000
[root@pysh /]# /usr/sbin/ndd -set /dev/udp udp_smallest_anon_port 49152
[root@pysh /]# /usr/sbin/ndd -set /dev/udp udp_largest_anon_port 61000
Заметьте, что если вы хотите изменить диапазон значений, вы должны делать это каждый раз при загрузке системы. Вы можете добавить эти команды в какой-нибудь системный стартовый скрипт типа /etc/rc3.d/S99local.
Tru64 Unix от Compaq (бывший Digital Unix и Digital OSF/1) использует традиционный для BSD-систем диапазон от 1024 до 4999 как диапазон временных портов. Следующий пример иллюстрирует использование команды sysconfig для запроса текущего диапазона:
# /sbin/sysconfig -q inet | fgrep ipport_userreserved
ipport_userreserved = 5000
ipport_userreserved_min = 1024
Следующий пример показывает как с помощью sysconfig установить предпочтительный диапазон временных портов:
# /sbin/sysconfig -r inet ipport_userreserved=65535 ipport_userreserved_min=49152
ipport_userreserved: reconfigured
ipport_userreserved_min: reconfigured
# /sbin/sysconfig -q inet | fgrep ipport_userreserved
ipport_userreserved = 65535
ipport_userreserved_min = 49152
Команда sysconfig применяет изменения только для текущего цикла загрузки. Для того, чтобы изменения автоматически применялись каждый раз при загрузке системы, вы можете либо создать системный стартовый скрипт для запуска команды sysconfig, либо используйте команду sysconfigdb для настройки файла /etc/sysconfigtab. Вот пример:
/sbin/sysconfigdb -a -f /tmp/inet.stanza inet
Файл /tmp/inet.stanza который мы используем должен выглядеть следующим образом. Убедитесь, что этом файле на первой строке стоит только слово inet: а перед следующими двумя строками стоит один символ табуляции (не используйте пробелы).
inet:
ipport_userreserved = 65535
ipport_userreserved_min = 49152
Всё, что касается Windows — это сами. Для установки диапазона временных портов почитайте следующие статьи из базы знаний Microsoft (на английском):
Вообще говоря, всё что выше — это вольный перевод вот этой статьи (локальная копия вот) от аффтараф сервера NcFTPd. За что им ссылка, всяческий респект и большая уважуха.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Sunday, August 28th, 2011 | | 6:01 am |
Установка bitcoin mining pool на CentOS 6 Иногда бывает надо помайнить биткойны. Третьего дня я внезапно решил построить личный bitcoin mining pool на CentOS 6. Оборудование стандартное — официальный bitcoind в качестве, собственно, биткойн-демона, pushpoold как оператор пула и cgminer как mining rig. CentOS — потому что больше всего я работаю с RedHat, а шесть — потому что bitcoind, pushpoold и cgminer требуют версий библиотек (а именно — curl), которые есть только в нём. Бэкпортировать их на пятерку — гемор и никто не будет. CentOS — строго 64-битный, иначе производительность cgminer-a будет чуть менее, чем никакая.
На момент написания статьи последними были и использовались следующие версии:
- Bitcoin 0.3.24, список доступных версий, локальная копия здесь.
- Pushpool 0.5.1, список доступных версий, официальная форумная ветка здесь, локальная копия здесь.
- CGMiner 1.6.1 64-bit, список доступных версий, официальная форумная ветка здесь, локальная копия здесь.
- Необходимая библиотека Jansson 2.1, список доступных версий, хомяк здесь, локальная копия здесь.
- Необходимый пакет AMD Accelerated Parallel Processing SDK v2.5 64bit, список доступных версий, хомяк здесь, локальная копия двух нужных из него файлов здесь.
Итак. Ready? Steady… Go!
Используем минимальный дистрибутив CentOS 6.0, чтобы не было ничего лишнего, репозитории только официальные. Сейчас список транзакций биткойнов, который первым делом скачает биткойн-демон, занимает около 2 гигабайт, поэтому свободного места должно быть гигабайта три, а лучше пять. В минимальной инсталляции почти ничего нет, включая gcc:
[root@haebtp ~]# uname -a
Linux haebtp 2.6.32-71.el6.x86_64 #1 SMP Fri May 20 03:51:51 BST 2011 x86_64 x86_64 x86_64 GNU/Linux
[root@haebtp ~]# cat /etc/centos-release
CentOS Linux release 6.0 (Final)
[root@haebtp ~]# gcc
-bash: gcc: command not found
[root@haebtp ~]# df -hP /
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 5.5G 643M 4.6G 13% /
Создаём юзера bitcoin, из-под которого будем запускать всё относящееся. Компилятор будет нужен для, собственно, компилирования исходников, поэтому ставим группу «Development tools» (скачивать примерно 116 Мб) и wget заодно, затем перегружаемся, так как системная библиотека glibc скорее всего тоже обновилась:
[root@haebtp ~]# useradd bitcoin
[root@haebtp ~]# yum groupinstall 'Development tools'
[root@haebtp ~]# yum install wget
[root@haebtp ~]# shutdown -r now
Протокол bitcoin довольно чувствителен к точности времени на сервере, поэтому устанавливаем пакеты ntp и ntpdate. Далее используем ntpdate для установки точного времени на сервере и запускаем ntpd-демон.
[root@haebtp ~]# yum install ntpdate ntp
[root@haebtp ~]# ntpdate 0.pool.ntp.org
66 Aug 66:11:28 ntpdate[1318]: step time server 204.9.54.119 offset 14433.829011 sec
[root@haebtp ~]# chkconfig --level 2345 ntpd on
[root@haebtp ~]# service ntpd start
Starting ntpd: [ OK ]
Никакого GUI, так как мы настраиваем trueЪ hardcore сервер. Которые хотят гуёв — могут сами поразбираться какие иксовые пакеты и библиотеки ставить. Качаем дистрибутив с bitcoind, кладём куда надо, для гарантии проверяем, что все нужные ему библиотеки имеются. Если в выводе ldd будет что-то «not found» (хотя и не должно) — надо это починить путём установки отсутствующей библиотеки.
[root@haebtp ~]# wget http://sourceforge.net/projects/bitcoin/files/Bitcoin/bitcoin-0.3.24/bitcoin-0.3.24-linux.tar.gz/download
[root@haebtp ~]# tar -xzf bitcoin-0.3.24-linux.tar.gz
[root@haebtp ~]# cp bitcoin-0.3.24/bin/64/bitcoind /usr/local/bin/
[root@haebtp ~]# ldd /usr/local/bin/bitcoind
...
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fd7904ce000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd79100f000)
Читать запись полностью » Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Sunday, August 21st, 2011 | | 7:29 am |
Разные штуки с sendmail-ом // Misc things with sendmail Иногда бывает нужно сделать с sendmail-ом разные штуки. Ниже описана пара примеров. Предполагается sendmail с дефолтными настройками и установленным пакетом для компиляции конфиг-файлов .mc в .cf.
- Подмена адреса получателя
Ну, чтобы пришло письмо для одного адреса, а sendmail его внезапно переслал на другой. Это просто, все знают. Описываем алиас в /etc/aliases и обновляем таблицу алиасов командой newaliases или перезапуском почтовика service sendmail restart.
[root@ololo.ru ~]# cat /etc/aliases
ololo: someone@somewhere.com
olo@domain.com: someone@somewhere.com
Если алиас без доменной части, как в первой строчке, то на someone@somewhere.com перенаправятся все письма для ololo или ololo@ololo.ru. Если сейчас запустить newaliases, то он ругнётся на вторую строчку:
[root@ololo.ru ~]# newaliases
/etc/aliases: line 2: olo@domain.com... cannot alias non-local names
Что справедливо, ибо этот сервер – не domain.com. Надо добавить domain.com в /etc/mail/local-host-names и перезапустить sendmail, чтобы письма пришедшие на olo@domain.com пересылались на someone@somewhere.com:
[root@ololo.ru ~]# cat /etc/mail/local-host-names
# local-host-names - include all aliases for your machine here.
domain.com
- Подмена адреса отправителя
Ну, чтобы в письмах от кого-то, идущих через наш сервер, подменялся адрес отправителя. Для этого включаем фичу genericstable в sendmail.mc, добавляем домен для подмены или файл с доменами вот так:
FEATURE(`genericstable')dnl
GENERICS_DOMAIN(`localhost.localdomain')dnl
Или вот так:
FEATURE(`genericstable')dnl
GENERICS_DOMAIN_FILE(`/etc/mail/generics-domains')dnl
Далее пишем в файл /etc/mail/generics-domains список доменов, в почте от адресов из которых, будет изменён адрес отправителя:
[root@ololo.ru ~]# cat /etc/mail/generics-domains
localdomain
localhost.localdomain
ololo.ru
domain1.com
domain2.com
Далее пишем в файл /etc/mail/genericstable, собственно, таблицу подмены адресов отправителей. Скомпилированная таблица /etc/mail/genericstable.db будет создана при перезапуске sendmail, ну или можно создать ручками с помощью команды makemap:
[root@ololo.ru ~]# cat /etc/mail/genericstable
root someone@somewhere.com
test@domain1.com someone1@somewhere.com
test@domain2.com someone2@somewhere.com
[root@ololo.ru ~]# makemap hash /etc/mail/genericstable.db < /etc/mail/genericstable
Перекомпилируем конфиг, перезапускаем sendmail, и теперь почта от локального root будет отсылаться от имени someone@somewhere.com. В проходящей через сервер почте от test@domain1.com и test@domain2.com будет изменён адрес отправителя на someone1@somewhere.com и someone2@somewhere.com соответственно.
Иногда требуется всю исходящую почту переслать для дальнейшей обработки на какой-то другой почтовый сервер. Например, если это корпоративный почтовый сервер, который только и имеет выход во внешние интернеты. Для этого надо только раскомментировать строчку, задающую SMART_HOST в sendmail.mc или напрямую дописать адрес смарт-релэя после команды DS в sendmail.cf. После этого, естественно, перекомпилировать конфиг и перезапустить sendmail.
[root@ololo.ru ~]# grep SMART /etc/mail/sendmail.mc
define(`SMART_HOST',`relay.corp.com')dnl
[root@ololo.ru ~]# grep ^DS /etc/mail/sendmail.cf
DSrelay.corp.com
Если надо таким способом обрабатывать почту не для всех, а только для некоторых доменов, надо использовать фичу mailertable. В дефолтном конфиге она должна быть включена. В /etc/mail/mailertable задаём для каких доменов куда шлём почту. Детальный формат файла mailertable смотреть здесь.
[root@ololo.ru mail]# grep mailertable /etc/mail/sendmail.mc
FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl
[root@ololo.ru mail]# cat /etc/mail/mailertable
testdomain.ru esmtp:somewhere.ru
Перекомпилируем конфиг, mailertable, перезапускаем sendmail, шлём письмо на olo@testdomain.ru и видим в логе волшебное:
Aug 66 66:66:66 ololo sendmail[5112]: p7L2kfDM005110: to=<olo@testdomain.ru>,
ctladdr=<root@ololo.ru> (0/0), delay=00:00:01, xdelay=00:00:01, mailer=esmtp, pri=120351,
relay=somewhere.ru. [89.189.176.21], dsn=2.0.0, stat=Sent (Ok: queued as 28BAA1AFC098)
Письма на другие домены будут уходить старым способом - на MX-ы доменов.
- Пересылка на сервер требующий SMTP-авторизации
Многие сервера требуют авторизацию при отправке, чтобы не допустить рассылку спама через себя. Например, на сервере могут храниться почтовые ящики пользователей домена, чтобы они забирали свою почту по POP3/IMAP. SMTP-сервер может требовать у пользователя при отправке авторизоваться своим POP3-паролем, иначе скажет "Relay access denied". Этот способ действительно сильно уменьшает спам.
Предположим, у нас настроен смарт-релэй somewhere.ru. Также предположим, что он принимает входящую почту на порту 587 и поддерживает следующие способы авторизации: DIGEST-MD5, CRAM-MD5, PLAIN, LOGIN. Добавляем эти строки в sendmail.mc, перекомпилируем конфиг, перезапускаем sendmail.
define(`SMART_HOST',`somewhere.ru')dnl
define(`RELAY_MAILER',`esmtp')dnl
define(`RELAY_MAILER_ARGS', `TPC $h 587')dnl
define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl
Почтовый сервер требует авторизации, поэтому при попытке переслать через него почту куда-то наружу мы получим эпичный отказ:
Aug 66 66:66:66 ololo sendmail[14112]: p7L3UxGf014110: to=<olo@testdomain.ru>,
ctladdr=<root@ololo.ru> (0/0), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=120355,
relay=somewhere.ru. [89.189.176.21], dsn=5.7.1, stat=Service unavailable
Мы знаем, что somewhere.ru принимает почту от пользователя someone@somewhere.ru с паролем mwahaha. Простой способ задать это - добавить строчку в /etc/mail/access и перезапустить sendmail.
[root@ololo.ru ~]# tail -1 /etc/mail/access
AuthInfo:somewhere.ru "U:someone@somewhere.ru" "P:mwahaha" "M:LOGIN"
Здесь после M указан способ авторизации, в данном случае - LOGIN. После такой настройки почтовый сервер somewhere.ru принимает наше письмо к пересылке:
Aug 66 66:66:66 ololo sendmail[14729]: p7L3Y55C014727: to=<olo@testdomain.ru>,
ctladdr=<root@ololo.ru> (0/0), delay=00:00:03, xdelay=00:00:03, mailer=relay, pri=120367,
relay=somewhere.ru. [89.189.176.21], dsn=2.0.0, stat=Sent (Ok: queued as 598041AFC08A)
Более правильный путь - использование отдельного файла /etc/mail/authinfo для хранения информации об авторизации. В файле sendmail.mc необходимо включить фичу authinfo, заполнить файл информацией и скомпилировать его:
[root@ololo.ru ~]# grep authinfo sendmail.mc
FEATURE(`authinfo', `hash /etc/mail/authinfo')dnl
[root@ololo.ru ~]# cat /etc/mail/authinfo
AuthInfo:somewhere.ru "U:someone@somewhere.ru" "P:mwahaha" "M:LOGIN"
[root@ololo.ru ~]# makemap hash /etc/mail/authinfo < /etc/mail/authinfo
После рестарта sendmail он будет пересылать почту через somewhere.ru, авторизуясь на нём как someone@somewhere.ru. И будет через это счастье.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Wednesday, August 17th, 2011 | | 12:19 am |
Увеличение файла образа виртуального сервера Xen // Enlarging Xen guest image file Иногда бывает виртуальный сервер, виртуализованный с помощью Xen, и его диск является простым файлом в файловой системе хост-машины. И иногда внезапно его бывает надо поширить. Чтобы потом увеличить файловую систему внутри него. Тонкость в том, что нельзя затереть ни байта из уже имеющегося файла – надо добавить нулей строго после конца файла до необходимого размера.
Предположим, что у нас есть образ диска виртуалки System.img размером 10 миллионов байт (специально, чтобы двоично некругло было) и его надо увеличить до 200 мегабайт (двоичных). Для проверки посчитаем от него (точнее, от его дампа od) md5-сумму, чтобы потом сравнить с первыми 10 миллионами байт увеличенного файла, чтобы быть уверенными, что ничего не перезаписано. Также посмотрим на байты в его конце. Также посмотрим сколько блоков файл реально занимает на диске командой stat (она показывает, сколько блоков занимает сам файл плюс блоки его inode).
[root@ololo.ru ~]# ls -la System.img
-rw-r--r-- 1 root root 10000000 Aug 16 23:45 System.img
[root@ololo.ru ~]# od -t x1 System.img | md5sum -
b81060099fb87c65e5ecebc8b50b810f -
[root@ololo.ru ~]# od -t x1 -N 10000000 System.img | md5sum -
b81060099fb87c65e5ecebc8b50b810f -
[root@ololo.ru ~]# od -A d -t x1 System.img | tail -3
9999968 a1 ac 5a 65 bc e9 e1 a5 31 02 0f 27 80 bc 60 10
9999984 b5 e8 38 1e 08 8d c3 76 7a 52 81 e7 68 73 ed 0e
10000000
[root@ololo.ru ~]# stat -c "%b %B" System.img
19568 512
Наконец, начинаем ширить. Виртуальный сервер перед этим, естественно, останавливаем. Я не знаю способ заставить ядро Linux перечитать размер физического устройства, если это не physical volume от LVM. А в случае с диском с корневым разделом это не LVM, поскольку /boot не в LVM-е.
- Вариант раз – разрежённый файл
Простой способ – записать блок размером в мегабайт в конец файла на смещении «размер результата в мегабайтах минус один»:
[root@ololo.ru ~]# dd if=/dev/zero of=System.img bs=1M conv=notrunc count=1 seek=199
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.002694 seconds, 389 MB/s
В результате получим разрежённый (sparse) файл, в котором между старым содержимым и последним мегабайтом нулей, записанных с помощью dd – «дырка». Тепрь посмотрим на размер файла. Посмотрим на md5-сумму первых 10 миллионов байт, чтобы убедится, что исходные данные не тронуты. Посмотрим на сами байты. Посмотрим, сколько блоков теперь реально занимает файл:
[root@ololo.ru ~]# ls -la System.img
-rw-r--r-- 1 root root 209715200 Aug 17 00:02 System.img
[root@ololo.ru ~]# od -t x1 -N 10000000 System.img | md5sum -
b81060099fb87c65e5ecebc8b50b810f -
[root@ololo.ru ~]# od -A d -N 10000016 -t x1 System.img | tail -3
9999984 b5 e8 38 1e 08 8d c3 76 7a 52 81 e7 68 73 ed 0e
10000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
10000016
[root@ololo.ru ~]# stat -c "%b %B" System.img
21624 512
Видим, что результирующий файл размером ровно 200 (двоичных) мегабайт и md5-сумма его (точнее, его od дампа) первых 10 миллионов байт не изменилась – т.е. исходные данные не затёрлись. Сами последние байты также совпадают, дальше идут нули. И, наконец, сам файл (вместе с блоками inode) занимает всего 21624 блока по 512 байт – это всего 10.55 мегабайт реального дискового пространства, т.е. файл действительно разрежённый.
К сожалению, sparse-файл – очень плохое решение для образа виртуальной машины. Она очень ловко встанет колом с неизвестными последствиями, когда на диске хост-машины закончится место и sparse-файлу неоткуда будет брать новые блоки. Поэтому выделяем всё нужное место для файла образа виртуалки заранее.
- Вариант два – обычный файл
Здесь проблема в том, чтобы не перезаписать старые данные. Т.е. надо дописать в конец файла ровно «новый размер минус старый размер» нулей со смещения «старый размер». Если работать с байтовой точностью (т.е. bs=1), то файл будет дописываться ооочень долго. Поэтому будем считать в 512-байтных блоках, используя несколько математики. Итак (200 – размер в мегабайтах, который мы хотим получить в результате):
[root@ololo.ru ~]# ls -la System.img
-rw-r--r-- 1 root root 10000000 Aug 17 00:22 System.img
[root@ololo.ru ~]# srcsize=10000000
[root@ololo.ru ~]# tgtsize=`expr 200 \* 1024 \* 1024`
[root@ololo.ru ~]# echo $srcsize $tgtsize
10000000 209715200
Записали в переменные исходный и конечный размер в байтах. Теперь, собственно, увеличение:
[root@ololo.ru ~]# dd if=/dev/zero of=System.img bs=512 seek=`expr \( $srcsize - 1 \) / 512 + 1` count=`expr \( $tgtsize - 1 \) / 512 - \( $srcsize - 1 \) / 512`
390068+0 records in
390068+0 records out
199714816 bytes (200 MB) copied, 1.73787 seconds, 115 MB/s
Проверяем, что размер теперь ровно 200 мегабайт, первые 10 миллионов байт не изменились и сколько блоков занимает сейчас файл на диске:
[root@ololo.ru ~]# ls -la System.img
-rw-r--r-- 1 root root 209715200 Aug 17 00:34 System.img
[root@ololo.ru ~]# od -t x1 -N 10000000 System.img | md5sum -
b81060099fb87c65e5ecebc8b50b810f -
[root@ololo.ru ~]# od -A d -N 10000016 -t x1 System.img | tail -3
9999984 b5 e8 38 1e 08 8d c3 76 7a 52 81 e7 68 73 ed 0e
10000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
10000016
[root@ololo.ru ~]# stat -c "%b %B" System.img
410008 512
410008 дисковых блоков – ровно столько занимает неразрежённый файл размером 200 мегабайт на диске. Double-check:
[root@ololo.ru ~]# dd if=/dev/zero of=SystemTest.img bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 0.514271 seconds, 408 MB/s
[root@ololo.ru ~]# stat -c "%b %B" SystemTest.img
410008 512
[root@ololo.ru ~]# rm -f SystemTest.img
410008 == 410008, совпадает. Итак, теперь у нас есть увеличенный до нужного размера протяжённый (не sparse) файл образа виртуальной машины с нетронутыми старыми данными, что и требовалось.
Подобного результата можно также добиться используя опции dd conv=notrunk oflag=append size = «новый размер минус старый размер», но не все версии dd умеют опцию oflag=append.
- Монтирование разделов из файла образа
Все знают как смонтировать файловую систему из файла с её образом. Ну, там «mount -o loop …» и всё такое. Что делать если в образе разделы MBR и только внутри них файловые системы? Использовать kpartx:
[root@ololo.ru ~]# kpartx -av System.img
add map loop0p1 : 0 5240832 linear /dev/loop0 2048
add map loop0p2 : 0 1048576 linear /dev/loop0 5242880
[root@ololo.ru ~]# losetup -a
/dev/loop0: [0019]:100 (System.img)
[root@ololo.ru ~]# ls -la /dev/loop0* /dev/mapper/loop0*
brw-r----- 1 root disk 7, 0 Aug 18 12:23 /dev/loop0
brw-r--r-- 1 root root 253, 2 Aug 18 12:35 /dev/mapper/loop0p1
brw-r--r-- 1 root root 253, 3 Aug 18 12:35 /dev/mapper/loop0p2
Сейчас у нас есть блочное устройство /dev/loop0, представляющее собой весь диск и устройства /dev/mapper/loop0p1 и /dev/mapper/loop0p2 – разделы этого диска. Далее стандартно:
[root@ololo.ru ~]# mkdir -p /mnt/part1 /mnt/part2
[root@ololo.ru ~]# mount /dev/mapper/loop0p1 /mnt/part1
[root@ololo.ru ~]# mount /dev/mapper/loop0p2 /mnt/part2
/dev/mapper/loop0p2 looks like swapspace - not mounted
mount: you must specify the filesystem type
[root@ololo.ru ~]# df -hP /mnt/part1
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/loop0p1 2.5G 642M 1.8G 27% /mnt/part1
[root@ololo.ru ~]# umount /mnt/part1
[root@ololo.ru ~]# kpartx -v -d System06.img
del devmap : loop0p1
del devmap : loop0p2
loop deleted : /dev/loop0
Ч0рт, второй раздел действительно своп, его нельзя смонтировать. Но с этими устройствами можно работать как с просто диском. Например, fdisk-ом увеличить размер первого раздела и поширить файловую систему на нём с помощью resize2fs.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Saturday, July 30th, 2011 | | 7:17 am |
SFTP и SSH в chroot()-е на Redhat|CentOS 4|5 а также сборка RPM из исходников // Chroot()ed SFTP and Иногда бывает задача отдавать третьей стороне с сервера клиента некоторые файлы. При этом канал отдачи должен быть шифрован и третья сторона не должна иметь доступ к чему-либо еще. Например, банк забирает от клиента некие выписки или платёжки, которые генерит Oracle E-Business Suite. При этом ограничение: клиент ооочень корпоративный и использует строго RedHat/OEL 4/5 для, собственно, Oracle.
В таком виде задача не решается, так как используемый (т.е из официального репозитория) openssh-server-4.3p2 умеет ChrootDirectory, чтобы запихать пользователей в chroot(), но не умеет Match User, чтобы запихать туда только пользователей, под которыми банк будет забирать платёжки. Всякие rssh, jailkit и scponly использовать нельзя, так как их нет в официальном репозитории и костыль. Вобщем, был выбран и одобрен способ сборки последней версии OpenSSH из исходников, учитывая что уж код этого пакета вылизан чуть менее чем полностью.
Дело упрощается тем, что shell-доступ для банка не нужен, только SFTP. Создаём двух пользователей, так как банку нужен доступ к двум разным каталогам, и ставим /sbin/nologin как shell:
bank_sftp1:x:XXX:ZZZ:Bank SFTP User 1:/oracle/app/lockdir1:/sbin/nologin
bank_sftp2:x:XXY:ZZZ:Bank SFTP User 2:/oracle/app/lockdir2:/sbin/nologin
Проверяем, что у нас есть все нужные пакеты для сборки OpenSSH (если чего нет – ставим):
[root@ololo ~]# rpm -qa gcc openssl-devel pam-devel rpm-build
Забираем исходники последней версии OpenSSH (на момент написания – 5.8p2):
[root@ololo ~]# wget ftp://mirror.planetunix.net/pub/OpenBSD/OpenSSH/portable/openssh-5.8p2.tar.gz
Теперь мы готовы построить RPM из этих исходников:
[root@ololo ~]# tar xzf openssh-5.8p2.tar.gz
[root@ololo ~]# cp ./openssh-5.8p2/contrib/redhat/openssh.spec /usr/src/redhat/SPECS/
[root@ololo ~]# cp ./openssh-5.8p2.tar.gz /usr/src/redhat/SOURCES/
[root@ololo ~]# rm -rf openssh-5.8p2.tar.gz openssh-5.8p2/
[root@ololo ~]# cd /usr/src/redhat/SPECS/
[root@ololo SPECS]# perl -i.bak -pe 's/^(%define no_(gnome|x11)_askpass)\s+0$/$1 1/' openssh.spec
[root@ololo SPECS]# rpmbuild -bb openssh.spec
... skip ...
[root@ololo SPECS]# cd /usr/src/redhat/RPMS/`uname -i`
[root@ololo x86_64]# ls
openssh-5.8p2-1.x86_64.rpm
openssh-server-5.8p2-1.x86_64.rpm
openssh-clients-5.8p2-1.x86_64.rpm
[root@ololo x86_64]# rpm -Uvh openssh*rpm
Preparing... ########################################### [100%]
1: openssh ########################################### [100%]
2: openssh-clients ########################################### [100%]
3: openssh-server ########################################### [100%]
Если проявилось сообщение, что новые пакеты конфликтуют с openssh-askpass или openssh-agent – удаляем их с помощью rpm -e. Если проявилось сообщение, что новый конфиг сохранен как /etc/ssh/sshd_config.rpmnew, то исправляем его, чтобы настройки совпадали со старым /etc/ssh/sshd_config и перезаписываем его новым.
Чистим после себя:
[root@ololo ~]# cd /usr/src/redhat
[root@ololo redhat]# rm -rf BUILD/openssh-5.8p2/ RPMS/`uname -i`/openssh*rpm SOURCES/openssh-5.8p2.tar.gz SPECS/openssh.spec*
Теперь надо настроить банковских пользователей, чтобы они могли ходить только по SFTP и были chroot()-ены в своих home-каталогах. Внимание! Они и все каталоги выше этих home-каталогов должны принадлежать root и не иметь прав записи для группы или остальных. Это требование безопасности, иначе при некоторых условиях пользователь может «выбраться» из chroot()-а. (В случае, если shell-доступ не планируется, это требование можно убрать. Только правка исходников. Посмотрите на код функции safely_chroot() в файле session.c)
Итого. Меняем конфиг /etc/ssh/sshd_config:
# override default of no subsystems
Subsystem sftp internal-sftp
Match User bank_sftp1,bank_sftp2
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory %h
ForceCommand internal-sftp
Теперь перезапускаем sshd. Настоятельно рекомендую до этого запустить демон telnet, rsh, экран Xvnc или что-нить подобное, чтобы в случае проблем с новым sshd не потерять удалённый доступ к серверу:
[root@ololo ~]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
Ура, ура. Мы запустили и настроили новый sshd, загнали некоторых пользователей в chroot() и разрешили им только SFTP. Так как паранойя – норма жизни, проверка:
[root@ololo ~]# ssh bank_sftp2@ololo
Password:
This service allows sftp connections only.
Connection to ololo closed.
[root@ololo ~]# scp -r bank_sftp2@ololo:* ./
Password:
protocol error: mtime.sec not delimited
[root@ololo ~]# sftp bank_sftp2@ololo
Password:
Connected to ololo.
sftp> ls
test.txt
sftp> cd ..
sftp> ls
test.txt
sftp> cd /
sftp> ls
test.txt
sftp>
Результат: F*CK YEA!!! \|..|
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Friday, July 1st, 2011 | | 11:12 pm |
Консоли: Начало // Consoles: Inception Ну вот примерно как-то так я иногда работаю. И это еще не самый большой уровень вложенности, да.
1. RDP через корпоративный VPN на корпоративный сервер.
2. RAdmin через клиентский VPN на машину в сети клиента.
3. RDP на клиентский сервер, откуда есть необходимый доступ.
4. Виртуальная консоль от сервера внутри Java-апплета внутри Internet Explorer-а.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Monday, May 9th, 2011 | | 5:42 pm |
Как узнать под каким пользователем я залогинен в MySQL // How to find out what user am I logged as i Иногда бывает надо узнать, под каким пользователем вы зашли на mysql-сервер (вроде whoami или id). Внезапно может оказаться, что пользователь, под которым mysql-client логинится на сервер отличается от пользователя, под которым сервер его пустил. Такое бывает, например, если существует mysql-пользователь с пустым логином и паролем. Смотрится это запросом SELECT USER(), CURRENT_USER();
[root@ololo.ru ~]# mysql -u adminololo -p
Enter password:
Server version: 5.0.45 Source distribution
mysql> SELECT USER(), CURRENT_USER();
+----------------------+----------------+
| USER() | CURRENT_USER() |
+----------------------+----------------+
| adminololo@localhost | @localhost |
+----------------------+----------------+
Здесь USER() – это тот, под кем пытается логиниться mysql-клиент, а CURRENT_USER() – пользователь, под которым сервер авторизовал клиента.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | 5:17 pm |
Грязные трюки с ISPConfig 3 // Dirty tricks with ISPConfig 3 Иногда на сервере бывает система управления сайтами ISPConfig 3 (это штука типа CPanel или Plesk, только бесплатная). И с ней бывает надо сделать некоторые штуки, например.
- Как быстро узнать версию ISPConfig 3
Бывает, внезапно надо узнать его версию, а есть только shell-доступ на сервер и нет доступа в ISPConfig. Быстро посмотреть его версию тогда можно прямо в его файле конфигурации.
[root@ololo.ru ~]# grep APP_VERSION /usr/local/ispconfig/server/lib/config.inc.php
define('ISPC_APP_VERSION', '3.0.3.3');
$conf['app_version'] = ISPC_APP_VERSION;
Разумеется, это работает если ISPConfig 3 установлен в дефолтный каталог /usr/local/ispconfig. Поменяйте этот путь на путь, в котором ISPConfig установлен у вас.
- Включение интернациональных доменов (punycode)
В ISPConfig до версии 3.0.3 не было поддержки интернациональных доменов. Точнее, всё, куда вводились доменные имена, проверялось regex-пом вида /^[\w\.\-\/]{2,255}\.[a-zA-Z]{2,10}[\.]{0,1}$/, который отсекал, например .рф (.xn--p1ai). Замена предпоследних скобочек на [a-zA-Z0-9\-]{2,30} решает проблему. Например, разрешить интернациональные домены в настройках DNS можно, поправив в файле /usr/local/ispconfig/interface/web/dns/form/dns_soa.tform.php:
2 => array ( 'type' => 'REGEX',
'regex' => '/^[\w\.\-\/]{2,255}\.[a-zA-Z]{2,10}[\.]{0,1}$/',
'errmsg'=> 'origin_error_regex'),
на
'regex' => '/^[\w\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,30}[\.]{0,1}$/',
Список файлов, где находятся такие проверки можно получить командой
[root@ololo.ru ~]# cd /usr/local/ispconfig
[root@ololo.ru ispconfig]# grep -r '\[a-zA-Z\]' .
./interface/web/mail/form/mail_aliasdomain.tform.php: 'regex' => '/^\@[\w\.\-]{2,64}\.[a-zA-Z]{2,10}$/',
./interface/web/mail/form/mail_domain_catchall.tform.php: 'regex' => '/^\@[\w\.\-]{2,255}\.[a-zA-Z]{2,10}$/',
./interface/web/mail/form/mail_get.tform.php: 'regex' => '/^[\w\.\-]{2,64}\.[a-zA-Z]{2,10}$/',
...skip...
- ISPConfig 3 и флаг active в MyDNS
В ISPConfig и MyDNS есть прикольный прикол – они описывают флаг active в таблице описаний DNS-зон разными типами и значениями. Соответственно, при включении зоны из ISPConfig-а всё равно MyDNS думает, что она выключена.
Вот код функции check_xfer из axfr.c. Эта функция содержит следующий запрос:
querylen = snprintf(query, sizeof(query), "SELECT xfer FROM %s WHERE id=%u%s",
mydns_soa_table_name, soa->id, mydns_rr_use_active ? " AND active=1" : "");
Проблема в том, что запрос ищет active=1 в таблице dns_soa. В ISPConfig-е поле active в таблице dns_soa имеет тип enum(‘N’, ‘Y’), поэтому запрос всегда обламывается. Чтобы заставить работать ISPConfig и MyDNS вместе, есть два решения:
1) Поменять запрос в axfr.c чтобы он проверял active=’Y’ вместо active=1 и пересобрать MyDNS.
2) Поменять тип поля active в таблице dns_soa на тип int или tinyint:
mysql> alter table dns_soa modify active tinyint(4) NOT NULL default '1';
поменять около строки 178 в файле /usr/local/ispconfig/interface/web/dns/form/dns_soa.tform.php следующее:
'default' => '1',
'value' => array(0, 1)
и поменять около строки 92 файла /usr/local/ispconfig/interface/lib/classes/listform_actions.inc.php следующее:
if(strtolower($rec[$key]) == '1' or strtolower($rec[$key]) == '0') {
// Set a additional image variable for boolean fields
$rec['_'.$key.'_'] = (strtolower($rec[$key]) == '1')?'x16/tick_circle.png':'x16/cross_circle.png';
После этих изменений всё внезапно работает.
- Добавление 301-го редиректа
По умолчанию в панельке AliasDomain ISPConfig делает редирект с кодом «302 Found». Иногда же надо чтобы код был «301 Moved Permanently». Для этого в файл /usr/local/ispconfig/interface/web/sites/form/web_aliasdomain.tform.php добавляем помеченное красным:
'value' => array('' => 'No redirect', 'no' => 'No flag', 'R' => 'R', 'L' => 'L', 'R,L' => 'R,L', 'R=301,L' => 'R=301,L')
И всё внезапно работает.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Tuesday, April 19th, 2011 | | 3:58 pm |
Пересылка почты для несуществующих почтовых ящиков в Exim // Forwarding emails for unexisting mailbo Иногда на почтовом сервере бывает Exim и локальные почтовые ящики для нескольких (N > 1 или N >> 1) доменов. И внезапно бывает надо не отбрасывать письма на несуществующие в доменах ящики с воплем «550 5.1.1 Recipient address rejected: User unknown in virtual mailbox table». А наоборот, передавать/форвардить письма на несуществующие ящики на некий smart-relay, где админы-мазохисты любят копаться в спаме.
В Exim-е это делается очень даже пятью строками маршрутизатором типа manualroute. Рассматриваем слабоотличающийся от исходного exim.conf. Те, у кого он сильно модифицирован и так знают чочо делать. Пихаем наш раутер (выделен красным) между раутером, описывающим локальную почту и описывающим отправку почты во внешний мир.
begin routers
virtual_localuser:
driver = accept
domains = +local_domains
local_parts = ${lookup mysql{SELECT login from mailboxes WHERE login=lower('${local_part}')}}
transport = local_delivery
smarthost_route:
driver = manualroute
domains = +local_domains
transport = remote_smtp
route_list = * 88.222.111.333
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
no_more
Пыщ! Вся почта на локальные домены, не ушедшая в почтовые ящики по virtual_localuser (то есть на несуществующие ящики в локальных доменах – то что нам и нужно) – обрабатывается в smarthost_route и отправляется на хост 88.222.111.333. Если нужно письма на разные домены пересылать на разные smart-relay, описываем это в route_list:
route_list = ololo.ru mail1.ololo.ru:mail2.ololo.ru ; pyshpysh.ru mx0.pyshpysh.ru:mx2.pyshpysh.ru ; * 88.222.111.333
Более подробно о формате route_list смотреть прямо вот здесь.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Saturday, March 19th, 2011 | | 5:16 pm |
Увеличение NSD диска в файловой системе GPFS на лету // Online resize of NSD volume in GPFS filesyst Иногда бывает AIX, а у ей внутре неонка GPFS-кластер с NSD-диском, который надо внезапно увеличить на LUN, который storage-админ раздал на все ноды кластера. Здесь описано как это сделать. Для примера, увеличим файловую систему /ora/patch/ebs/data на сервере dbnode1 на LUN /dev/hdiskpower7, розданный на сервер с хранилища EMC.
Сначала нужно создать файл, описывающий добавляемый диск, который нужно передать как аргумент команде mmcrnsd. Формат файла описания следующий (перевод куска man-a от mmcrnsd):
-F DescFile
Указывает файл, содержащий список дескрипторов дисков, один на строку. Дескрипторы дисков имеют следующий формат:
DiskName:ServerList::DiskUsage:FailureGr oup:DesiredName:StoragePool</p>
DiskName
Для UNIX, имя блочного устройства, появляющегося в /dev для диска, который вы хотите определить как NSD. Примеры дисков доступных как блочное устройство – это диски розданные с SAN или виртуальные разделяемые диски. Если указан список серверов, DiskName должно быть имя из /dev для дискового устройства первого в списке NSD-сервера.
Для Windows, номер диска (например, 3) определяемого как NSD. Номера дисков можно узнать в Windows Disk Management Console и в утилите командной строки DISKPART. Если указан список серверов, DiskName должен быть номером диска на первом в списке NSD-сервере. Для информации по поддерживаемым типам дисков смотрите FAQ (http://publib.boulder.ibm.com/infocenter/clresctr/vxrx/index.jsp).
ServerList
Разделённый двоеточиями список NSD-серверов. Вы можете указать до восьми NSD-серверов в этом списке. Определяемый NSD-диск будет предпочтительно использовать первый сервер в списке. Если первый сервер недоступен, NSD-диск будет использовать следущий доступный сервер в списке. Указывая серверы для ваших NSD-дисков, можно использовать вывод команды mmlscluster, которая перечисляет комбинации имён и IP-адресов, распознаваемых GPFS. Использование синонимов имён хостов не перечисленных в выводе команды mmlscluster может привести к нежелательным результатам.
Если не задать список серверов, GPFS полагает, что диск роздан с SAN на все ноды в кластере. Если не все ноды кластера имеют доступ к диску или файловая система, которой принадлежит диск будет использоваться другими GPFS-кластерами, список серверов должен быть задан.
DiskUsage
Задаёт использование диска или принимает значение по-умолчанию. Это поле игнорируется командой mmcrnsd и неизменным передаётся в файл описания создаваемый командой mmcrnsd. Возможные значения:
dataAndMetadata Указывает, что диск содержит данные и мета-данные. Это значение по-умолчанию для дисков в системном пуле.
dataOnly Указывает, что диск содержит данные, но не мета-данные. Это значение по-умолчанию для дисков в пулах хранилища, отличных от системного.
metadataOnly Указывает, что диск содержит мета-данные, но не данные.
descOnly Указывает, что диск не содержит ни данные, ни мета-данные файлов. Такие диски используются только для хранения копии дескриптора файловой системы и могут быть использованы как третья группа отказа в определенных конфигурациях аварийного восстановления. Для подробностей смотрите «General Parallel File System: Advanced Administration» и поищите по теме «Synchronous mirroring utilizing GPFS replication».
FailureGroup
Номер, задающий группу отказа, которой принадлежит диск. Можно указать любое значение от -1 до 4000 (где -1 указывает, что диск не имеет общей точки отказа с любым другим диском). Если не указать группу отказа, значение устанавливается по-умолчанию в номер ноды плюс 4000 для первого NSD-сервера из списка серверов. Если список NSD-серверов не задан, устанавливается значение по-умолчанию -1.
GPFS использует эту информацию, раскладывая данные и метаданные так, чтобы при единичном отказе обе реплики одного блока не погибли. Все диски, подключённые к одному NSD-серверу, к одному контроллеру или находящиеся в одном дата-центре, должны принадлежать одной группе отказа.
DesiredName
Указывает желаемое имя для создаваемого NSD. Это имя не должно уже использоваться как имя другого GPFS диска и оно не должно начинаться с зарезервированной строки ‘gpfs’. Замечание: Это имя может содержать только следующие символы: от ‘A’ до ‘Z’, от ‘a’ до ‘z’, от ’0′ до ’9′, или ‘_’ (подчёрк). Все остальные символы недопустимы. Если желаемое имя не задано, NSD назначается имя согласно шаблону ‘gpfsNNnsd’, где NN уникальное неотрицательное целое, не использованное в уже существующих NSD.
StoragePool
Указывает имя пула хранилища, куда назначен NSD. Это поле игнорируется командой mmcrnsd и неизменным передаётся в файл описания создаваемый командой mmcrnsd.
Cоберём нужную информацию для файла описания нового диска.
- список нод кластера
dbnode1:/# mmgetstate -Lsa
Node number Node name Quorum Nodes up Total nodes GPFS state Remarks
------------------------------------------------------------------------------------
1 gpfs_dbnode1 1* 2 2 active quorum node
2 gpfs_dbnode2 1* 2 2 active quorum node
- еще вариант получить список нод кластера
dbnode1:/# mmlscluster
GPFS cluster configuration servers:
-----------------------------------
Primary server: gpfs_dbnode1.company.com
Secondary server: gpfs_dbnode2.company.com
Node Daemon node name IP address Admin node name Designation
-----------------------------------------------------------------------------------------------
1 gpfs_dbnode1.company.com 192.168.1.10 gpfs_dbnode1.company.com quorum-manager
2 gpfs_dbnode2.company.com 192.168.1.11 gpfs_dbnode2.company.com quorum-manager
- имя NSD-диска
dbnode1:/# df -k /ora/patch/ebs/data
Filesystem 1024-blocks Free %Used Iused %Iused Mounted on
/dev/gpfs2nsd 445644800 4564480 99% 4327 2% /ora/patch/ebs/data
- из чего состоит нужный NSD-диск, какой у него failure group и storage pool
dbnode1:/# mmlsdisk gpfs2nsd
disk driver sector failure holds holds storage
name type size group metadata data status availability pool
------------ -------- ------ ------- -------- ----- ------------- ------------ ------------
gpfs2nsd nsd 512 4001 yes yes ready up system
gpfs14nsd nsd 512 4001 yes yes ready up system
- для интереса посмотрим, из каких вообще LUN-ов состоит NSD-диск
dbnode1:/# mmlsdisk gpfs2nsd -M
Disk name IO performed on node Device Availability
------------ ----------------------- ----------------- ------------
gpfs2nsd localhost /dev/hdiskpower3 up
gpfs14nsd localhost /dev/hdiskpower24 up
- для интереса посмотрим, какие вообще NSD-диски и LUN-ы используются на данной ноде
dbnode1:/# mmlsnsd -m
Disk name NSD volume ID Device Node name Remarks
----------------------------------------------------------------------------------------
gpfs2nsd 0A0A741E47D58DC6 /dev/hdiskpower3 gpfs_dbnode1.company.com primary node
gpfs2nsd 0A0A741E47D58DC6 /dev/hdiskpower2 gpfs_dbnode2.company.com backup node
gpfs14nsd 0A0A741E4B908EE1 /dev/hdiskpower24 gpfs_dbnode1.company.com primary node
gpfs14nsd 0A0A741E4B908EE1 /dev/hdiskpower24 gpfs_dbnode2.company.com backup node
gpfs10nsd 0A0A741E47E96184 /dev/hdiskpower16 gpfs_dbnode1.company.com primary node
gpfs10nsd 0A0A741E47E96184 /dev/hdiskpower16 gpfs_dbnode2.company.com backup node
gpfs11nsd 0A0A741E47E96186 /dev/hdiskpower17 gpfs_dbnode1.company.com primary node
gpfs11nsd 0A0A741E47E96186 /dev/hdiskpower17 gpfs_dbnode2.company.com backup node
Cоздаём файл описания нового диска. Заметьте, что здесь указано имя блочного устройства только для первой ноды из списка. GPFS сама найдёт соответствующий LUN на других нодах кластера.
dbnode1:/# echo /dev/hdiskpower7:gpfs_dbnode1:gpfs_dbnode2::dataAndMetadata:4001::system > nsddisk
Добавляем диск в кластер
dbnode1:/# mmcrnsd -F nsddisk
mmcrnsd: Processing disk hdiskpower7
mmcrnsd: 6027-1371 Propagating the cluster configuration data to all
affected nodes. This is an asynchronous process.
Проверяем, что новый диск действительно появился в списке NSD-дисков
dbnode1:/# mmlsnsd
File system Disk name Primary node Backup node
-----------------------------------------------------------------------------
gpfs2nsd gpfs2nsd gpfs_dbnode1.company.com gpfs_dbnode2.company.com
gpfs2nsd gpfs14nsd gpfs_dbnode1.company.com gpfs_dbnode2.company.com
gpfs10nsd gpfs10nsd gpfs_dbnode1.company.com gpfs_dbnode2.company.com
gpfs11nsd gpfs11nsd gpfs_dbnode1.company.com gpfs_dbnode2.company.com
(free disk) gpfs15nsd gpfs_dbnode1.company.com gpfs_dbnode2.company.com
Довавляем в нужную файловую систему GPFS только что созданный NSD-диск. Флаг -r означает требование произвести rebalancing файловой системы, то есть размазать её данные равномерно по всем дискам. Балансировка – довльно долгий процесс, поэтому можно добавить флаг -a, чтобы она происходила в фоновом режиме.
dbnode1:/# mmadddisk gpfs2nsd -F nsddisk -r
GPFS: 6027-531 The following disks of gpfs2nsd will be formatted on node dbnode1:
gpfs15nsd: size 104857600 KB
Extending Allocation Map
Checking Allocation Map for storage pool 'system'
GPFS: 6027-1503 Completed adding disks to file system gpfs2nsd.
mmadddisk: 6027-1371 Propagating the cluster configuration data to all
affected nodes. This is an asynchronous process.
Restriping gpfs2nsd ...
GPFS: 6027-589 Scanning file system metadata, phase 1 ...
GPFS: 6027-552 Scan completed successfully.
GPFS: 6027-589 Scanning file system metadata, phase 2 ...
GPFS: 6027-552 Scan completed successfully.
GPFS: 6027-589 Scanning file system metadata, phase 3 ...
GPFS: 6027-552 Scan completed successfully.
GPFS: 6027-589 Scanning file system metadata, phase 4 ...
GPFS: 6027-552 Scan completed successfully.
GPFS: 6027-565 Scanning user file metadata ...
GPFS: 6027-552 Scan completed successfully.
Балансировку можно провести позднее, используя команду mmrestripefs с ключом -b:
dbnode1:/# mmrestripefs /dev/gpfs2nsd -b
GPFS: 6027-589 Scanning file system metadata, phase 1 ...
GPFS: 6027-552 Scan completed successfully.
...
Для успокоения наших пауков в голове и паранойи проверим состояние увеличенной файловой системы:
dbnode1:/# mmlsdisk gpfs2nsd
disk driver sector failure holds holds storage
name type size group metadata data status availability pool
------------ -------- ------ ------- -------- ----- ------------- ------------ ------------
gpfs2nsd nsd 512 4001 yes yes ready up system
gpfs14nsd nsd 512 4001 yes yes ready up system
gpfs15nsd nsd 512 4001 yes yes ready up system
Посмотрим на файловую систему и результаты балансировки командой mmdf. Заметьте, что свободное место распределено более-менее равномерно.
dbnode1:/# mmdf gpfs2nsd
disk disk size failure holds holds free KB free KB
name in KB group metadata data in full blocks in fragments
--------------- ------------- -------- -------- ----- -------------------- -------------------
Disks in storage pool: system
gpfs2nsd 235929600 4001 yes yes 34151680 ( 14%) 185896 ( 0%)
gpfs14nsd 209715200 4001 yes yes 31655936 ( 15%) 176832 ( 0%)
gpfs15nsd 104857600 4001 yes yes 20722688 ( 20%) 109944 ( 0%)
------------- -------------------- -------------------
(pool total) 550502400 86530304 ( 16%) 472672 ( 0%)
Дело сделано. Также на Хабре есть хорошая статья, посвященная GPFS, где рассмотрен более широкий круг задач. На всякий случай, статья сохранена здесь: часть 1 и часть 2.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Saturday, February 26th, 2011 | | 12:10 am |
Юниксовые утилиты командной строки для Windows // Unix-like command line utilities for Windows Я фанат командной строки. Точнее, я считаю её весьма удобным инструментом. И использую из Far-а в этих своих Windows. Хе-хе, сколько сразу конфликтных тем – cmdline/gui, Far/TC, Linux/Windows – можно устроить Холивор и Срачъ.
Так вот. Здесь я хочу описать набор утилит командной строки, портированных на Windows, которые считаю удобными и полезными иметь на своём Windows-десктопе. Это именно standalone-бинарники, а не Cygwin, так как я хочу иметь xcopy-style deployment (скопировал куда-нибудь в %PATH% и ололо), без записей в реестр или конфиг-файлы. Все ссылки и версии приведены и работают на настоящий момент, со временем, конечно, версии будут устаревать, а ссылки – протухать.
Почти для всех программ требуется Microsoft Visual C++ 2008 SP1 Redistributable Package, который скорее всего уже есть в системе. Если нет – качать и ставить: x86 и x64 версии. Многие программы взяты из проекта GNUWin32, полный список пакетов смотреть здесь – мало ли, может кому sed понадобится.
Всё, что упомянуто ниже, версии на настоящий момент, собрано в один пакет cmdline-unix-4-windows.zip. Распаковываете архив, бинарники из c-windows кладёте в %SystemRoot%, библиотеки из c-windows-system кладёте в %SystemRoot%\system (этот layout работает, по крайней мере, на Windows 7).
На всякий случай рядом лежат рантаймы от VC++ x86 и x64.
Адовый инструмент для скачивания почти чего угодно. Идём на домашнюю страницу виндового порта wget, скачиваем архив с бинарником и архив с зависимостями. wget с версии примерно 1.10 начал поддерживать SSL, поэтому ему теперь нужна SSL-библиотека и еще по мелочи всякого. wget.exe из первого архива кладём в C:\Windows. Библиотеки libeay32.dll, libiconv2.dll, libintl3.dll и libssl32.dll из второго архива кладём в C:\Windows\system. Пыщ.
C:\>wget.exe --help | more
GNU Wget 1.11.4, a non-interactive network retriever.
Usage: C:\Windows\wget [OPTION]... [URL]...
Адовый инструмент для выполнения запросов к DNS-серверам. То же, что nslookup, только в стопицот раз удобнее. Отдельно его нет, он входит в стандартный комплект DNS-сервера BIND. Идём на домашнюю страницу BIND-a, качаем архив для Windows (на текущий момент последний стабильный релиз – 9.7.3), достаём из архива dig.exe и host.exe, кладём его в C:\Windows. Так как они часть BIND, то требуют кучу его библиотек для своей работы – достаём из архива libbind9.dll, libdns.dll, libisc.dll, libisccfg.dll, liblwres.dll и libxml2.dll и кладём в C:\Windows\system. Также нужен libeay32.dll, если он не скопирован во время установки wget-а. И вот ололо.
C:\>dig ru ns
; <<>> DiG 9.7.3 <<>> ru ns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42415
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 12
Иногда надо потаскать файлы взад-назад с юникс-сервера на виндовый десктоп. Для этого нужен scp из командной строки. Идём на домашнюю страницу PuTTY. Это сам по себе зач0тный инструмент, хотя некоторые ребе считают более кошерным Bitvise Tunnelier, но для моих целей это overkill. Скачиваем по ссылке pscp.exe, переименовываем в scp.exe и кладём в C:\Windows. Вуаля.
C:\>scp pagefile.sys root@shell.ru:/root/
root@shell.ru's password:
Калькулятор командной строки. Берём с домашней страницы виндового порта bc архив с бинарником и архив с зависимостями, кладём bc.exe из первого архива в C:\Windows, кладём readline5.dll из второго архива в C:\Windows\system.
По умолчанию bc.exe работает с целыми числами. Чтобы он считал с, например, 20-ю знаками после запятой надо либо сказать ему scale=20 перед вычислениями, либо запустить с опциями -lq, либо поместить эти опции в переменную окружения BC_ENV_ARGS. Выход из интерактивного режима – Ctrl-D.
C:\>bc -lq
1/3
.33333333333333333333
scale=8
1/3
.33333333
Оттуда же берём grep. А так же egrep и fgrep. Бинарники из архива с бинарниками кладём в C:\Windows, библиотеки из архива с зависимостями – в C:\Windows\system.
C:\>grep -V
GNU grep 2.5.4
Copyright (C) 2009 Free Software Foundation, Inc.
Иногда возможностей виндового dir не хватает. Отсюда берём портированный ls с виндовыми дополнениями, распаковываем архив и копируем ls.exe в C:\Windows. Почитайте ls.exe ––help – там много интересного.
Иногда надо поработать напрямую с дисками. Прям как в линуксовом dd. Идём на домашнюю страницу, скроллим вниз, берём из архива бинарник dd.exe и кладём в C:\Windows. Сделайте dd.exe ––list 2>&1 | more – увидите всякое.
А вот как потырить MBR с первого диска. Partition0 – весь диск. Запускать, естественно, именем и властью администратора.
C:\>dd.exe if=\\?\Device\Harddisk0\Partition0 of=boot.img bs=512 count=1
rawwrite dd for windows version 0.6beta3.
1+0 records in
1+0 records out
Посчитать контрольные суммы скачанного чего-нибудь. md5sum: домашняя страница, бинарник. sha1sum: домашняя страница, бинарник. sfv: источник утерян, но остались сотни ссылок на файлопомойках. Качаем это всё и кладём в C:\Windows.
Заключение
Конечно, здесь не упомянуты более 9000 других «кульных прожек» и «тулзов». Здесь те, которыми пользуюсь лично я.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Sunday, February 20th, 2011 | | 3:38 pm |
32 vs 64: Как определить битность операционной системы и процессора // How to find out OS and proces Иногда внезапно бывает нужно определить битность (32 или 64 бита) операционной системы, битность и тип железа на котором она бежит. Это разные вещи, ибо 32-хбитная операционка может бежать на 64-хбитном процессоре. А наоборот – нет. Для определения битности, а так же некоторых прочих маленьких милых деталей читайте нижеследующий гайд.
[дополнение] На самом деле, я фшоке сколько на эту статью набигают по запросам типа «как узнать битность системы» и «определить 32 или 64 бита». Так как в запросе не указана операционная система для которой это спрашивается, то это набигает школота и интересуется она Windows. Специально для них в конце статьи добавлен раздел «Определение битности Windows». А чотким пацанам интересующимся за юниксы читать ниже.
Linux
Ну, тут легко. «Все красноглазые знают это». По крайней мере, с архитектурой x86, о которой пойдёт речь. Используем uname или arch.
Способ 1
Просто говорим arch. Если ответ i386 – то это 32 бита. Вместо тройки может быть 4, 5 или 6. Если ответ x86_64 – то это 64 бита. Если ответ ia64 – то это тоже 64 бита, процессор Intel Itanium или Intel Itanium 2.
[root@ololo ~]# arch
i686
Способ 2
man от uname как бы говорит нам, что опция:
-a, --all выводит всю подробную информацию
-m, --machine выводит сведения о типе компьютера
-p, --processor выводит тип процессора для данного компьютера
-i, --hardware-platform выводит сведения о платформе компьютера
Поэтому достаточно посмотреть на вывод uname -imp или uname -a:
[root@ololo ~]# uname -imp
i686 i686 i386
[root@ololo ~]# uname -a
Linux ololo.ru 2.6.18-194.26 #1 SMP Fri Dec 17 19:25:15 MSK 2010 i686 i686 i386 GNU/Linux
Способ 3
Тут даже без комментариев.
[root@ololo ~]# getconf LONG_BIT
32
Способ 4
Наконец, можно просто посмотреть на битность бинарника ядра:
[root@ololo32 ~]# file /boot/vmlinuz-`uname -r`
/boot/vmlinuz-2.6.18-194.0.0.0.3.el5PAE: ELF 32-bit LSB shared object, Intel 80386, version 1, stripped
[root@ololo64 ~]# file /boot/vmlinuz-`uname -r`
/boot/vmlinuz-2.6.18-194.0.0.0.3.el5: ELF 64-bit LSB shared object, AMD x86-64, version 1, stripped
Битность процессора
Но 32-хбитная операционка не означает, что процессор не умеет набор 64-хбитных инструкций. Чтобы узнать, поддерживает ли процессор набор инструкций AMD64 или Intel EM64T, смотрим наличие флага lm (long mode) в строке флагов процессора в /proc/cpuinfo. Если флага lm нет – процессор 32-хбитный.
[root@ololo ~]# grep ^flags /proc/cpuinfo | grep lm
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat
pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx rdtscp lm constant_tsc
nonstop_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr sse4_1 sse4_2 popcnt lahf_lm
Для процессоров Intel Itanium (ia64) это не работает, у них нет строчки «flags» и они всегда 64-хбитные.
Solaris
Способ 1
Смотрим на бинарник /bin/isainfo или /usr/bin/isainfo. Если его нет – система 32-хбитная. Если есть – запускаем isainfo -kv. Вывод однозначен. Ниже примеры для Solaris 8, 9 и 10.
sol8# uname -a; isainfo -kv
SunOS sol8 5.8 Generic_117350-39 sun4u sparc SUNW,Sun-Fire
64-bit sparcv9 kernel modules
sol9# uname -a; isainfo -kv
SunOS sol9 5.9 Generic_118558-10 sun4u sparc SUNW,Sun-Fire-V490
64-bit sparcv9 kernel modules
sol10# uname -a; isainfo -kv
SunOS sol10 5.10 Generic_142900-02 sun4u sparc SUNW,SPARC-Enterprise
64-bit sparcv9 kernel modules
Битность процессора
Тип процессора определяется из вывода uname -p, sparc – это (сюрприз!) SPARC процессор, i86pc – это Intel x86. На процессор смотрим командой /usr/sbin/psrinfo -v. Наличие sparcv9 в выводе как бы говорит нам о 64-хбитности процессора. Ну и на частоту можно посмотреть:
sol10# psrinfo -v
Status of virtual processor 0 as of: 02/17/2011 14:52:08
on-line since 06/23/2010 01:25:47.
The sparcv9 processor operates at 2400 MHz,
and has a sparcv9 floating point processor.
Status of virtual processor 1 as of: 02/17/2011 14:52:08
on-line since 06/23/2010 01:25:48.
The sparcv9 processor operates at 2400 MHz,
and has a sparcv9 floating point processor.
Инфа 100% о железе
Инфа об окружающем железе получается из команд /usr/sbin/prtdiag и /usr/sbin/prtpicl. С опцией «-v» будет еще подробней. Ниже пример с самым интересным из вывода.
sol10# prtdiag
System Configuration: Sun Microsystems sun4u Sun SPARC Enterprise M5000 Server
System clock frequency: 1012 MHz
Memory size: 65536 Megabytes
==================================== CPUs ====================================
... skip ...
============================ Memory Configuration ============================
... skip ...
========================= IO Cards =========================
... skip ...
==================== Hardware Revisions ====================
System PROM revisions: OBP 4.24.10 2008/08/12 19:52
=================== System Processor Mode ===================
SPARC64-VII mode
HP-UX
HP-UX – адовая операционка, есличо. Её просто нужно уметь готовить. Многое в ней неудобно (отсутствие гнушных утилит, например), но многое зач0тно (железная и гипервизорная виртуализация искаропки, допустим).
Способ 1
Тоже без комментариев. getconf KERNEL_BITS и пыщь.
hpux# getconf KERNEL_BITS
64
Способ 2
Аналогично. Смотрим на битность файла с ядром.
hpux64# /usr/bin/file /stand/vmunix
/stand/vmunix: ELF-64 executable object file - PA-RISC 2.0 (LP64)
hpux32# /usr/bin/file /stand/vmunix
/stand/vmunix: PA-RISC1.1 executable -not stripped
Инфа о процессоре и релизе операционки
Несколько слов о том, какие сочетания вообще бывают. Сейчас последняя версия HP-UX – 11i. Её релизы: HP-UX 11.0 (B.11.00 – адское старьё), HP-UX 11i v1 (B.11.11), HP-UX 11i v2 (B.11.23) и HP-UX 11i v3 (B.11.31). Может бежать на двух типах процессоров: если в выводе uname -m написано 9000/800 – это PA-RISC 2.0, если написано ia64 – это Intel Itanium 2. Пара примеров с реальных систем:
dev1# uname -a
HP-UX dev1 B.11.11 U 9000/800 651111111 unlimited-user license
prod2# uname -a
HP-UX prod2 B.11.23 U ia64 4271111111 unlimited-user license
Инфа о железе
Наиболее быстрый способ – запустить sam – псевдо-гуёвую (или гуёвую, если в иксах) утилиту, которая есть искаропки во всех HP-UX. sam -> [Enter] -> Performance Monitors -> System Properties и ты-дыщ!
┌───────────┐┌────────┐┌──────────────────┐┌─────────┐┌─────────┐
│ Processor ││ Memory ││ Operating System ││ Network ││ Dynamic │
│ ────────────────────────────────────────────────────────┐
│┌──────────────────────────────────────────────────────────────────┐│
││Processors: ││
││ Active: 6 ││
││ Total: 8 ││
││Clock Frequency: 400 MHz , 1598 MHz(Core Freq.) ││
││Machine Identification: 4211111111 ││
││Hardware Model: ia64 hp server rx8640 ││
││Kernel Width Support: 64 ││
││CPU Version: Intel(R) Itanium(TM) Family Processor ││
││CPU Model No: 1 ││
││CPU Revision: 1 ││
│└──────────────────────────────────────────────────────────────────┘│
└────────────────────────────────────────────────────────────────────┘
AIX
Способ 1 (только от root)
aix64# /usr/sbin/bootinfo -K
64
Способ 2
aix64$ /usr/bin/locale64
LANG=en_US
LC_COLLATE="en_US"
... skip ...
aix32$ /usr/bin/locale64
exec(): 0509-036 Cannot load program /bin/locale64 because of the following errors:
0509-032 Cannot run a 64-bit program on a 32-bit machine.
Способ 3
Файл /unix – симлинка на текущее ядро. Имя ядра доставляет.
aix64$ ls -l /unix
lrwxrwxrwx 1 root system 21 Nov 19 2007 /unix -> /usr/lib/boot/unix_64
aix32$ ls -l /unix
lrwxrwxrwx 1 root system 21 Jan 16 2006 /unix -> /usr/lib/boot/unix_mp # либо просто '/usr/lib/boot/unix'
Способ 4
Опять волшебная команда getconf:
aix64$ getconf KERNEL_BITMODE
64
Способ 5
Смотрим на наличие пакета bos.64bit. В 32-хбитной операционке его не будет наличествовать.
aix64$ lslpp -l bos.64bit
Fileset Level State Description
----------------------------------------------------------------------------
Path: /usr/lib/objrepos
bos.64bit 5.3.12.0 COMMITTED Base Operating System 64 bit
Runtime
Способ 6
Вообще всё разжуют и в рот положат.
aix64$ /usr/sbin/kdb
The specified kernel file is a 64-bit kernel
... skip ...
Способ 7
Опять смотрим на файл с ядром:
aix64$ file /usr/lib/boot/unix*
/usr/lib/boot/unix_64: 64-bit XCOFF executable or object module not stripped
aix32$ file /usr/lib/boot/unix*
/usr/lib/boot/unix_mp: executable (RISC System/6000) or object module not stripped
Способ 8
aix64$ /usr/sbin/prtconf | grep ^Kernel
Kernel Type: 64-bit
Инфа о процессоре и железе
Тот же /usr/sbin/prtconf. Инфы выдаёт доставляющей и много. Пример с живой системы:
aix64$ /usr/sbin/prtconf
System Model: IBM,9116-561
Machine Serial Number: 11111XX
Processor Type: PowerPC_POWER5
Processor Implementation Mode: POWER 5
Processor Version: PV_5_3
Number Of Processors: 10
Processor Clock Speed: 1798 MHz
CPU Type: 64-bit
Kernel Type: 64-bit
LPAR Info: 51 aix64
Memory Size: 20480 MB
Good Memory Size: 20480 MB
Platform Firmware level: SF240_358
Firmware Version: IBM,SF240_358
Network Information
... skip ...
Paging Space Information
... skip ...
Volume Groups Information
... skip ...
INSTALLED RESOURCE LIST
Model Architecture: chrp
Model Implementation: Multiple Processor, PCI bus
+ sys0 System Object
+ sysplanar0 System Planar
* vio0 Virtual I/O Bus
* vsa0 U9116.561.11111XX-V51-C0 LPAR Virtual Serial Adapter
+ ent4 U1111.001.DQQQQQQ-P1-C5-T1 4-Port 10/100/1000 Base-TX PCI-X Adapter
+ fcs0 U1111.001.DQQQQQQ-P1-C3-T1 FC Adapter
* fcnet0 U1111.001.DQQQQQQ-P1-C3-T1 Fibre Channel Network Protocol Device
+ fscsi0 U1111.001.DQQQQQQ-P1-C3-T1 FC SCSI I/O Controller Protocol Device
* hdiskpower4 U1111.001.DQQQQQQ-P1-C3-T1-L8 PowerPath Device
* hdisk21 U1111.001.DQQQQQQ-P1-C3-T1-W8888888888888888-L0 EMC CLARiiON FCP RAID 5 Disk
* hdisk22 U1111.001.DQQQQQQ-P1-C3-T1-W8888888888888888-L0 EMC CLARiiON FCP RAID 5 Disk
... skip ...
+ L2cache0 L2 Cache
+ mem0 Memory
+ proc0 Processor
+ proc2 Processor
+ proc4 Processor
+ proc6 Processor
+ proc8 Processor
+ proc10 Processor
+ proc12 Processor
+ proc14 Processor
+ proc16 Processor
+ proc18 Processor
Windows
Разрядностей у Windows на сегодняшний день две: 32 бита и 64 бита, т.е. дистрибутивы делятся на x32 и x64 соответственно. x86 – это обозначение архитектуры процессоров Intel и является синонимом 32-хбитной версии (т.е. если Вы увидите x86, то знайте что речь идет об x32). То есть, если Вы не устанавливали специально 64-битную операционную систему, то Ваша Windows имеет 32-хбитную разрядность. Посмотреть разрядность в системе можно простейшим способом: «Пуск» —> правый клик на «Мой компьютер» (или сразу правый клик на «Мой компьютер», если этот ярлык есть на рабочем столе) —> «Свойства», и видим картинку на которой всё написано русским по белому.
Вот как это выглядит для Windows Vista или Windows 7:
Вот так выглядит для предыдущих версий Windows, включая XP. Если надписи про 64 бита нет – система 32-хбитная.
Заключение
Внезапно, конец.
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Monday, January 10th, 2011 | | 10:30 pm |
Как определить размер памяти во FreeBSD Внезапно оказалось, что во FreeBSD нет способа быстро и наглядно посмотреть размер физической, свободной и занятой памяти. Вроде команды ‘free’ в линуксе. Интернетик полон вопросами FreeBSD-кунов на этот счет и в ответ предлагается либо грепать дмесг, либо ставить из портов ‘freecolor’, либо скачать и использовать вот этот перловый скрипт.
Ад и ненависть наполняет меня при этом, так как использовать пёрл для такой простой задачи — это нарушать KISS-принцип, ломать бритву Оккама лишней сущностью, а также просто фэйл. Плюс скрипт не обрабатывает ситуацию запуска из jail-а, что в наше время адской виртуализации всего — неприемлемо. Всяческие ‘top’ и ‘vmstat’ не велят использовать пауки, так как тоже лишняя сущность и в minimal install их нет.
Вобщем, я портировал этот скрипт на язык, присутствующий в любой unix-системе (/bin/sh, ага) и добавил обработку jail-a. Сохраните код ниже в какой-нибудь ‘/usr/bin/free’, сделайте ему ‘chmod a+x’ и наслаждайтесь.
#!/bin/sh
mem_phys=`sysctl -n hw.physmem`
mem_pgs=`sysctl -n hw.pagesize`
sys_jail=`sysctl -n security.jail.jailed`
# guess hardware memory size
chip_size=1
chip_guess=`expr $mem_phys / 8 - 1`
while [ $chip_guess -ne 0 ]; do
chip_guess=`expr $chip_guess / 2`
chip_size=`expr $chip_size \* 2`
done
mem_hw=`expr \( $mem_phys - 1 \) / $chip_size`
mem_hw=`expr $mem_hw \* $chip_size + $chip_size`
# determine the individual known information
mem_all=`sysctl -n vm.stats.vm.v_page_count`
mem_all=`expr $mem_all \* $mem_pgs`
mem_wire=`sysctl -n vm.stats.vm.v_wire_count`
mem_wire=`expr $mem_wire \* $mem_pgs`
mem_active=`sysctl -n vm.stats.vm.v_active_count`
mem_active=`expr $mem_active \* $mem_pgs`
mem_inactive=`sysctl -n vm.stats.vm.v_inactive_count`
mem_inactive=`expr $mem_inactive \* $mem_pgs`
mem_cache=`sysctl -n vm.stats.vm.v_cache_count`
mem_cache=`expr $mem_cache \* $mem_pgs`
mem_free=`sysctl -n vm.stats.vm.v_free_count`
mem_free=`expr $mem_free \* $mem_pgs`
# determine the individual unknown information
mem_gap_vm=`expr -- $mem_all - \( $mem_wire + $mem_active + $mem_inactive + $mem_cache + $mem_free \)`
mem_gap_sys=`expr -- $mem_phys - $mem_all`
mem_gap_hw=`expr -- $mem_hw - $mem_phys`
# determine logical summary information
mem_total=$mem_hw
mem_avail=`expr -- $mem_inactive + $mem_cache + $mem_free`
mem_used=`expr -- $mem_total - $mem_avail`
# print system results
printf "System memory information (page size is %d bytes)\n" $mem_pgs
if [ $sys_jail -eq 1 ]; then
printf "WE ARE IN THE JAIL\n"
printf "mem_wire: %12d (%7dMB) %s\n" $mem_wire `expr -- $mem_wire / 1048576` 'Wired: disabled for paging out'
printf "mem_active: %12d (%7dMB) %s\n" $mem_active `expr -- $mem_active / 1048576` 'Active: recently referenced'
printf "mem_inactive: %12d (%7dMB) %s\n" $mem_inactive `expr -- $mem_inactive / 1048576` 'Inactive: recently not referenced'
printf "mem_cache: %12d (%7dMB) %s\n" $mem_cache `expr -- $mem_cache / 1048576` 'Cached: almost avail. for allocation'
printf "mem_free: %12d (%7dMB) %s\n" $mem_free `expr -- $mem_free / 1048576` 'Free: fully available for allocation'
printf -- "-------------- ------------ -----------\n"
printf "mem_phys: %12d (%7dMB) %s\n" $mem_phys `expr -- $mem_phys / 1048576` 'Total real memory available'
else
printf "mem_wire: %12d (%7dMB) [%3d%%] %s\n" $mem_wire `expr -- $mem_wire / 1048576` `expr -- $mem_wire \* 100 / $mem_all` 'Wired: disabled for paging out'
printf "mem_active: + %12d (%7dMB) [%3d%%] %s\n" $mem_active `expr -- $mem_active / 1048576` `expr -- $mem_active \* 100 / $mem_all` 'Active: recently referenced'
printf "mem_inactive:+ %12d (%7dMB) [%3d%%] %s\n" $mem_inactive `expr -- $mem_inactive / 1048576` `expr -- $mem_inactive \* 100 / $mem_all` 'Inactive: recently not referenced'
printf "mem_cache: + %12d (%7dMB) [%3d%%] %s\n" $mem_cache `expr -- $mem_cache / 1048576` `expr -- $mem_cache \* 100 / $mem_all` 'Cached: almost avail. for allocation'
printf "mem_free: + %12d (%7dMB) [%3d%%] %s\n" $mem_free `expr -- $mem_free / 1048576` `expr -- $mem_free \* 100 / $mem_all` 'Free: fully available for allocation'
printf "mem_gap_vm: + %12d (%7dMB) [%3d%%] %s\n" $mem_gap_vm `expr -- $mem_gap_vm / 1048576` `expr -- $mem_gap_vm \* 100 / $mem_all` 'Memory gap: UNKNOWN'
printf -- "-------------- ------------ ----------- ------\n"
printf "mem_all: = %12d (%7dMB) [100%%] %s\n" $mem_all `expr -- $mem_all / 1048576` 'Total real memory managed'
printf "mem_gap_sys: + %12d (%7dMB) %s\n" $mem_gap_sys `expr -- $mem_gap_sys / 1048576` 'Memory gap: Kernel?!'
printf -- "-------------- ------------ -----------\n"
printf "mem_phys: = %12d (%7dMB) %s\n" $mem_phys `expr -- $mem_phys / 1048576` 'Total real memory available'
printf "mem_gap_hw: + %12d (%7dMB) %s\n" $mem_gap_hw `expr -- $mem_gap_hw / 1048576` 'Memory gap: Segment Mappings?!'
printf -- "-------------- ------------ -----------\n"
printf "mem_hw: = %12d (%7dMB) %s\n" $mem_hw `expr -- $mem_hw / 1048576` 'Total real memory installed'
fi
# print logical results
if [ $sys_jail -ne 1 ]; then
printf "\nSystem memory summary\n"
printf "mem_used: %12d (%7dMB) [%3d%%] %s\n" $mem_used `expr -- $mem_used / 1048576` `expr -- $mem_used \* 100 / $mem_total` 'Logically used memory'
printf "mem_avail: + %12d (%7dMB) [%3d%%] %s\n" $mem_avail `expr -- $mem_avail / 1048576` `expr -- $mem_avail \* 100 / $mem_total` 'Logically available memory'
printf -- "-------------- ------------ ----------- ------\n"
printf "mem_total: = %12d (%7dMB) [100%%] %s\n" $mem_total `expr -- $mem_total / 1048576` 'Logically total memory'
fi
Пример вывода в ненагруженной виртуалке с 512-ю мегабайтами памяти:
[root@bsd ~]# free
System memory information (page size is 4096 bytes)
mem_wire: 33640448 ( 32MB) [ 6%] Wired: disabled for paging out
mem_active: + 12607488 ( 12MB) [ 2%] Active: recently referenced
mem_inactive:+ 12656640 ( 12MB) [ 2%] Inactive: recently not referenced
mem_cache: + 245760 ( 0MB) [ 0%] Cached: almost avail. for allocation
mem_free: + 446447616 ( 425MB) [ 88%] Free: fully available for allocation
mem_gap_vm: + 487424 ( 0MB) [ 0%] Memory gap: UNKNOWN
-------------- ------------ ----------- ------
mem_all: = 506085376 ( 482MB) [100%] Total real memory managed
mem_gap_sys: + 16023552 ( 15MB) Memory gap: Kernel?!
-------------- ------------ -----------
mem_phys: = 522108928 ( 497MB) Total real memory available
mem_gap_hw: + 14761984 ( 14MB) Memory gap: Segment Mappings?!
-------------- ------------ -----------
mem_hw: = 536870912 ( 512MB) Total real memory installed
System memory summary
mem_used: 77520896 ( 73MB) [ 14%] Logically used memory
mem_avail: + 459350016 ( 438MB) [ 85%] Logically available memory
-------------- ------------ ----------- ------
mem_total: = 536870912 ( 512MB) [100%] Logically total memory
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ. | | Saturday, June 30th, 2007 | | 6:24 am |
| | Friday, June 15th, 2007 | | 11:24 am |
| | Friday, June 8th, 2007 | | 3:46 pm |
АААА!!! Жесть!
Читаю вакансии на hh.ru. Вижу замечательное. Администратор базы данныхВакансия компании: Донской табак Требования:
- отличные навыки работы в Excel
Ничего другого, относящегося к базам там нет. %Subj%. |
[ << Previous 20 ]
|