Павел Закляков, Глеб Рыжаков
Fedora 8 -> Fedora 10: не пора ли обновиться?
Если вы ещё используете Linux Fedora 8, то эта статья для вас. Инструкция по обновлению, описание наиболее типичных проблем и советы по тонкой настройке системы после обновления.
Время пришло
Что ни говори, а весь прошедший год Linux Fedora 8 был наиболее удачным и стабильным дистрибутивом в своей серии. Выход девятой версии не вдохновил большинство администраторов и многие отказались от обновления систем. Даже десятая версия, вышедшая в декабре, была с ошибками, требующими исправления. Взять хотя бы проблему переключения раскладок при входе в систему. После установки, при первом входе в систему, предлагается по умолчанию русский язык, из которого переключиться на латинский и ввести свой логин, как и пароль, проблематично. Были и другие, не менее существенные ошибки.
Но вот с момента выпуска Fedora 10 прошло уже несколько месяцев, и можно сказать, что дистрибутив «дозрел». Многие ошибки исправлены, сторонние программы научились узнавать десятую версию. Сейчас самое время переходить на новую систему. Стоит это сделать хотя бы потому, что официальная поддержка 8-й версии уже не производится. Если вы используете Fedora 9, то вы также можете перейти на новую версию, несмотря на то, что обновления для неё ещё выходят.
Как лучше обновиться?
Существует много способов, от ручной замены пакетов до форматирования дисков и установки новой версии. Одним из наиболее удобных считаем использование утилиты PreUpgrade [1].
Удобство утилиты состоит в том, что она сама скачивает из Интернета нужные файлы, далее перезагружает компьютер и, используя anaconda, всё ставит без лишних вопросов. При этом дополнительно не нужно ничего делать, например создавать загрузочные диски. Программе даже CD/DVD-привод не нужен, что может оказаться актуальным для различных нетбуков. Несомненно, в работе этой программы есть и минусы, о которых будет написано дальше.
Если есть возможность – сделайте backup. На нашей практике в более чем десяти различных конфигурациях обновление прошло успешно, мелкие проблемы решались в рабочем порядке, и о них мы расскажем, но, как говорится, бережёного Бог бережёт.
Предполагая, что директория /home находится на разделе диска, отличном от системного, сохраним настройки из /etc, как и советует команда Fedorа [2]:
# tar czf /tmp/etc-`date +%F`.tar.gz /etc && mv /tmp/etc-*.tar.gz /home
Если вы используете базы данных PostgreSQL, то их следует сохранить отдельно, сделав SQL-образ [10, 11 стр. 293]. Как правило, нет обратной совместимости между новой версией драйвера и старым форматом баз при скачкообразном изменении версии. Поэтому другие способы сохранения и восстановления не подходят. Формат файлов рабочей директории базы может отличаться в новой версии, а использование утилиты, создающей копию базы «на лету», бессмысленно, так как СУБД всё равно будет остановлена при перезагрузке компьютера. Делаем SQL-образ следующей командой:
# su -l postgres -c pg_dumpall > psql-dump.sql
Для восстановления (после всех обновлений) останавливаем сервис, удаляем директорию, в которой содержатся файлы баз данных старого формата и инициализируем базу данных нового формата:
# /etc/rc.d/init.d/postgresql stop
# mv -f /var/lib/pgsql /var/lib/pgsql.old
# /etc/rc.d/init.d/postgresql initdb
Запускаем службу:
# /etc/rc.d/init.d/postgresql start
и восстанавливаем информацию:
# su -l postgres -c "psql -f /home/psql-dump.sql"
Аналогично сохраним и базы MySQL [11, 12 стр. 661], не останавливая демона:
# mysqldump --all-databases > /home/mysql-dump.sql
Для восстановления из архива после полного обновления системы следует запустить демон mysqld:
# /etc/rc.d/init.d/mysqld restart
и восстановить информацию.
# mysql < /home/mysql-dump.sql
Установка PreUpgrade
Процесс установки утилиты довольно прост. Все операции по обновлению следует проводить из-под root либо используя соответственно настроенную утилиту sudo.
В командной строке наберём:
# yum install preupgrade
далее происходит поиск пакета по репозитариям, проверка зависимостей и установка:
--> Running transaction check
---> Package preupgrade.noarch 0:1.0.1-1.fc8 set to be updated
--> Processing Dependency: createrepo for package: preupgrade
--> Processing Dependency: anaconda-yum-plugins for package: preupgrade
--> Running transaction check
---> Package createrepo.noarch 0:0.4.11-2.fc8 set to be updated
---> Package anaconda-yum-plugins.noarch 0:1.0-1.fc8 set to be updated
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================
Package Арх. Версия Repository Size
==========================================================================
Installing:
preupgrade noarch 1.0.1-1.fc8 updates-newkey 88 k
Installing for dependencies:
anaconda-yum-plugins noarch 1.0-1.fc8 updates-newkey 11 k
createrepo noarch 0.4.11-2.fc8 updates-newkey 58 k
Transaction Summary
==========================================================================
Install 3 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 156 k
Выполнить [y/N]: y
|
Отвечаем «y» – и пакет установлен:
Downloading Packages:
....
Installed:
preupgrade.noarch 0:1.0.1-1.fc8
Dependency Installed:
anaconda-yum-plugins.noarch 0:1.0-1.fc8 createrepo.noarch 0:0.4.11-2.fc8
Complete!
|
Увы, в меню значка запуска программы нет, поэтому запускаем её из консоли при запущенной графической оболочке:
# /usr/bin/preupgrade
На экране появляется окно с коротким описанием дальнейших событий (см. рис. 1), необходимо нажать «Далее».
Рисунок 1. Начало процесса обновления системы
Затем появится окно, где можно выбрать релиз, до которого вы хотите обновиться.
На момент написания статьи для выбора был доступен только один вариант Fedora 10 (Cambridge) (см. рис. 2). Вполне возможно, что к моменту прочтения вами статьи будет доступна для выбора и Fedora 11 (Leonidas). Обновление до alpha-версии 11-й Fedora доступно уже сейчас, если установить флажок Display unstable test releases.
Рисунок 2. Выбор операционной системы для обновления
Далее запускается процесс загрузки пакетов, необходимых для осуществления обновления (см. рис. 3).
Рисунок 3. Загрузка пакетов, необходимых для обновления системы
К сожалению, загружаются не самые последние пакеты, как подсказывает логика. По завершении обновления систему ещё раз придётся обновить. Что интересно, после установки пришлось повторно скачать более новые версии из сети и обновить порядка 600 пакетов из около 2000 установленных.
После того как все пакеты и необходимые для обновления файлы будут скачаны, система предложит перезагрузиться (см. рис. 4).
Рисунок 4. Завершение первого этапа обновления, запрос перезагрузки
После перезагрузки запустится процесс установки, схожий с тем, что происходит при установке с компакт-диска, за тем лишь различием, что пользователю система не задаёт никаких вопросов. На экране пробегают индикаторы, отображающие состояние процесса обновления и сменяются имена пакетов (см. рис. 5).
Рисунок 5. Обновление системы, этап «после перезагрузки»
Однако не всё пройдёт гладко, если на разделе жёсткого диска, на котором находится директория /boot, свободного места меньше, чем 120 Мб. Дело в том, что образ установщика, который загружается вместе с новыми пакетами, имеет как раз такой размер, и копируется он в директорию /boot. Если же места на диске недостаточно, то непоместившийся образ будет загружаться после перезагрузки компьютера и начала установки из сети в режиме on-line. В этом нет ничего страшного, если у вас быстрый Интернет, локальная сеть c поднятым DHCP-сервером и сетевая карта, опознаваемая установщиком. Небольшой нюанс: если настройки интерфейса сетевой карты не могут быть получены автоматически, то иного способа, как, например, ввести их вручную, не предусмотрено. В этом случае придётся либо расширять объём соответствующего раздела диска, либо монтировать /boot на другой раздел.
Далее система перезагружается и – «добро пожаловать в Fedora 10».
Первое, что бросается в глаза, – торможение системы, после grub во время загрузки, на этапе бегущих снизу белой, голубой и синей полосок. (В нашем случае пакет rhgb не установлен.) Если нажать в это время клавишу <Esc>, то вы сможете увидеть привычные записи на экране.
Первое, что удивило, зачем система ждёт 10 секунд? – надпись: Could not detect stabilization. Waiting 10 seconds (см. рис. 6).
Рисунок 6. Проблема: Could not detect stabilization. Waiting 10 seconds
Ответ на этот вопрос найден не был, зато на сайте Fedora было предложено решение проблемы [9] – обновить пакет mkinitrd и создать заново initrd-образ. Описание механизма загрузки с использованием RAM-дисков можно найти в документации ядра /usr/src/linux/Documentation/initrd.txt. Использование данного механизма необходимо в случаях, когда «ключ от сейфа находится в сейфе», например вы осуществляете загрузку с SCSI- или RAID-контроллера, поддержка которого не включена в ядро, а модули, способные работать с данным контроллером, находятся на диске, который к нему подключён.
Для этого в ядре включается поддержка RAM-дисков и возможность работы с ними в процессе загрузки. После создаётся образ, куда записываются модули для работы с железом, поддержки используемых файловых систем и bash-файл с командами, их загружающими. (Именно в этом файле, скорее всего, и была прописана лишняя задержка на 10 секунд с целью, чтобы все контроллеры успели инициализироваться. Так как такого оборудования на пользовательских компьютерах чаще всего нет – задержка оказалась излишней.)
Далее образ загрузчиком, например GRUB, передаётся ядру. Ядро запускает bash-файл, подгружает модули и после уже способно работать с файлами на жёстком диске и продолжать загрузку.
Проверить, так это или нет, читатели могут, заглянув внутрь скрипта в initrd-образе, дающего задержку.
Сохраним старый образ и создадим новый:
# mv /boot/initrd-$(uname -r).img /boot/initrd-$(uname -r).img.old
# mkinitrd /boot/initrd-$(uname -r).img $(uname -r)
Далее загрузка системы продолжилась и нас ожидал ещё один сюрприз. Новый графический вход в систему, где по умолчанию был установлен только русский язык и русская раскладка клавиатуры (см. рис. 7). Причём выбрать английский язык оказалось затруднительным. Даже после того как он был добавлен (такая возможность имеется), происходило постоянное переключение на русскую раскладку, при этом индикатор продолжал указывать на английский язык.
Рисунок 7. Новый графический вход в систему, где нет английской раскладки
Особенно это неудобно при вводе пароля, так как на экране печатаются звёздочки и приходится верить системе, что у тебя правильная раскладка. Как-то в голову не приходит, что она может отличаться от той, которую показывает индикатор.
Проблему решить можно несколькими способами – использовать цифровые пароли, которые можно предусмотрительно поменять перед началом обновления. Можно переключиться на текстовую консоль нажатием <Ctrl + Alt + F*>, там сразу используется латинская раскладка. Можно после ввода логина осуществить двойное переключение с английского на русский и обратно. До нажатия клавиши «ввод» язык ввода не будет меняться.
Подобные сюрпризы в дистрибутивах Fedora Linux давно не редкость, например известно, что Fedora 9 слетает при установке, если выбрать русский язык. Поэтому ещё один способ обойти проблему – выбрать во время установки английский язык. Жаль, что во время обновления такой выбор вам не предоставляется. Единственное, что можно сказать в утешение, – потерпите немного, после обновления системы данная проблема исчезнет.
Поэтому следующий наш этап – ещё раз обновить систему, как бы глупо это ни звучало, но на этот раз уже с помощью yum.
Для начала очистим временные каталоги yum:
# yum clean all
Затем найдём пакеты, для которых не оказалось обновлений в текущей версии Fedorа:
# package-cleanup --orphans
Скорее всего, пакеты без обновлений вам не нужны и их можно удалить, так как в новой версии их функцию выполняют другие. Учтите, эта команда выдаст и те пакеты, которые были поставлены вручную. Если же таковых в списке не оказалось, удаляем весь список целиком:
# package-cleanup —orphans | xargs rpm -e
Эту операцию крайне желательно произвести, чтобы избежать дальнейших конфликтов при обновлении.
Команда package-cleanup входит в пакет yum-utils, который необходимо установить в случае необходимости.
Теперь запустим собственно обновление:
# yum update
С некоторой вероятностью вам это сделать не удастся, так как из-за любого сбоя происходит отмена транзакции по обновлению всех пакетов. Не самое удачное поведение, но в этом случае вам придётся делать обновления пакетов вручную:
# yum update имя_пакета
Список установленных пакетов, для которых доступны обновления, можно получить командой:
# yum check-update
Другие проблемы и решения
Если считать процесс замены старых версий пакетов на новые на данном этапе завершённым, то для комфортной работы придётся ещё потрудиться. Кто-то быстро оценивает новые функции и возможности, легко адаптируется. Таким людям больше ничего не надо (можно и статью дальше не читать), но другая часть администраторов и пользователей обладают высокой ригидностью, коих большинство. Вспомните себя, когда привычная программа, используемая годами, после обновления перестаёт работать. Такая ситуация может вызвать немало недовольства. Ниже будут рассмотрены случаи, с которыми пришлось столкнуться авторам.
Для тех, кто не использует SELinux
На одном из компьютеров после обновления перестал работать звук. Выяснилось, что на загрузку драйвера повлияла система безопасности SELinux. Несмотря на то что до обновления в файле /etc/selinux/config система была отключена (SELINUX=disabled), после обновления данный параметр сбился.
Для тех, кто использует Midnigt Commander
После обновления при просмотре файлов по нажатию клавиши <F3> вместо букв стали отображаться точки. Пришлось вернуть кодировку ввода/вывода в прежнее значение (в нашем случае – UTF-8.) через меню «Настройки > Биты символов...». Данная проблема решается автоматически в случае, если пакет mc ставится из репозитария russianfedora, см. ниже.
Для тех, кто использует LaTeX
Если вы используете LaTeX для создания документов совместно с редакторами под KDE, такими, как kile или kwrite, вас ждёт неприятный сюрприз. Дело в том, что старый KDE-просмотрщик kdvi обладал одной приятной особенностью: если документ LaTeX был откомпилирован с опцией -src-special, то kdvi при просмотре результирующего .dvi-файла позволял при клике мыши на каком-либо участке документа перейти на соответствующую строчку в исходном документе .tex. Но в Fedora 10 kdvi не входит в стандартную поставку, ему на смену пришёл мощный расширяемый пакет okular, поддерживающий кучу форматов и имеющий многие дополнительные инструменты, но не поддерживающий данную полезную функцию. Причём в настройках okular есть параметр editor, что позволяет надеяться, что эта функция будет реализована в дальнейшем, однако в документации к okular ничего про этот пункт настроек не сказано, будто его и нет вовсе. Просмотр исходных файлов okular показал, что для данного случая должна срабатывать комбинация <Shift + Left Click> (c предложением в комментариях придумать что-то более подходящее), но с .dvi это не работает.
Кстати, аналог okular под GNOME – универсальный просмотрщик evince, который среди прочего поддерживает теперь форматы dvi, djvu, pdf, – также не понимает опцию -src-special. А вот самый древний и примитивный xdvi имеет такую поддержку, что ещё раз подтверждает истину «лучшее враг хорошего». Надо лишь запустить xdvi с опцией -editor, указав в качестве параметра любимый редактор, а затем кликнуть мышкой по документу, удерживая <Сtrl>.
«Лишние» rpm-пакеты
Немало проблем вызывают лишние rpm-пакеты. Например, были единичные случаи, когда один и тот же пакет оказался установлен как от 8-й версии, так и от 10-й. При этом если надо сделать обновление через yum update, то последний пытается обновить оба пакета, проверяет зависимости, в результате чего получается ошибка, что файл xxx конфликтует с файлом xxx, хотя это один и тот же файл. Не очень ясно, почему во время обновления не всегда происходит удаление лишнего пакета от 8-й версии. Как вариант можем предположить, что на архитектуре x86_64 может быть ещё установлена и версия i386, отчего и происходит «непонимание». Среди «лишних» пакетов в системе, которые можно безболезненно удалить, укажем пакеты rpm с библиотеками, не используемые другими приложениями, а также пакеты с заголовочными файлами к ним. Список таких пакетов, от которых не зависят другие приложения, можно получить командой:
# package-cleanup --leaves
Если вы не занимаетесь компиляцией программ, использующих библиотеки из этого списка, то пакеты можно смело удалять:
# package-cleanup --leaves | xargs rpm -e
В случае если у вас 64-битная архитектура системы, то пакеты для i386-архитектуры вам могут не понадобиться вовсе, так как большинство 32-битных пакетов имеют 64-битные аналоги. Но есть и исключения, например, семейство пакетов wine, которые зависят от некоторых 32-битных библиотек. Так как эта программа довольно часто используется, авторы предлагают следующий скрипт на языке Python, помогающий администраторам понять, какие именно 32-битные библиотеки необходимы для корректной работы wine.
#!/usr/bin/python
import sys, rpm
ts = rpm.TransactionSet()
def findwhatprovides(requirement):
prov = []
r = requirement
mi = ts.dbMatch('provides', r)
if mi.count() == 0:
mi = ts.dbMatch('basenames', r)
if mi.count() > 0:
for p in mi:
prov.append("%s" % (p['name']))
else:
sys.stderr.write("Unprovided requirement: %s" % r)
return []
return prov
def finddepsOneIter(p):
deps = set()
mi = ts.dbMatch('name', p)
if mi.count() == 0:
sys.stderr.write("package %s not found.\n" % p)
return []
h = mi.next()
for requirement in h.dsFromHeader('requirename'):
requirement = requirement[0].split(' ')[1]
if requirement.find("rpmlib") == 0: continue
deps|=set([findwhatprovides(requirement)[0]])
return deps
def finddeps(p):
depall=set()
depdop=set([p])
while(len(depdop)>0):
depnew=set()
for eldep in depdop:
depnew|=finddepsOneIter(eldep)
depall=depall|depdop
depdop=depnew-depall
return sorted(depall)
for dep in finddeps('wine'):
print dep
Скрипт вызывается без параметров и выдаёт список 32-битных библиотек, от которых (непосредственно или через другие пакеты) зависит wine. Если кроме wine вы больше не используете 32-битные приложения, остальные 32-битные пакеты можно удалить. Если необходимо проверить ситуацию по другим программам, то вместо wine в данном скрипте можно указать любой другой пакет (или пакеты).
Новые пакеты
При обновлении системы не будут поставлены пакеты, являющиеся нововведением в текущей версии Fedorа. Например, пакет gnome-lirc-properties, графический интерфейс для конфигурирования LIRC, библиотеки инфракрасных устройств. Или лёгкий оконный менеджер LXDE. Очень советуем его поставить и ознакомиться с ним:
# yum groupinstall LXDE
Кроме того, отдельно можно установить плагины для Plymouth – нового графического загрузчика, компилятор и инструменты для работы с функциональным языком программирования Haskell. Подробнее об этих и других нововведениях можно прочитать тут [3].
Демоны
При обновлении могут возникнуть ошибки с выполнением скриптов %POSTUN, запускаемых после удаления соответствующего пакета. И не только могут, но и обязательно возникнут.
Один из эффектов – битые ссылки на запуск и остановку демонов в директориях /etc/rc.d/rc?.d. Для того чтобы от них избавиться, выполним:
# find /etc/rc.d -follow -type l -delete
Для дальнейшей настройки демонов просмотрим директорию /etc/rc.d/init.d на предемет файлов .rpmnew и .rpmsave:
# ls /etc/rc.d/init.d/*.rpmnew
# ls /etc/rc.d/init.d/*.rpmsave
Удалим лишние:
# rm -f /etc/rc.d/init.d/*.rpmsave
и переименуем новые:
# cd /etc/rc.d/init.d/ && for f in *.rpmnew; do mv -f $f `basename $f .rpmnew`; done
Настроим порядок запуска демонов при старте системы, используя chkconfig:
# cd /etc/rc.d/init.d; for f in *; do /sbin/chkconfig $f resetpriorities; done
Дополнительные полезные настройки
Желая уйти от проблем с лицензированием, многие пакеты из Fedora 10, как и из предыдущих версий, были убраны, но это не значит, что пакеты и проекты, их поддерживающие, перестали существовать и вы не можете использовать все полезные наработки мира Open Source. Эти пакеты успешно переместились в отдельные репозитарии, которые следует подключить после обновления системы.
Первый репозитарий, который просто необходимо подключить, это RPM Fusion [4], сменивший репозитарий livna:
# rpm -Uvh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm \
http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rp
В RPM Fusion находятся программы, которые не вошли в Fedorа Linux из-за лицензионных разногласий, например, проигрывать mplayer c кодеками, xmms с поддержкой формата mp3, проприетарные драйверы для видеокарт и т. п.
Ещё один хороший репозитарий – пакеты от дистрибутива Russian Fedora [5], совместимого с RPM Fusion, для подключения которого выполним:
# rpm -Uvh http://mirror.yandex.ru/fedora/russianfedora/russianfedora/free/fedora/updates/10/$ARCH/russianfedora-free-release-$VERSION.noarch.rpm /
http://mirror.yandex.ru/fedora/russianfedora/russianfedora/fixes/fedora/updates/10/$ARCH/russianfedora-fixes-release-$VERSION.noarch.rpm /
http://mirror.yandex.ru/fedora/russianfedora/russianfedora/nonfree/fedora/updates/10/$ARCH/russianfedora-nonfree-release-$VERSION.noarch.rp
где вместо $VERSION следует подставить текущую версию (на момент написания статьи – 10-2), а вместо $ARCH – архитектуру вашей операционной системы, например, i386 или x86_64.
В репозитарии Russian Fedora содержатся, кроме прочего, дополнительные шрифты и элементы русификации. Если у вас проблемы с настройкой русской кодировки или неверно отображаются русские символы в некоторых приложениях (а это может произойти по разным причинам), обязательно поставьте или обновите взамен «родных» соответствующие пакеты из этого репозитария.
В качестве дополнительных полезных утилит укажем пакет xneur [6, 7] – аналог PuntoSwicher. Этот пакет входит в репозитарий russianfedora, и в случае если последний подключён, xneur устанавливается с помощью yum:
# yum install xneur
Учитывая, что протокол ICQ всё ещё используют достаточно большое число пользователей, для общения с использованием протоколов Jabber, ICQ и др. можно посоветовать популярный клиент Pidgin. Он входит в стандартный репозитарий Fedorа, но, кроме того, имеет и свой собственный репозитарий (годный для старых версий Fedora, но в котором содержатся актуальные версии приложения). Pidgin – неплохая программа, но мы призываем по очевидным причинам [8] отказаться от использования протокола ICQ и рекомендуем использовать jabber-клиенты, например, клиент Gajim, имеющий богатый набор функций. Как вариант можно посоветовать параллельное использование jabber-клиента как основного и Pidgin как временного, до тех пор пока все ваши ICQ-контакты не перейдут на открытый протокол xmpp.
Недостатки обновления с помощью PreUpgrade
- PreUpgrade использует X-Window, поэтому не подойдёт для систем, где графическая оболочка просто отсутствует;
- обновления происходят не до самых последних версий пакетов.
- не ставятся новые пакеты, для которых отсутствовали аналогичные старые версии;
- не видны детали установки, что может служить причиной пропуска важных сообщений, выдаваемых при обновлении.
- Утилита PreUpgrade – http://fedoraproject.org/wiki/Features/PreUpgrade.
- Инструкция как обновляться – http://docs.fedoraproject.org/install-guide/f10/en_US/sn-upgrade-tree.html.
- Нововведения в Fedora 10 – http://docs.fedoraproject.org/release-notes/f10/en_US.
- Репозитарий, сменивший livna – http://rpmfusion.org.
- Проект Russian Fedora – http://www.russianfedora.ru.
- X Neural Switcher (Xneur) – http://www.xneur.ru.
- Закляков П. Xneur – автоматическое переключение раскладок под Linux (аналог Punto Switcher). //Системный администратор, №10, октябрь 2008 г. – С. 44-45.
- ICQ: пора валить? – http://bugtraq.ru/forum/full/2009/siteupdates/153736.html.
- Решение проблемы с сообщением «Could not detect stabilization. Waiting 10 seconds.» – https://admin.fedoraproject.org/updates/mkinitrd-6.0.71-3.fc10.
- Архивирование и восстановление БД PostgreSQL – http://www.postgresql.org/docs/8.3/interactive/backup.html.
- Уорсли Дж., Дрейк Дж. PotgreSQL. Для профессионалов – СПб.: Питер, 2003.
- Архивирование и восстановление БД MySQL – http://www.mysql.com/products/backup.
- Дюбуа Поль MySQL 2-е изд.: Пер с англ. – М.: Издательский дом «Вильямс», 2004.