пятница, 26 декабря 2008 г.

Взгляд на кризис(ы) капитализма с точки зрения кибернетики

"Разруха не в сортирах, разруха в головах."
Профессор Преображенский

И давал себе слово игнорировать очередное попадалово наших "за что боролись на то и напоролись", да уж больно забавно наблюдать занимательное шоу "мыши плакали, кололись, но продолжали есть кактус".

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

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

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

-==============================================
-= Verboten. Начиная с этого места школота и лица
-= с гуманитарным и квадратно -гнездовым способом
-= мышления могут дальше не читать. Опасно для здоровья.
-==============================================

Итак, есть два вида колебательных процессов. С положительной обратной связью и отрицательной обратной связью.

Процессы с отрицательной обратной связью - это шарик, лежащий на дне круглой чашки. Или маятник бабушкиных часов. Толкни его - он поколеблется и успокоится, заняв энергетически наиболее выгодное положение. В самой нижней точке чашки. А также усилители электронных сигналов. Летящий самолет с вменяемыми пилотами. Едущий автомобиль с вменяемым водителем. Львиный прайд в саванне Африки, делящий жизненное пространство со стадом антилоп.

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

Примеры достаточно очевидны. К чему это?

Все просто. Практически тривиально.

Капитализм - процесс с положительной обратной связью.

Катни шарик на вершине горы - он будет стремиться укатиться вниз.

Почему?

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

Капитализм - именно такая система. Нет саморегулирования с отрицательной обратной связью. И быть этой отрицательной обратной связи не может по причине происхождения (генетического) капиталиста как вида.

Кризис - неизбежное следствие подъема. Это практически трюизм.

Почему так?

По определению.

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

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

Иное дело - хомо сапиенс, домашние животные, грызуны, насекомые и прочие "высокоинтеллектуальные" представители фауны.

"После нас - хучь потоп". "Жри-пей-веселись - после смерти нет наслаждения". "Лучше один сожрет, чем трое понюхают". Ну и так далее.

Выжирается все. Дочиста. "Если не сожру я - сожрет другой. Так я хотя бы надкусаю - даже если уже не в состоянии жрать".

Причина? Начисто отсутствует чувство меры.

Вот и ответ. "Нет, я не могу позволить себе не становиться монополистом. Если этого не сделаю я - сделает конкурент."

Люди как тараканы выжирают все дочиста. "После нас хучь потоп!"

Хочу вернуться к животному миру. Аналогии которого более понятны лицам с квадратно-гнездовым способом мышления, к каковым следует отнести и капиталистов.

Исконные хищники (к каковым человек в общем-то, не относится) никогда не:

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

И лишь низшие формы, а также формы, для которых факторы естественного отбора подавлены, либо напрочь отсутствует хоть что-либо, отдаленно напоминающее интеллект - подыхают с голоду при ничем не ограничиваемом "развитии" (в кавычках потому, что если в конце - смерть от обжорства либо с последующей голодухи - то это не развитие).

Ясно, да? Безудержное стремление к неограниченному росту прибыли - это фактор положительной обратной связи. В конце цикла развития которого неизбежно находится Толстый Полярный Лис. Сиречь песец.

Для сравнения прошу заметить - при феодализме кризисов не было. Феодал худо-бедно происходил из какой-никакой, но элиты и отличался некоторым интеллектом. Он не рубил сук, на котором сидел (если рубил - его выпиливали. Либо свои же сородичи-хищники - либо обжираемые лемминги). Капиталист умом и сообразительностью отнюдь не отличается. Он жрет и жрет, пока не треснет пузо. Даже самый высокоинтеллектуальный.

"Будем поднимать квоту сэйлзам, пока не выгорят. Когда выгорят - наймем новых и будем продолжать жрать, жрать и жрать! Больше, больше прибыли! Еще больше! Еще, еще! Затаптываем конкурентов! Клиентов надо силком тащить - но чтоб деньги были!"

Знакомая музыка? А заканчивается чем - тоже догадаться нетрудно?

Это, мальчики и девочки, стратегия царя Мидаса. Которая имеет край - и весьма близкий.

Не надо только передергивать и называть стремление к неограниченной прибыли прогрессом (или его двигателем, что моночленственно). Поговорка про "капитализм стоит на краю пропасти..." отнюдь не фигура речи. Он на ней реально стоит - см.выше.

Нет и не может быть никакого прогресса, если впереди голод и разруха.

Прошу заметить - я отнюдь не призываю вернуться назад, к феодализму (что было бы весьма мило на самом-то деле). Равно как и к перестройке человеческого сознания в духе коммунизма.

Лемминги - как и рак - на самом деле весьма глупы и понимают лишь кнут, причем чем жестче - тем лучше. Условный рефлекс в духе собачек Павлова.

Решение на самом деле самоочевидно до глупости. Причем оно уже было.

Прогрессивный налог. Во-первых, на оборот, во-вторых, на прибыль, в-третьих, подоходный, и в-четвертых - на роскошь.

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

Фактор отрицательной обратной связи.

Единственное но - реальность, увы, такова, что это практически недостижимо.

Требуется несколько невыполнимых условий:

- Нажравшееся до отрыжки правительство, озабоченное не воровством в государственных масштабах, а регулированием потенциального будущего. Не надо говорить, что правительство не обладает необходимой информацией. Статуправления исправно снабжают его информацией о состоянии бизнесов. Правительство должно быть фактором регулирования и отрицательной обратной связью, а не констататором фактов и аварийной затычкой. Проактивное управление всегда лучше реактивного размазывания соплей в духе "Я не шмогла! Ну простите меня! Накажите меня! Не выберите на другой срок!". Просрал кризис - садись, дорогой друг, не за мемуары - а в уютную камеру.

- Честная налоговая служба (а вот это оксюморон. Слова "честный" и "налоговая" подходят друг к другу, как кулак к носу).

- Жесточайшее исполнение налоговых кодексов.

- Жесткое ограничение чрезмерного развития бизнеса начиная с определенного порога. Дабы выкосить косителей бабла и чтобы только очень нуждающиеся в прогрессе или желающие облагодетельствовать человечество пересекали порог. Порог должен быть чрезвычайно высоким.

Маленький пример из жизни текущего кризиса.

Не секрет, что нынешний кризис порожден безудержным ростом ипотек и, как следствие, неконтролируемой застройкой + неограниченным вбросом кредитов на рынки = рост спроса и цен на жилье за пределы разумного.

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

Зачем в стране с населением одного крупного города столько элитной жилой площади - тайна выше моего разумения. Однако:

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

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

Как и следовало ожидать (наперекор истеричным воплям торговцев недвижимостью и их рупорков), поднебесно-спекулятивные цены на квартиры пошли вниз и будут падать дальше и дальше.

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

Щаз.

Кто хотел - уже снял офис. Или купил.

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

В финале знаете, что будет? А будет сначала обвальное падение цен на жилье до почти начального уровня десятилетней давности - "Купите хоть за сколько-нибудь! А то сгниет!", выбрасывание из окон (надеюсь) своих коробок тех неудачников-застройщиков, кто попал под занавес строящихся ипотечных пирамид и убежать с украденным вовремя не успел - а теперь поздняк метиадзе, а затем - самое интересное - такое же падение аренды офисов. Не скажу, до скольки - но оно неизбежно. И полупустые коробки бизнес-центров в элитных местах.

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

Запасайтесь попкорном. Шоу только начинается. Лемминги еще с обрыва не прыгали.

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

PPS. Господа инженеры, мне, как и вам, прекрасно известно, что качающийся маятник и шарики в ямках и на горках не являются полными аналогами обратной связи. Я привел их лишь как примеры, понятные даже идиоту.
____________________
* Я имею в виду корректное определение кибернетики как науки об управлении процессами во времени. Думаю, никто не станет спорить, что все в жизни есть суть процесс во времени. Включая саму жизнь.
** На что у господина Маркса есть опять-таки замечательная цитата о безбашенности господ капиталистов - "... а при 400% прибыли капитал положительно готов сломать себе шею". Беда в том, что недоумки-капиталисты - они Маркса не читали никогда. К сожалению. В силу либо своего происхождения от гопоты и бандюганов, либо интеллектуального снобизма - что одночленственно.

среда, 17 декабря 2008 г.

Использование ZFS на USB-устройствах

Хотя чисто теоретически ZFS и не предназначалась в качестве автономной файловой системы, использование ее на USB-устройствах не только возможно, но и вполне оправдано - при соблюдении небольшого количества простеньких правил.

Проведем небольшой эксперимент.

Возьмем флэшку USB 2.0 и создадим на ней ZFS-пул:

1. Выключим VOLD чтобы не путался под ногами ;)

# svcadm disable volfs

2. Определим имя устройства:

# rmformat -l

3. Создадим метку fdisk (на Solaris x86) и слайс:

# format -e

4. Построим ZFS-пул с точкой монтирования по нашему желанию:

# zpool create -f -m /mnt usbpool c1t0d0s0 *

где usbpool - имя, которое мы сами присвоили нашему USB-пулу.

Готово. Можно записывать и считывать. Пул создан и автоматически примонтирован на /mnt.

Однако - устройство-то съемное! А данный пул стал частью нашей системы. И, если мы отключим устройство, при перезапуске системы будут проблемы. Надо найти способ безопасного извлечения ZFS-пула usbpool.

А чего его искать, вот он:

# zpool export usbpool

Совсем готово. "МОЖНО ВЫНИМАТЬ!" :)

О'кей, вынули-походили-вставили.

Кстати, VOLD запускать не надо - он по умолчанию на Солярисе монтирует USB как pcfs-устройства на /rmdisk.

Возвращаем флэшку на родину.

Как ее увидеть, в таком случае?

Просто (надо помнить лишь имя пула):

# zpool import -f usbpool
# zpool clear usbpool

Успешный импорт ZFS-устройства автоматически монтирует его на заданную в ZFS устройства точку монтирования. Если свойство mountpoint задано как legacy или none -устройство монтируется вручную:

# mount -F zfs usbpool /mnt

Но нам, разумеется, удобней автоматическое монтирование пулов ZFS.

А теперь перечислим выясненные опытным путем (а также изучением мануалов) правила:

1. Устройство USB должно быть качественным. На флэшках сбойные блоки обнаруживаются практически сразу же, и никакая файловая система не относится к ним толерантно, несмотря ни на какие контрольные суммы и избыточное дублирование данных (параметр copies на ZFS для битых флэшек помогает плохо). Практически, битая флэшка обнаруживается сразу после создания пула, при запуске скруббинга (zpool scrub usbpool).

2. Пока не выполнен export пула - отсоединять его от системы вылезет боком. Во-первых, для системы - при перезагрузке возникнут проблемы с отсутствующим пулом, для чего в мануалах описан соответствующий воркэраунд. Забывать об этом не нужно.

3. Лучше всего, когда на системах с "блуждающими" USB-пулами остановлен VOLD (SMF-сервис volfs).

4. При подключении устройства нужно всегда выполнять, во-первых, импорт пула вручную, во-вторых, очистку пула командой clear.

Если придерживаться этих, в общем-то, нехитрых правил - то USB с ZFS вовсе не будет экзотикой, как и USB с UFS.

PS. В одной из следующих статей будет исследован вопрос возможности создания загрузочной ZFS-флэшки с Solaris 10 10/08.
_____________________
* Так зовут нашу флэшку - имя устройства определено командой rmformat. При работе с пулами можно не задавать полных путей типа /dev/rdsk... .

воскресенье, 14 декабря 2008 г.

My Review of Solaris 10 Operating System

Originally submitted at Sun Microsystems

Solaris Developer Center - The Source for Solaris Application Resources and Community


Excellent performance

By Solaris Professional User from Almaty, Kazakhstan on 12/14/2008

 

5out of 5

Pros: Fast and Powerful, Excellent performance, Great Features

Best Uses: Main server platform

Describe Yourself: Quality Oriented

Primary use: Business

Solaris 10 10/08 is the brilliant. Brilliant for every SA which is equipped by brain. :)
VERY fast, easy to install/upgrade and maintenance, very secure and rock-like stable. All our servers is upgraded onto 10/08 now (SPARC and x86x64) and shows the best results. and now, ZFS is the most value functionality. Now can be root fs, VERY fast - it equals systems with SAS and SATA drives. Looks like system works without HDD's. Excellent job!

(legalese)

суббота, 13 декабря 2008 г.

RAM-диски в Solaris, часть I

RAM-Диски в Solaris - вещь достаточно известная. Например, всем известен факт, что установка Solaris происходит через посредство RAM-диска.

Для непосвященных цитирую фрагмент man:

man ramdisk

Devices ramdisk(7D)

NAME
ramdisk - RAM disk device driver

SYNOPSIS
ramdisk@0:diskname

DESCRIPTION
The ramdisk driver supports numerous ramdisk devices that
are created by the system during the boot process (see
boot(1M)) or during normal system operation (see
ramdiskadm(1M) for more information).

DEVICE SPECIAL FILES
Each ramdisk can be accessed either as a block device or as
a raw device. When accessed as a block device, the normal
buffering mechanism is used when reading from and
writing to the device, without regard to physical disk
records. Accessing the ramdisk as a raw device enables
direct transmission between the disk and the read or write

[дальше поскипано, читайте мануалы сами ;)]

Оппоненты могут заметить, что в конце мануала прямо сказано:

A ramdisk may not be the best possible use of system memory.
Accordingly, use ramdisks only when absolutely necessary.

Но, к примеру - оперативная память сейчас стоит практически как грязь, есть машины с изобилием памяти - не редкость уже сервера начального уровня с 32 Гб и более RAM.

Посему, в некоторых случаях, к примеру, можно и использовать такую штуку.

Как мы это делаем? "Всегда правой!" ;)

man ramdiskadm

System Administration Commands ramdiskadm(1M)

NAME
ramdiskadm - administer ramdisk pseudo device

SYNOPSIS
/usr/sbin/ramdiskadm -a name size [g | m | k | b]

/usr/sbin/ramdiskadm -d name

/usr/sbin/ramdiskadm

DESCRIPTION
The ramdiskadm command administers ramdisk(7D), the ramdisk
driver. Use ramdiskadm to create a new named ramdisk device,
delete an existing named ramdisk, or list information about
existing ramdisks.

Ramdisks created using ramdiskadm are not persistent across
reboots.

[дальше поскипано, читайте мануалы сами ;)]

Проверим?

Создадим диск:

root @ athena / # ramdiskadm -a ram1 512m
/dev/ramdisk/ram1

Сформатируем его в UFS:

root @ athena / # newfs /dev/ramdisk/ram1
/dev/rramdisk/ram1: Unable to find Media type. Proceeding with system determined parameters.
newfs: construct a new file system /dev/rramdisk/ram1: (y/n)? y
/dev/rramdisk/ram1: 1048200 sectors in 1747 cylinders of 1 tracks, 600 sectors
511.8MB in 110 cyl groups (16 c/g, 4.69MB/g, 2240 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
32, 9632, 19232, 28832, 38432, 48032, 57632, 67232, 76832, 86432,
960032, 969632, 979232, 988832, 998432, 1008032, 1017632, 1027232, 1036832,
1046432

Смонтируем и посмотрим:

root @ athena / # mount /dev/ramdisk/ram1 /mnt
root @ athena / # df -h /mnt
Filesystem size used avail capacity Mounted on
/dev/ramdisk/ram1 480M 1.0M 431M 1% /mnt

Поиграемся:

root @ athena / # mkfile 256m /mnt/file.ufs
root @ athena / # ls -al /mnt
total 262290
drwxr-xr-x 3 root root 512 Dec 13 14:32 .
drwxr-xr-x 31 root root 1024 Dec 13 13:33 ..
-rw------T 1 root root 268435456 Dec 13 14:32 file.ufs
drwx------ 2 root root 8192 Dec 13 14:30 lost+found

Что ж, весьма быстро создается файл. RAM есть RAM.

Посмотрим, что у нас в устройствах (платформа SPARC):

root @ athena / # ramdiskadm
Block Device Size Removable
/dev/ramdisk/root 89702400 No
/dev/ramdisk/ram1 536870912 Yes

Надо же, кроме removable ram-диска создан еще неудаляемый root-диск.

Попробуем посмотреть, что на нем:

root @ athena / # mount /dev/ramdisk/root /mnt

panic[cpu0]/thread=300013bf5a0: BAD TRAP: type=31 rp=2a100815140 addr=51002000 mmu_fsr=0

mount: trap type = 0x31
addr=0x51002000
pid=735, pc=0x126a8d0, sp=0x2a1008149e1, tstate=0x4480001607, context=0x415
g1-g7: 0, 0, 1, 0, 1, 0, 300013bf5a0

000002a100814e60 unix:die+9c (31, 2a100815140, 51002000, 0, 2a100814f20, c11ec000)
........

Опачки, паника. Упала система. Так, не трогаем больше. :) Спасибо, что хоть sync выполнила.

Ладно, пойдем на систему x86 тогда и там проведем второй опыт.

root @ ktulhu / # ramdiskadm -a ram1 512m
ramdiskadm: couldn't create ramdisk "ram1": Resource temporarily unavailable

Так, сколько хотим мы памяти не можем забирать. Не выделяется. Уменьшим размер:

root @ ktulhu / # ramdiskadm -a ram1 384m
/dev/ramdisk/ram1

Ради спортивного интереса создадим файловую систему другого типа:

root @ ktulhu / # zpool create rampool1 /dev/ramdisk/ram1
root @ ktulhu / # zfs list rampool1
NAME USED AVAIL REFER MOUNTPOINT
rampool1 91K 346M 1K /rampool1

Посмотрим тип и свойства файловой системы:

root @ ktulhu / # fstyp /dev/ramdisk/ram1
zfs
root @ ktulhu / # fstyp -v /dev/ramdisk/ram1
zfs
version=10
name='rampool1'
state=0
txg=4
pool_guid=6334748904190478592
hostid=114097444
hostname='ktulhu'
top_guid=4892403041050478913
guid=4892403041050478913
vdev_tree
type='disk'
id=0
guid=4892403041050478913
path='/dev/ramdisk/ram1'
phys_path='/pseudo/ramdisk@1024:ram1'
whole_disk=0
metaslab_array=14
metaslab_shift=21
ashift=9
asize=397934592
is_log=0

Замечательно, RAM-диск с ZFS!

(оставим пока в покое тот факт, что он автоматически монтируется и с перезапусками системы будет небольшая заморочка, которую придется обходить).

Поиграемся теперь с ним:

root @ ktulhu / # ramdiskadm
Block Device Size Removable
/dev/ramdisk/ram1 402653184 Yes

Так, никаких дополнительных дисков на x86 нет.

root @ ktulhu / # mkfile -v 256m /rampool/file.zfs
/rampool/file.zfs 268435456 bytes

root @ ktulhu / # ls -al /rampool
total 262191
drwxr-xr-x 2 root root 3 Dec 13 14:48 .
drwxr-xr-x 30 root root 40 Dec 13 14:46 ..
-rw------T 1 root root 268435456 Dec 13 14:48 file.zfs

Очень быстро создается. ZFS и сама-то по себе очень шустрая, а в памяти просто беспредельно быстро файловые операции происходит (понятное дело, что до определенных пределов - но при объемах "сотни мегабайт" все хорошо ;)).

Окей, дабы не портить систему, удалим пул и подумаем:

root @ ktulhu / # zpool destroy rampool
root @ ktulhu / # zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 13.7G 59.2G 37.5K /rpool
rpool/ROOT 7.66G 59.2G 18K /rpool/ROOT
rpool/ROOT/zfsBE 7.66G 59.2G 7.66G /
rpool/dump 2.00G 59.2G 2.00G -
rpool/swap 4.00G 63.0G 138M -

Первое. Если использовать RAM-диски, возникает, например, желание создавать их автоматически, в момент загрузки системы. Скажем, с автоматическим копированием содержимого некоторых точек монтирования в память и с обратной записью на диск при shutdown. Это можно сделать сравнительно просто, написав несложный SMF-сервис. Причем можно будет легко делать RAM-диски как с UFS, так и с ZFS - и пользоваться всеми преимуществами последней.

Второе. Для чего это использовать? Это уже администратор пусть думает :). Ясное дело, что не для размещения Oracle redo logs. Но некоторые применения достаточно очевидны. Там, где нужна скорость доступа и типовые операции с файловыми системами.

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

пятница, 5 декабря 2008 г.

Патч Бармина и другие страшные слова

Патч Бармина - любимая шутка системных администраторов, оборудованных головным мозгом ;), над администраторами, не оборудованными оным - больше не действует в Солярисе 10.

Защита от дурака (fool proof) проникла и в наш последний бастион оборудованных головным мозгом и инстинктом самосохранения. :)

Попытка выполнить команду rm -rf / теперь обламывается:

server5# echo $0
-sh
server5# rm -rf /
rm of / is not allowed
server5# ksh
ksh:server5# rm -rf /
rm of / is not allowed
ksh:server5# bash
ksh:server5# rm -rf /
rm of / is not allowed

Вариация

server4# rm -rf --no-preserve-root /
rm: illegal option -- no-preserve-root
usage: rm [-fiRr] file ...

в лоб не работает. Нету такой опции в оригинальном rm у Solaris :).

Поставим на машину-жертву coreutils от GNU с Sunfreeware и повторим опыт:

server5# /usr/local/bin/rm -rf /
/usr/local/bin/rm: cannot remove root directory `/'

А вот то же самое с соответствующим ключом уже срабатывает:

Installation of was successful.
server4# /usr/local/bin/rm -rf --no-preserve-root /
(кирдык системе)

Однако не стоит обольщаться - все еще остается возможность вынести другие важные части системы и проделать это совершенно безнаказанно и, если и не приговорить систему, то уж нарваться на переустановку всяко:

server5# rm -rf /usr

Без usr Солярис не переходит в многопользовательский режим, так что...

Посмотрим, что еще можно сделать в плане причинения наибольших разрушений от рута. ;)

Попробуем, например, поубивать системные процессы:

server5# ps -ef |more
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 04:29:09 ? 0:08 sched
root 1 0 0 04:29:10 ? 0:01 /sbin/init
root 2 0 0 04:29:10 ? 0:00 pageout
root 3 0 0 04:29:10 ? 0:04 fsflush

server5# kill -9 3
server5# kill -9 2
server5# kill -9 1
kill: permission denied
server5# kill -9 0

server5 console login: root
Password:
Last login: Fri Dec 5 05:08:47 on console
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
Welcome to SA100-S10_B on server5
server5# ps -ef|more
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 04:29:09 ? 0:08 sched
root 1 0 0 04:29:10 ? 0:01 /sbin/init
root 2 0 0 04:29:10 ? 0:00 pageout
root 3 0 0 04:29:10 ? 0:04 fsflush

Ух ты, не получается!

Посылка сигнала KILL процессу 0 (планировщику) всего лишь выкидывает нас на login - но и только. Init убить напрямую нельзя. Процессу 2 и 3, похоже, все равно - их даже не поцарапало. :)

Солярис больше не исходит из допущения, что root оборудован головным мозгом и в некоторых - наиболее неприятных точках - защищен от анацефала ;). Однако не на уровне ядра, так что надежда все еще жива :).

PS. Замаскированный патч Бармина:

perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'

тоже больше не причиняет вреда Солярису. Он просто не выполняется по очевидным причинам, рассмотренным выше. :) Если только кто-нибудь не перепишет его на вызов coreutils. ;)

PPS. Все вышеперечисленное тестировалось вживую на Solaris 10 10/08 SPARC.
_______________________
Автор снимает с себя любую ответственность за тестирование всего вышеперечисленного на продуктивных системах администраторами, не оборудованными головным мозгом, в случае каких-либо деструктивных последствий. ;)

среда, 3 декабря 2008 г.

Миграция UFS -> ZFS на Solaris 10 10/08 x86 - Часть 2

В новом номере нашего журнала мы приступаем к описанию процедуры посадки самолета. ;)

После активации и загрузки системы с диска с ZFS останется одна небольшая проблемка:

# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
----------------- -------- ------ --------- ------ ----------
ufsBE yes no no no -
zfsBE yes yes yes no -

Оригинальный BE все еще нельзя удалять. Почему же?

Потому что в результате миграции на ZFS переброшены все слайсы UFS, кроме /export. Который на нашем сервере был смонтирован следующим образом (кусок содержимого /etc/vfstab):

/dev/dsk/c0d1s7 /dev/rdsk/c0d1s7 /export/home ufs 2 yes -

Нам нужно, таким образом, перенести содержимое точки монтирования /export на ZFS (на второй диск) и оторвать первый диск от zfsBE.

Как мы это сделаем?

Наиболее очевидным и напрашивающимся способом:

# mkdir /backup
# cd /export/home
# find . -print|cpio -pudm /backup
# cd /; umount /export/home
# cd /backup; mkdir -p /export/home; \
find . -print|cpio -pudm /export/home


Закомментируем ссылку на /export/home в файле /etc/vfstab. Содержимое /etc/vfstab:

#live-upgrade: updated boot environment
#device device mount FS fsck mount mount
#to mount to fsck point type pass at boot options
#
fd - /dev/fd fd - no -
/proc - /proc proc - no -
#live-upgrade::# /dev/dsk/c0d1s1 - - swap - no -
/dev/zvol/dsk/rpool/swap - - swap - no -
#live-upgrade::# /dev/dsk/c0d1s0 /dev/rdsk/c0d1s0 / ufs 1 no -
#live-upgrade::# /dev/dsk/c0d1s3 /dev/rdsk/c0d1s3 /usr ufs 1 no -
#live-upgrade::# /dev/dsk/c0d1s5 /dev/rdsk/c0d1s5 /var ufs 1 no -
#/dev/dsk/c0d1s7 /dev/rdsk/c0d1s7 /export/home ufs 2 yes -
#live-upgrade::# /dev/dsk/c0d1s4 /dev/rdsk/c0d1s4 /opt ufs 2 yes -
/devices - /devices devfs - no -
ctfs - /system/contract ctfs - no -
objfs - /system/object objfs - no -
swap - /tmp tmpfs - yes -
sharefs - /etc/dfs/sharetab sharefs - no -

Однако после перезапуска мы все еще не можем удалить первый диск:

# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
----------------- -------- ------ --------- ------ ----------
ufsBE yes no no no -
zfsBE yes yes yes no -
Поиск в документации не дал способа удалить точку монтирования /export/home из zfsBE. Попробуем силовым способом и повторно активируем zfsBE:

# luactivate zfsBE

Не забыв снова поправить /rpool/boot/grub/menu.lst (активация его снова исковеркала до первоначального состояния), перезапускаемся и смотрим статус:

# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
----------------- -------- ------ --------- ------ ----------
ufsBE yes no no yes -
zfsBE yes yes yes no -
Отлично, ufsBE освободилась, можно удалять ufsBE, отключать диск, реконфигурировать систему и очищать директории /dev и /devices от ссылок на первый диск.

Поздравляю, ваш самолет только что произвел посадку. ;)

PS. Немного неприятно, конечно, изобилие багов в такой, в общем-то, небезобидной процедуре. С другой стороны, понятно, что редко используемый функционал и будет содержать ошибки, поскольку их просто некому найти. :)

вторник, 2 декабря 2008 г.

Миграция UFS -> ZFS на Solaris 10 10/08 x86 - Часть 1

Миграция обычных UFS систем на ZFS - задача достаточно простая и обычно не вызывает серьезных проблем.

Новый релиз Solaris 10, однако, помимо изменений в процедуре загрузки для обеих архитектур (SPARC и x86) и возможности установки на ZFS всей системы (на загрузочный root-pool) позволяет также выполнить миграцию системы с UFS на ZFS.

Простой утилиты конвертации на данный момент не существует, все же файловые системы отличаются достаточно сильно и, несмотря на усилия команды разработчиков OpenSolaris, единственной доступной процедурой остается использование одной достаточно экзотической функциональности Solaris - Live Upgrade.

Однако реальность несколько отличается от идеализированной процедуры, описанной в руководствах.

На бумаге все легко и просто - буквально в три простые команды выполняется вся операция, просто и изящно, и единственное, о чем надо беспокоиться - это о втором диске.

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

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

Дано: Есть инфраструктурный сервер, работавший в качестве прокси, под управлением Solaris 10 08/07, с архитектурой x86:

1 CPU Intel Celeron 2.26 ГГц
2 Гб DDR RAM
1 жесткий диск ATA 80 Гб, разбитый на 5 слайсов
1 DVD-ROM
2 NIC Intel Pro 100B

Задача: Выполнить обновление до релиза 10/08, и, следующим шагом, мигрировать UFS на ZFS с загрузкой с ZFS-пула.

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

После установки и наката небольшого количества патчей, приступаем, собственно, ко второй части - к переходу на ZFS.

Как и сказано в руководстве, устанавливаем второй диск - для облегчения задачи берем в точности такой же ATA 80 Гб, с одинаковой геометрией и однотипным контроллером, и подключаем его к серверу. Реконфигурируемся. Создаем таблицу разделов FDISK на весь объем диска (как у оригинального загрузочного диска 1) типа SOLARIS1 и делаем ее активной.

Затем, используя утилиту format, создаем корневой слайс s0 (согласно оставшимся цилиндрам, начиная с 3го и до конца диска).

Следующим шагом создаем на нем пул ZFS:

# zpool create -f rpool c1d1s0

Опция -f может весьма потребоваться, если создается пул на диске, на котором уже был когда-то создан ZFS-пул.

Затем, согласно все тому же руководству, создаем оригинальный Boot Environment на текущем диске (назовем его ufsBE) и, далее, в точности по руководству, на его основе - zfsBE на пуле ZFS:

# lucreate -c ufsBE -n zfsBE -p rpool
Analyzing system configuration.
No name for current boot environment.
Current boot environment is named .
Creating initial configuration for primary boot environment .
The device
is not a root device for any boot environment;
cannot get BE ID.
PBE configuration successful: PBE name PBE Boot Device .
Comparing source boot environment file systems with the file
system(s) you specified for the new boot environment.
Determining which file systems should be in the
new boot environment.
Updating boot environment description database on all BEs.
Updating system configuration files.
The device
is not a root device for any boot environment;
cannot get BE ID.
Creating configuration for boot environment .
Source boot environment is .
Creating boot environment .
Creating file systems on boot environment .
Creating file system for in zone on .
Populating file systems on boot environment .
Checking selection integrity.
Integrity check OK.
Populating contents of mount point
.
Copying.
Creating shared file system mount points.
Creating compare databases for boot environment .
Creating compare database for file system
.
Creating compare database for file system
.
Updating compare databases on boot environment .
Making boot environment bootable.
Creating boot_archive for /.alt.tmp.b-zv.mnt
updating /.alt.tmp.b-zv.mnt/platform/i86pc/boot_archive
Population of boot environment successful.
Creation of boot environment successful.

Замечание: Может потребоваться переименование root pool (на самом деле пофигу, как он будет называться, хоть горшком ;)), если вы выполняете восстановление системы (скажем, с голого металла восстановились из flar-архива, который в текущей версии выполняет восстановление только на UFS, и вы хотите вернуть все взад - сиречь на ZFS).

Операция занимает некоторое время, порядка 15-25 минут приходится подождть завершения копирования и сравнения. Все это время оригинальная система продолжает активно работать.

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

Итак, что нужно сделать после подготовки нового BE и ДО активации и перезапуска с нового BE:

1. В обязательном порядке установить загрузчик на второй диск:

# installgrub /boot/grub/stage1 /boot/grub/stage2 \
/dev/rdsk/c1d1s0
Потому что его там еще нет и, при попытке активации и загрузки прямо сейчас, будет ошибка Bad PBR sig. Почти каноническая.

2. Обязательно проверить точки монтирования созданной среды загрузки ZFS (как описано здесь):

# zfs list -r -o name,mountpoint rpool/ROOT/zfsBE

NAME MOUNTPOINT
rpool/ROOT/zfsBE /.alt.tmp.b-VP.mnt/

и, если таковые будут (а они будут из-за ошибок в Live Upgrade в текущем релизе - 10/08), исправить их:
# zfs inherit -r mountpoint rpool/ROOT/zfsBE
# zfs set mountpoint=/ rpool/ROOT/zfsBE


3. Последнее наведение штрихов (без него, однако, загрузка с нового диска будет невозможна) перед перезагрузкой:

Активизируем zfsBE командой

# luactivate zfsBE

однако НЕ ПЕРЕЗАГРУЖАЕМСЯ НЕМЕДЛЕННО, как требует руководство!

Необходимо исправить menu.lst загрузчика GRUB на корневом пуле ZFS. Вопреки заявлению Live Upgrade, меню не изменено необходимым образом для загрузки с ZFS.

Итак, редактируем его (необходимые изменения выделены красным):

# cd /rpool/boot/grub
# vi menu.lst
....
#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris 10 10/08 s10x_u6wos_07b X86
findroot (BE_zfsBE,0,a)
bootfs rpool/ROOT/zfsBE
kernel$ /platform/i86pc/multiboot -B $ZFS-BOOTFS
module /platform/i86pc/boot_archive
#---------------------END BOOTADM--------------------
#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris failsafe
findroot (BE_zfsBE,0,a)
kernel /boot/multiboot kernel/unix -s
module /boot/x86.miniroot-safe
#---------------------END BOOTADM--------------------
....
Осталась мелочь. Процедура активации не только не изменила меню загрузчика, но и не перенесла файл /boot/grub/splash.xpm.gz на корневой пул ZFS, без него не будет видно меню загрузчика (совсем) и система будет сразу грузиться в опасный режим без возможности стартовать в безопасном ;). Можно, конечно, и забить на это, просто закомментировав строку #splashimage /boot/grub/splash.xpm.gz в menu.lst - тогда меню будет текстовым (что, собственно, нас устраивает как нельзя лучше - автор так и сделал), а можно стащить файл с пока еще живой UFS и положить его рядом с menu.lst в root pool:

# cp /boot/grub/splash.xpm.gz /rpool/boot/grub
Вот теперь действительно все. Можно перезагружаться и стартовать со второго диска:

# init 6

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

Решение данной задачи будет рассмотрено во второй части статьи.

PS. "Дорогие читатели, мы закончили описание процедуры взлета на самолете в нашем журнале "Пилотирование для чайников". Желаем приятного полета! Подробное описание процедуры посадки - в следующем номере. До новых встреч, дорогие друзья!" ;)
______________________
* Оставим пока на совести разработчиков тот факт, что с новым релизом есть серьезные проблемы в выполнении обновления hands-off методом JumpStart для архитектуры x86/x64. Без проблем удалось провести только начальную установку посредством JS.