Pull to refresh
276
0
Георгий Шуклин @amarao

Забанен за упоминание войны. Больше не на хабре.

Send message

Введение в OCaml: Типы данных и сопоставление [3]

Reading time8 min
Views4.9K
[прим. пер.: продолжение перевода. первая часть, вторая часть]

Связные списки


В OCaml, так же как в Perl, есть встроенная на уровне языка поддержка списков. Все элементы списка должны быть одного типа. Для определения типа используется выражение:

[1; 2; 3]

Обратите внимание: точка с запятой, а не запятая.

[] означает пустой список.

У списка есть голова (первый элемент) и хвост (остальные элементы, кроме головы). Голова — элемент. Хвост — список. В вышеприведённом примере голова — целое число 1, а хвост — список [2; 3].

Альтернативной формой записи является использование оператора конструирования (cons) в форме head :: tail. Нижеприведённые строки полностью эквивалентны друг другу.

[1; 2; 3]
1 :: [2; 3]
1 :: 2 :: [3]
1 :: 2 :: 3 :: []

Зачем мы упомянули оператор конструирования? Он полезен когда мы начинаем сопоставление с образцом для списков, мы обсудим это чуть позже.

Тип данных для связного списка


Тип данных для связного списка целых будет int list; общий тип для связного списка объектов типа foo будет foo list.
Читать дальше →
Total votes 23: ↑21 and ↓2+19
Comments14

Самый простой способ создать трафик на сетевом интерфейсе

Reading time1 min
Views33K
Есть программа iperf, которая позволяет проверять скорость интерфейсов (у меня на тестах из 10G интерфейса она выжимала 9.37 Гбит/с).

Пакет (в дебиане и убунте) так и называется — iperf.

Применение очень простое: на одном сервере запускаете iperf -s X.X.X.X (свой собственный адрес сервера, на котором слушать). Можно запустить просто iperf -s, тогда слушать будет на всех интерфейсах.

На клиентской части пишем iperf -c X.X.X.X (адрес сервера из предыдущего этапа). Клиент подключается, работает 10 с и показывает скорость работы канала.

Пример: сервер имеет адрес 192.0.2.1, клиент 192.0.2.200. На сервере запускаем iperf -s 192.0.2.1 на клиенте iperf -c 192.0.2.1.

Для того, чтобы сделать много байтов (привет хостерам с соотношениями) нужно просто указать опцию -t (время в секундах). Многие гигабайты трафика в нужном направлении вам обеспечены. С учётом текущих тарифов для дома — можно даже с домашней машины, за 3-4 часика можно выправить любое соотношение с минимальной нагрузкой как на сервер, так и на клиента.
Total votes 70: ↑56 and ↓14+42
Comments22

Введение в OCaml: Структура программ на OCaml [2]

Reading time12 min
Views8K
[прим. пер.: продолжение перевода, первая статья тут]
тизер к статье с графикой на OCaml

Структура программ на OCaml


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

Локальные «переменные» (на самом деле локальные выражения)


Возьмём нашу функцию average на Си и добавим в неё локальные переменные (сравните её с примером в прошлой главе).

double average (double a, double b)
{
  double sum = a + b;
  return sum / 2;
}

Теперь посмотрим на это для OCaml:

let average a b =
  let sum = a +. b in
  sum /. 2.0;;

Стандартное выражение let name = expression in используется для определения локального именованного выражения и name может быть использовано в дальнейшем вместо expression вплоть до ;;, который означает окончание локального блока кода. Обратите внимание, мы даже не использовали отступ после объявления in. Просто воспринимайте let ... in так, как будто это один оператор.
Читать дальше →
Total votes 25: ↑22 and ↓3+19
Comments24

Локальная уязвимость в ядре линукс (и не только), DoS

Reading time2 min
Views2.6K
Опубликован код, приводящий к зависанию компьютера (100% загрузка всех ядер, исчерпание файловых дескрипторов).

Ссылка на код: lkml.org/lkml/2010/11/25/8

Проверял на 27, 32 — зависание воспроизводится. 32/64 бита.

Уточняю: через 1-2 секунды пролетает крашдамп (не успеваю прочитать), хост перегружается. В другом тесте система упала уже после завершения программы (примерно через 5-7 секунд).

PS Эксперты с лора говорят, что FreeBSD 8.1 тоже падает.

PPS Внезапно — на CentOS 5.5 с 2.6.18 не падает. Если запустить из-под рута, роняет, из-под пользователя — просто спокойно отрабатывает. При этом руту в соседней консоли ничего не мешает работать и система не падает.

Пытаюсь уточнить ситуацию:

1) CentOS 2.6.18/64 с непривелегированным пользователем не подвержен.
2) Debian Squeeze 2.6.34/64 с непривелегированным пользователем подвержен (kernel panic).
3) По слухам, в некоторых FreeBSD удалось воспроизвести (из комментариев — FreeBSD 8.2-PRERELEASE не воспроизводится)
4) Из комментариев — на Ubuntu 2.6.32/64 воспроизвести не удалось, на 2.6.36 воспроизводится.
5) Ubuntu 2.6.34/64 — воспроизводится
6) Из комментариев — RHEL5.5 не зависает, но тормозит и мешает убивать процесс.
7) Из комментариев: FreeBSD 4.11, 8.1, OpebBSD 4.6, 4.8, DragonFLY BSD 2.8.0 — подвержены
8) OpenVZ + 2.6.18 Debian/Centos — не воспроизводится.

PPPS тем, кто тестит — запускать надо от непривелегированного пользователя.
Читать дальше →
Total votes 117: ↑107 and ↓10+97
Comments197

Введение в OCaml: The Basics [1]

Reading time10 min
Views25K
(предисловие от переводчика: сел учить окамл, обнаружил, что отсутствует перевод на русский язык руководства для начинающих. Восполняю этот пробел).

Основы


Комментарии


Комментарии в OCaml обозначаются символами (* и *), примерно так:
(* Это однострочный комментарий *)

(* Это комментарий
   на несколько
   строк.
*)

Другими словами, комментарии в OCaml очень похожи на комментарии в Си (/* ... */).

В настоящий момент нет однострочных комментариев (как #... в Перле или // ... в C99/C++/Java). Когда-то обсуждалась возможность использовать ## ..., и я весьма рекомендую окамловским товарищам в будущем добавить эту возможность (однако, хорошие редакторы открывают возможность использования однострочных комментариев даже сейчас).

Комментарии в OCaml вложенные, это позволяет очень просто комментировать куски кода с комментариями:
(* This code is broken ...

(* Primality test. *)
let is_prime n =
(* note to self: ask about this on the mailing lists *) XXX;;

*)

Вызов функций


Допустим, вы написали функцию, назовём её repeated, которая берёт исходную строку s, число n и возвращает новую строку, состоящую из n раз повторённой строки s.

В большинстве С-подобных языков вызов функции будет выглядеть так:
repeated ("hello", 3) /* this is C code */

Это означает «вызвать функцию repeated с двумя аргументами, первый аргумент — строка hello, второй аргумент — число 3».

Подобно остальным функциональным языкам программирования, в OCaml, запись вызовов функций и использование скобок существенно отличается, что приводит к множеству ошибок. Вот пример того же самого вызова, записанного на OCaml: repeated "hello" 3 (* this is OCaml code *).

Обратите внимание — нет скобок, нет запятых между аргументами.
Читать дальше →
Total votes 65: ↑59 and ↓6+53
Comments80

Сравнение скорости процессоров dedicated-серверов

Reading time2 min
Views13K
                                                                              (на графике по оси абсцисс логарифмическая шкала)

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

Вопрос оказался интересным. Вот результаты тестов. В качестве теста использовался sysbench (он есть во многих дистрибутивах Линукса, в т.ч. в Ubuntu и Squeeze).

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

Хорошо видно, что атомы существенно проигрывают Core/Xeon процессорам, которые в один поток оказываются в полтора-два раза быстрее, чем атом с двумя ядрами и гипертредингом.

Ещё одно интересное наблюдение — на атоме 32-битный и 64-битный режим показывают себя одинаково, на всех остальных процессорах 64-битная архитектура заметно выигрывает у 32-битной.

В качестве эталонного теста использовался вызов nice -20 sysbench --test=cpu --cpu-max-prime=40000 --num-threads=X run (X — число потоков, от 1 до 16).
Читать дальше →
Total votes 41: ↑33 and ↓8+25
Comments69

Dedicated-сервер за 1500 рублей

Reading time1 min
Views25K
Благодаря тому, что Supermicro создала серверные платформы (19", 1U) на базе процессоров Intel Atom, мы смогли создать новый низкий тариф на арендуемые (dedicated) сервера.

Сервер на базе двухъядерного процессора Intel Atom D510 (1,66 ГГц), 2 гигабайта оперативной памяти, 500 гигабайт дискового пространства — за 1500 рублей в месяц.

Сервер с IPMI (и всеми полагающимися в связи с этим плюшками).

Причина, почему атомы в два раза дешевле ближайшей «старшей» платформы (Core 2 Duo, 3000р)?
  • Они кушают меньше электричества
  • Они меньше греются (меньше нагрузка на кондиционеры, опять же, меньше электричества).
  • У них ниже стоимость, а значит, меньше затраты на аммортизацию.

Читать дальше →
Total votes 83: ↑64 and ↓19+45
Comments174

Nano: И всё-таки его придётся выучить [3]

Reading time1 min
Views42K
Заканчиваем. Предыдущие части: [1], [2]. Комбинации для запоминания: undo/redo, поиск/замена.
Скриншот Scribus с справкой по nano
В конце топика — ссылка на PDF'ку c обобщённой шпаргалкой и её исходник (на картинке скриншот редактора).

Отмена действий по-умолчанию не работает и требует запуска редактора с опцией «поддержка отмены» (да, nano по-умолчанию не поддерживает undo). Ключ командной строки -u.

nano -u sometext.

После этого начинают работать команды:

Alt-U — undo
Alt-E — redo.

Заметим, что в справке (Ctrl-G) оно появляется тоже, только если запустить nano с опцией -u.

Если nano запущен без -u, то единственной формой undo является отмена вырезанных по Ctrl-K строк обратным их вставлением — Ctrl-U.

С поиском чуть лучше.
Читать дальше →
Total votes 77: ↑49 and ↓28+21
Comments39

Nano: И всё-таки его придётся выучить [2]

Reading time2 min
Views174K
Продолжаем. Предыдущий топик (навигация по тексту): тут.

Сегодняшняя тема — работа с выделением, копирование и удаление кусков текста.

Для понимания принципов команд работы с текстом нужно сначала понять принцип выделения текста. Он осуществляется либо мышью, либо с клавиатуры. С клавиатуры выделение происходит так: сначала отмечается начало выделение: Alt-A или Ctrl-^. Далее следует навигация — и до момента выполнения действия над текстом в буффере, выделение сохраняется (обратите внимание, выделение сохраняется даже при вводе текста, в этом оно сильно отличается от выделения в gui-приложениях windows и ближе к persistent blocks в TurboC, DN и соответствующей опции Far Manager'а).

Обратите внимание, применимы все функции навигации, включая переход по номеру строки или поиск (в следующих выпусках).

Далее выделенный текст можно удалить или скопировать в буффер. Это делает комбинация Ctrl-K (или F9).

Выделенный текст можно скопировать в буффер обмена — комбинация Alt-6 (да, мы ЛЮБИМ nano).

Далее мы можем вставить текст из буффера обмена — Ctrl-U или F10. Обратите внимание — в подсказке снизу написана неправда, это не отмена удаления, это вставка.

Читать дальше →
Total votes 48: ↑31 and ↓17+14
Comments32

Nano: И всё-таки его придётся выучить [1]

Reading time2 min
Views108K
            Речь идёт о текстовом редакторе nano в Linux.
Я не люблю nano и предпочитаю vim. Однако, в отсутствии vim, выбирая между vi и nano, я всё-таки предпочту nano, ибо как говорится в старой поговорке, «у vi есть два режима: бибикать и всё портить».

Кроме того, идёт активная замена vi на nano во многих дистрибутивах. Например, в новых версиях Debian и Ubuntu по-умолчанию vi устанавливается в самом куцем виде. А главное, его больше нет в busybox install/initrd этих ОС, что однозначно заставляет задуматься об изучении nano, не из любви к нему, а по необходимости.

Я понимаю, что сидеть и зубрить список комбинаций кнопок бесполезно, так что вместо этого я думаю сделать маленькие nano-уроки — по 8 комбинаций или фич за урок (я и сам их планирую изучать по мере публикации).

Nano не имеет «режима команд» как vim, и этим похож на oldschool-редакторы из консоли DOS/Windows (NC, Far Manager, DN, hiew/biew, внезапно втесавшегося в список mcedit и т.д.). Все команды отдаются нажатием комбинаций клавиш — функциональными кнопками или комбинацией Ctrl-буква, Alt-буква.

Важное отличие от 'generic editor' — это поддержка эмуляции Ctrl'а и Alt'а.

Читать дальше →
Total votes 155: ↑124 and ↓31+93
Comments295

Xen Cloud Platform в условиях предприятия [4]

Reading time10 min
Views6.4K
Четвёртая часть. Предыдущие части: Первая, вторая, третья.

В этой главе: блочные устройства: физические и виртуальные; образы дисков, хранилища.

С точки зрения управления машинами это самая содержательная часть. Даже управление сетью (следующие части) проще, чем диски. Причина проста — дисковые устройства в виртуализации — самые сложные абстракции.

Прежде чем перейти к фактическому описанию, перечислим свойства дисковых устройств:
  • Они хранят информацию.
  • У них есть свободное место для будущей информации.
  • Они не связаны с конкретным компьютером и могут переключаться между компьютерами.
  • Они позволяют записывать, читать информацию.
  • Они позволяют стирать старую информацию и записывать новую поверх старой.

Каждая строчка из этого списка — отдельное свойство, требующее отдельной реализации (для сравнения у сетевого интерфейса свойств всего два: они могут принимать и отправлять информацию).

Для виртуализации эти свойства разделены в две группы: первая, связанна с хранением информации. Вторая — связанна с доступом к месту хранения информации.

Очевидно, что доступ (процесс доступа) тесно связан с виртуальной машиной. А процесс хранения — нет. Хранить мы можем и без того, кто пишет, а вот писать без того, кто хранит — не можем. Впрочем, вы не можем так же писать информацию и без того, кто пишет, таким образом процесс доступа тесно связан как с виртуальной машиной, так и с хранилищем информации.
Читать дальше →
Total votes 14: ↑9 and ↓5+4
Comments4

Xen Cloud Platform в условиях предприятия [3]

Reading time6 min
Views4K
Третья часть. Предыдущие части: Первая, вторая.

В этой теме: управление памятью и процессорами виртуальных машин.

Память


Для того, чтобы понять, как XCP работает с памятью, нужно понять, как с ней работает Xen. В отличие от OpenVZ, Xen всегда выделяет память виртуальной машине (точнее, домену) в монопольное пользование. Память домена — это память домена и только. Никакого оверселла, никаких shared pages, никакого hypervizor swap (виртуальные машины свопиться, разумеется, могут). Если у вас есть 4Гб, то примерно 3.5Гб вы можете разделить между гостевыми машинами (512 уйдёт на dom0). Как вы будете их делить — ваша свобода. Но дать машине больше памяти, чем есть в наличии вы не сможете. Нет. Точка.

Зато в управлении реально выделенной памятью всё очень хорошо. В Xen 3.4 механизм управления памятью (xenballoon) основан на довольно сложной для восприятия мозгом, но простой с точки зрения гипервизора, основе: страницы памяти передаются (transfer) между доменом и гипервизором.
Читать дальше →
Total votes 31: ↑28 and ↓3+25
Comments25

Xen Cloud Platform в условиях предприятия [2]

Reading time8 min
Views8.9K
Предыдущая часть определяла терминологию. Теперь перейдём к обстоятельному объяснению «как это устроено». (тем, кому не терпится «взять и запустить» могут сделать с помощью руководств на сайте xen'а).

В этой части: подробнее про пулы и обзор устройства хостов и чуть-чуть о Xen'е.

Пулы


Весь XCP представляет собой один пул (поддержка нескольких пулов есть в очень отдалённых планах). В принципе, компания может иметь несколько пулов. Если используется разное железо для хостов, то придётся формировать пулы в пределах одинакового железа; в вырожденном случае это означает «один хост — один пул». В такой конфигурации возможность живой миграции отсутствует, а единственной опцией является экспорт/импорт виртуальной машины (медленно и неавтоматически). Соответственно, нужно иметь хотя бы пару одинаковых машин, чтобы получить возможности живой миграции (одинаковых означает «совсем одинаковых», вплоть до степпинга процессора). Чуть раньше возникли вопросы, можно ли в пул собрать разное железо. Официальный ответ: нет. Если очень захотеть, то можно, но все возможно возникшие при этом глюки будут вашими собственными именными граблями.

Каждый хост пула (его устройство обсуждается чуть ниже) имеет полную информацию о состоянии всех машин в пуле (хранит всю базу пула). Выполнять же операции может только один хост, именуемый «мастером пула». Мастер может легко меняться на ходу (без перезагрузки и остановке в работе виртуальных машин), в случае «смерти» мастера его роль может быть перенесена на другой хост силком. Если бывший мастер после этого загрузится, то произойдёт «pool split» — разделение пула на две неравные части, когда бывший мастер считает, что это он мастер, а все остальные подчиняются новому мастеру. Эта проблема легко решается силовой сменой настроек «бывшем мастере».

С мастерами следует играться осторожно, именно из-за игр с тем, кто мастер, я и получил ситуацию "Ghost in the Xen" (когда была запущена виртуальная машина, отсутствующая в списке машин облака). Впрочем, со времён XCP 0.1.1 ситуация немного поменялась, и поведение хостов в отстутствии живого мастера стало более разумным.

Читать дальше →
Total votes 38: ↑32 and ↓6+26
Comments15

Xen Cloud Platform в условиях предприятия [1]

Reading time8 min
Views12K
Среди всех энтерпрайзнутых систем виртуализации XCP единственная бесплатная и свободная. История XCP уходит в XenServer, который хоть и основывался на опенсорсном гипервизоре, но был вполне себе платным софтом. Цирикс опубликовала код XenServer под свободной лицензией и с этих пор XenServer начал плавно превращаться в Xen Cloud Platform.

В этом цикле статей я расскажу о том, как применять XCP в условиях единого административного центра, когда виртуальные машины и инфраструктура виртуализации управляется одной и той же организацией (т.е. о типичном сценарии с виртуализацией серверов предприятия). В этих статьях будет мало примеров и ключей командной строки (administration guide на сайте цирикса вполне опубликован), вместо этого я буду рассказывать про понятия, термины и взаимоотношения объектов.

С пользовательской точки зрения основным различием между обычным зеном (в составе большинства ОС) и XCP является процесс установки и количество добработок до запуска в продакт. XCP поставляется в виде ISO'шки с готовой ОС для dom0 (CentOS), адаптированной для обслуживания гипервизора и обеспечения работы хостов в облаке. Xen же обычно идёт в виде hypervisor + utils, подразумевается, что всё остальное человек создаст сам. Ещё некоторым бонусом для тех, кому приходится соприкасаться с продукцией Microsoft, являются подписанные драйвера для Windows (их с некоторыми ухищрениями можно установить и в зене, но в XCP они являются родными).

XCP — относительно своеобразная платформа. Она не «закрыта» в том смысле, как закрыт, например, hyper-v, но идёт в виде готовой ОС, многие аспекты конфигурации которой контролируются средствами платформы, а не ОС. Например, сеть: можно повесить ip-адрес на любой интерфейс ifconfig'ом, но последствия этого будут печальные — следует использовать инструментарий платформы для управления сетями и интерфейсами.

XCP состоит из нескольких компонент: xen, xapi, open vswitch, xe cli, stunnel, sqeezed обеспечивающих разные аспекты работы системы.

В начале о системных требованиях:
Читать дальше →
Total votes 48: ↑39 and ↓9+30
Comments40

Распределённая система имён в Интернете

Reading time3 min
Views2.2K
Это досужие рассуждения, никакого кода или даже описания протокола взаимодействия у меня нет. Оригинальное исследование в чистом виде, как это называют в Википедии.

… Нам нужна система идентификации сайта, такая, чтобы мы не зависели от воли третьих лиц при определении домена. Точнее, чтобы уйти от терминологии DNS, просто имени. И связанного с ним множества ресурсных записей.

Очевидно, что достигается это цифровой подписью под именем. В этом случае чужие изменения в RR зоны не будут приняты. Вопрос только в том, что считать достоверной подписью.

Тут, мне кажется, стоит подумать о системе GPG/PGP, как менее централизованной (напомню, есть две модели управления ключами — PKI и GPG, PKI предусматривает бинарность доверия — либо доверяем в пределах политики удостоверяющего центра, либо нет). У человека есть набор корневых сертификатов, которым он доверяет. Через них удостоверяются другие УЦ и предъявители сертификатов.

Модель GPG подразумевает иной подход. Вместо множества авторитетных УЦ, которым доверяет пользователь (что в реалиях современных браузеров означает, что за пользоваеля решает создатель браузера), у пользователя есть лишь один абсолютный центр доверия — это он сам. Если он подписал, что А=Б, то мы можем точно считать, что А=Б. (в нашем вопросе, это означает, что Б может подписывать данные А, и что это правда). У нас есть люди (знакомые, службы в интернете и т.д.) с разным уровнем доверия к их подписям, и итоговое доверие вычисляется по подписи.

Например, закадычный приятель, который точно не будет подписывать ахинею, говорит, что А=Б, наверное, это так. Если же большинство из френдов считают, что thepiratebay.org=194.71.107.15, то наверное, это так. Как бы нас не убеждал в обратном гугль (с уровнем доверия 5 из 10).

Таким образом, система имён выглядит следующим образом: человек заходит на сайт (оставляем в стороне то, как он узнал первое имя, это проблема курицы и яйца, и она была решена даже при запуске DNS, не говоря уже про возможность использовать DNS как kickstart для новой системы), видит ссылку. Ссылка ссылается на имя и хэш подписи.

Если же человек хочет зайти на нужный ему ресурс, то он (человек и его воплощающий браузер) проверяет по «базам друзей» какой хеш наиболее авторитетен для указанного имени. Если есть консенсус, то, человек идёт на указанный сайт. Если есть разногласия, то появляется список:
vodka:

Homepage about homemaid vodka: 7.3 балла (миша — 3 балла, natsu 3 балла, google 1.3 балла), PGP key ABC687A687684CFA3…
vodka: best site about vodka, site selling for vodka, vodka for selling. 1.31 балла (yandex 1.3 балла, kibersquater 0 баллов, sellingdomains 0 баллов, somerandomcontact — 0.01 балла).
vodka: under construction 0.1 балла (вася пупкин 0.1 балла).


Если человек считает, что именно это имя соответствует имени сайта, то он подписывает подпись на записе о сайе. И с этого момента никакие усилия RIAA, USA, кровавой гэбни и т.д. не сделают так, чтобы подпись была инвалидирована. Если сайт меняет адреса, то он переподписывает новую запись (и мы, доверяя Б в вопросе подписания сайта об «А» автоматом доверяем новой записи).
Читать дальше →
Total votes 37: ↑29 and ↓8+21
Comments73

cut и grep или awk?

Reading time2 min
Views78K
Часто в скриптах можно встретить что-то вроде foobar|awk '{print $1}' («часто» — это действительно часто).

Такой вызов awk всего лишь вывходит первую (n-ную) колонку из вывода предыдущей команды. Но это явный оверкилл! awk — довольно мощный язык потоковой обработки данных, и применение его как простого field-separator не есть хорошо.

Для вырезания из строки указанного поля лучше использовать команду cut. Она умеет меньше, а потому проще в использовании и быстрее.

В современном линуксе обработка вызова awk куда более сложна, чем вызов cut. В дебиане, например, awk — линк на /etc/alternatives/awk, который ведёт (чаще всего) на gawk. Который почти в 10 раз больше по размеру, чем cut. Разумееся, cut загружаеся быстрее.

cut умеет вырезать не только байты, но и нужные поля (опция -f). Поле — это текст между разделителями. По-умолчанию разделитель пробел/табуляция, но он легко меняется опцией -d.

Второй подход — использовать опцию -o у grep. Эта опция выводит не всю строку, а только совпадающее с критерием поиска grep. Очевидно бесполезно при поиске точной подстроки, но очень полезно при использовании регулярных выражений.

Например,
grep -v "#" /etc/inittab |cut -f 4 -d : -s
выведет список программ, запускающихся init'ом (четвёртое поле, поля разделяются двоеточием).

Или
grep http://\\S\\+ -o /var/log/apache2/error.log
выдаст список URL'ов из файла с ошибками (первый урл в строке).

… и никакого awk.

UPD: В комментариях подсказывают ещё более интересную конструкцию без запуска внешнего файла (команда read реализуеся средствами bash'а):
foobar | (read p1 p2; echo p1)

P.S. Речь не о единичном вызове (тут нет разницы awk, grep или даже python/perl). Речь о множестве вызовов в цикле в скрипте. Все примеры сравнивайте в цикле с сотнями (лучше тысячами) вызовов.
Total votes 85: ↑77 and ↓8+69
Comments58

Современные возможности виртуализации

Reading time9 min
Views7.6K
После недавних дискуссий о том, какой гипервизор лучше, возникла идея выписать функциональность современных систем виртуализации без привязки к конкретным названиям. Это не сравнение «кто лучше», это ответ на вопрос «что можно сделать с помощью виртуализации?», общий обзор возможностей промышленной виртуализации.

Исполнение кода


Так как гипервизор полностью контролирует виртуальные машины, он может специфичным образом управлять процессом работы машины.

Различные системы виртуализации предлагают несколько методов исполнения кода (полная эмуляция в список не включена, так как не используется в промышленной виртуализации):
  • binary rewriting. Этот подход использует VMWare и Connectix Virtual PC (куплен microsoft) при виртуализации на хосте без аппаратной виртуализации. Гипервизор (виртуализатор) просматривает исполняемый код и помечает инструкции, требующие «виртуализации» брейкпоинтами и эмулирующий (виртуализирующий) только такие инструкции.

Читать дальше →
Total votes 65: ↑60 and ↓5+55
Comments95

Добавление и удаление на ходу SATA/SCSI устройств

Reading time2 min
Views66K
Современный Linux (2.6+) может обнаруживать новоподключенные устройства (на шинах, которые поддерживают hotplug). Их можно, так же отключать, предварительно отмонтировав файловые системы и сделав sync. Среди hotplug шин не только USB, но и SATA, SCSI и SAS (в теории, это же применимо и к PATA, но там много глупых контроллеров, которые не умеют адекватно реагировать на исчезновение устройства).

Отключать их лучше не дёргая на ходу физическое устройство, а сказав ядру полностью забыть про про него (гарантируя тем самым, что никаких операций ввода-вывода с устройством производиться не будет, даже если вспохватившийся кеш). Кроме того, иногда нужно выполнять эмуляцию процедуры plug-unplug без физического дёргания питания/шины данных (что не очень хорошо для железа). Самая типичная ситуация — это отладка скриптов udev.

Удаление устройства


echo 1 >/sys/block/sdX/device/delete

(x — буква устройства, sda, sdb, etc).

Эта команда удаляет указанное устройство. Заметим, это низкоуровневая команда, которая не проверяет кеш и статус примонтированности, так что лучше сначала сказать umount & sync.

К сожалению, я не знаю метода совместить выключение шпинделя диска с его удалением с точки зрения ядра. Шпиндель можно отключить командой scsi-spin, однако, при попытке удалить устройство, оно будет раскручено заново и удалено. А у удалённого устройства уже нельзя ничего останавливать (нет устройства). Так что эта часть проблемы пока не решена.

Добавление устройства


Мы не можем «добавить» устройство, мы можем отдать контроллеру команду «перечитать» список устройств, подключенных к тому или иному порту. Если там найдётся что-то интересное, ядру дадут знать.

echo "- - -" >/sys/class/scsi_host/hostX/scan

X — номер шины, совпадает с номером SATA порта на материнской плате. Если не знаете, можете смело делать для всех хостов по очереди, ничего, кроме небольшого лага в дисковых операциях, незаметного для софта и файловой системы, это не даст.

Обратите внимание, host'ы нумеруются с 0, а не с 1. (а в dmesg ata устройства нумеруются с 1).

Так же осуществляется и сканирование USB-SATA переходников (usb-боксов и внешних винчестеров — они просто фигурируют как ещё один scsi_host).

Если мы говорим про SCSI, то вместо "- — -" можно указать точный номер устройства/шины/LUN'а сканируемого устройства (например, «200 1 2»). SATA, в силу архитектурных особенностей (один target для одного initiator) принимает туда только «0 0 0».

Ещё об удалении… Если вы не знаете буквы устройства, но знаете его физическое место подключения, то удалять можно «прямым текстом», записью «1» в "/sys/bus/scsi/devices/targetX:0:0/X:0:0:0/delete".
Total votes 64: ↑54 and ↓10+44
Comments48

реклама

Reading time1 min
Views529
Понятно, что большинство рекламы на хабре не видит. Но, всё-таки…

А если добавить рейтинг для рекламы? Те самые "±". Во-первых увидев тупую рекламу можно будет удовлетвориться минусом, во-вторых, если реклама хорошая, это будет видно.

Заодно и фидбэк рекламодателям.
Total votes 15: ↑6 and ↓9-3
Comments3

GPT и WD Advanced format

Reading time3 min
Views23K
Одна из внезапных проблем при использовании GPT — (если мы хотим увидеть приличную скорость записи) необходимость руками подстраивать положение раздела на дисках WD с Advanced format. Суть Advanced Format проста: внутри диск имеет 4к сектора, наружу они эмулируются как 512-байт. Если мы делаем запись двух секторов в пределах одного 4к блока, он записывается один раз. Если мы делаем запись двух секторов так, что задеваем два 4к-сектора — диску приходится читать два сектора, обновлять информацию и записывать их обратно. Плохо и медленно. Современные ОС используют 4к блоки для записи, так что если мы попадём правильно, то каждая операция записи будет просто записью, без чтения. Если же мы попадём неровно (например, 2кб из первого сектора и 2кб из второго), то мы получим огромные тормоза (см ссылку внизу на сайт IBM с статистикой «торможения» при ошибках в разметке).

WD, когда размышляла насчёт 512 VS 4k, не учла, что помимо MBR есть ещё GPT. В случае 2Тб дисков MBR ещё терпит, однако, впереди диски на 3Тб, и в них MBR просто математически не сможет обеспечить разделы и переход на GPT неизбежен.

Так что проблему GPT и WD нужно учитывать уже сегодня. Основным инструментом для манипуляций с GPT в настоящий момент является parted и его графическая версия gparted. К сожалению, gparted не умеет того, что нам нужно, так что всё последующее описывает использование parted.

Основная мысль: Все величины (начало, конец раздела) должны быть кратны 4кБ, или, что чуть проще, 8 секторам. Это требование WD advanced format.

Сама GPT занимает некоторый объём (33 сектора: 32 сектора GPT, 1 сектор — фальшивый MBR-затычка), так что первое кратное 8 число, с которым мы можем работать — 40 секторов. Оконечное число зависит от ёмкости диска, но тоже, желательно, кратное 8. Кроме того, GPT дублируется в конце диска, так что место в конце диска так же будет «обкусано».

Для наилучшей производительности нужно учесть размер PE для LVM — 4Mb (8192 сектора) и установить размер тома кратным количеству PE. В результате всех этих манипуляций мы потеряем чуть-чуть места (меньше 8Мб), но зато получим быстрый том, у которого будут отсутствовать «unused» килобайты в описании в LVM.

Помимо этого есть ещё мнение самого gparted, о том, что лучшее положение тома — кратно мегабайтам. Таким образом, итоговые требования звучат так: том должен начинаться и заканчиваться на величинах, кратных 4Мб.

Итак, создание LVM тома на WD'шном диске с Advanced Format:
Читать дальше →
Total votes 12: ↑8 and ↓4+4
Comments19

Information

Rating
Does not participate
Registered
Activity