Розділ 8. Секрети Дебіен
Завантаження системи
Детальна інформація про завантаження системи подається в http://www.tldp.org/HOWTO/BootPrompt-HOWTO.html.
"Я забув пароль суперкористувача!" (1)
Можна заватажити систему, та зареєструватись з привілеями суперкористувача не знаючи його паролю, якщо у вас є фізичний доступ до клавіатури комп'ютера (Передбачається, що БІОС комп'ютера та завантажувач на кшталт lilo не захищені паролем).
Ця процедура не вимагає завантажувальних дисків і не потребує зміни конфігурації БІОСа. Нижче Linux - мітка завантажувального ядра Лінукс у типовій системі Дебіен.
У завантажувальному екрані lilo, як тільки появився напис boot: (на деяких системах вам потрібно натиснути Shift, тому що повідомлення завантажувача можуть бути приховані; окрім того, якщо lilo використовує технологію фреймбуфер, вам потрібно натиснути Tab щоб бачити введені опції) введіть таке:
boot: Linux init=/bin/sh
В цьому випадку завантажиться ядро і запуститься програма /bin/sh замість init. Тепер ви отримали привілеї системного адміністратора і консоль, запущену від його імені. Але, оскільки коренева файлова система змонтована лише для читання, а інші файлові системи не змонтовані взагалі, то, можливо, вам знадобиться виконати наступні команди щоб отримати повноціннішу систему:
init-2.03# mount -n -o remount,rw /
init-2.03# mount -avt nonfs,noproc,nosmbfs
init-2.03# cd /etc
init-2.03# vi passwd
init-2.03# vi shadow
(Якщо друге поле даних у файлі /etc/passwd для всіх користувачів містить "Х", значить ваша система використовує тіньові паролі і вам потрібно редагувати файл /etc/shadow). Щоб відключити пароль суперкористувача, очистіть друге поле у файлі /etc/passwd. Тепер можна перевантажити систему та реєструватись суперкористувачем без пароля. Зауважте що починаючи з версії 2.2 при завантаженні на перший рівень запуску Дебіен, на відміну від деяких інших збірок, вимагає пароль.
Непогано було б мати якийсь простий текстовий редактор в каталозі /bin на той випадок, якщо /usr буде недоступним (див. ?параграф 11.2 "Рятівні редактори")
Також можна встановити пакунок sash. Якщо систему не вдається завантажити, виконайте
boot: Linux init=/bin/sash
sash забезпечує інтерактивну оболонку навіть якщо /bin/sh недоступний. Окрім того, він зібраний статично (тобто не вимагає додаткових бібліотек для роботи - прим. перекладача) і має у своєму складі багато інструментів у якості вбудованих команд (введіть help у його командному рядку щоб отримати повний їх список).
"Я забув пароль суперкористувача!" (2)
Завантажтесь з рятівного диску або живчика. Якщо кореневим розділом є /dev/hda3, то нижченаведені команди відредагують файл паролів так само просто як це описано:
# mkdir fixit
# mount /dev/hda3 fixit
# cd fixit/etc
# vi shadow
# vi passwd
Перевага цього підходу перед попереднім методом полягає в тому, що вам не потрібно знати пароль до lilo. Але при цьому вам потрібно мати доступ до налаштувань БІОС щоб завантажити систему з компакт-диску чи дискети.
Не вдається завантажити систему
Без проблем, якщо ви не забули створити завантажувальний диск в процесі встановлення. Якщо lilo пошкоджено, візьміть завантажувальний диск з встановлювального пакету Дебіен і завантажтесь з нього. У повідомленні завантажувача, якщо у вас, припустимо, кореневий розділ на /dev/hda12 і вам потрібен третій рівень запуску, введіть:
boot: rescue root=/dev/hda12 3
Після чого ви завантажитесь у майже повноцінну систему з ядром на дискеті чи компакт-диску (можуть, правда, виникнути незначні проблеми з відсутніми модулями ядра).
Якщо у вас пошкоджена система, гляньте також параграф 6.3.6 "Встановлення пакунків у незавантажувану систему".
Якщо вам потрібна особлива завантажувальна дискета, прочитайте readme.txt на рятівному диску.
"Я хочу відключити графіку при завантаженні!"
Користуватись нестабільною збіркою весело, але xdm, gdm, kdm, чи wdm з помилками можуть притупити вашу радість під час завантаження.
Перш за все дістаньтесь до оболонки системного адміністратора за допомогою команди завантажувача:
boot: Linux vga=normal s
Де Linux - мітка завантажуваного ядра; "vga=normal" примусить lilo вантажитись у режимі VGA (типовий графічний режим, підтримуваний будь-якими відеокартами і моніторами - прим. перекладача), а "s" (чи "S") - у однокористувацькому режимі. Введіть пароль адміністратора у запрошенні.
Є кілька шляхів відключити всі графічні демони під час завантаження:
- запустіть update-rc.d -f ?dm remove ; update-rc.d ?dm stop 99 1 2 3 4 5 6 .
- додайте "exit 0" на початку всіх файлів /etc/init.d/?dm.
- перейменуйте всі файли /etc/rc2.d/S99?dm у /etc/rc2.d/K99?dm.
- видаліть всі файли /etc/rc2.d/S99?dm
- запустіть :>/etc/X11/default-display-manager
Тут число в rc2.d повинно відповідати рівню запуску, заданому у /etc/inittab. ?dm підрозуміває, що вам потрібно ввести команди багато разів, замінюючи "?dm" на xdm, gdm, kdm, та wdm.
"Єидно правильним шляхом" в Дебіен є лише перша з наведених команд. Остання доволі проста, але працює лише в Дебіен і вимагає пізнішого налаштування графічного менеджера за допомогою dpkg-reconfigure. Інші - це загальні методи відключення демонів.
І ви далі можете запустити Х-сервер за допомогою команди startx.
Інші фокуси з завантажувачем
За допомогою завантажувача систему можна завантажити (як не дивно ;о) - прим.перекладача) з заданою конфігурацією у визначений рівень виконання. Деталі описуються в LDP BootPrompt-HOWTO.
Якщо ви хочете завантажити систему у четвертий рівень виконання, введіть наступну команду:
boot: Linux 4
Якщо ви хочете завантажити систему у нормально функціонуючий однокористувацький режим і знаєте пароль суперкористувача, спрацює будь-який з ничженаведених прикладів.
boot: Linux S
boot: Linux 1
boot: Linux -s
Якщо вам потрібно завантажити систему з меншою кількістю доступної пам'яті, аніж у неї є насправді (скажімо, з 48 МБ замість 64), введіть наступну команду у повідомленні завантажувача:
boot: Linux mem=48M
Переконайтесь, що ви не задали більшу кількість пам'яті, аніж у вас є насправді, бо в такому випадку ядро зазнає краху. Якщо у вас більше, аніж 64МБ оперативної пам'яті (наприклад, 128МБ) і стара материнська плата чи ядро, то допоки ви не введете у рядку завантажувача mem=128M або не допишете цей рядок до /etc/lilo.conf, ваша система не зможе використовувати більше, аніж 64 МБ.
Налаштування заватажувача GRUB
GRUB - завантажувач від проекту GNU Hurd, значно гнучкіший, аніж lilo, але з абсолютно іншою обробкою параметрів.
grub> find /vmlinuz
grub> root (hd0,0)
grub> kernel /vmlinuz root=/dev/hda1
grub> initrd /initrd
grub> boot
Тут вам потрібно ознайомитись з назвами пристроїв у Hurd:
the Hurd/GRUB Linux MSDOS/Windows
(fd0) /dev/fd0 A:
(hd0,0) /dev/hda1 C: (як правило)
(hd0,3) /dev/hda4 F: (як правило)
(hd1,3) /dev/hdb4 ?
Деталі гляньте у /usr/share/doc/grub/README.Debian та /usr/share/doc/grub-doc/html/.
Нотування діяльності
Нотування діяльності в оболонці
У середовищі Юнікс системні адміністратори виконують значно важливіші завдання, аніж на звичайному персональному комп'ютері. Переконайтесь, що ви маєте основні поняття щодо конфігурування системи якщо вам потрібно вирішити якусь проблему. Графічні конфігураційні інструменти виглядають гарно і зручно, але у критичних ситуаціях часто бувають недоступними.
В цьому контексті нотування діяльності в оболонці є хорошою практикою, особливо якщо ви зареєстровані як суперкористувач.
Емакс: Розпочніть запис у буфер за допомогою М-х та за допомогою C-x C-w запишіть його (буфер) у файл.
Оболонка: Користуйтесь командою screen з "^A H" як це описано у параграфі 8.6.28 "Перемикання між консолями за допомогою screen" або ж командою script.
$ script
Script started, file is typescript
... зробіть щось ...
Ctrl-D
$ col -bx <typescript >savefile
$ vi savefile
Замість команди script можна скористатись такою конструкцією:
$ bash -i 2>&1 | tee typescript
Нотування діяльності в X
Якщо вам потрібно записати графічний образ Х-програми, включаючи команду xterm, користуйтесь програмою gimp (у графічному режимі). Вона може захоплювати будь-яке вікно або ж цілий екран. Окрім того, можна використати програми xwd (xbase-clients), import (imagemagick), та scrot (scrot).
Копіювання та архівування цілих підкаталогів
Ці команди складають основи резервування даних та системи. Приклад простого сценарію для резервування можна знайти серед інших прикладів.
Основні команди копіювання цілих підкаталогів
Якщо вам потрібно скопіювати файлову структуру разом з вмістом лінків, можете скористатись:
стандартним методом
# cp -a /каталог/джерело /каталог/призначення # вимагає GNU cp
# (cd /каталог/джерело && tar cf - . ) | \
(cd /каталог/призначення && tar xvfp - )
При наявності жорстких лінків потрібен педантичний метод
# cd /шлях/до/старого/каталога
# find . -depth -print0 | afio -p -xv -0a /точка/монтування/нового/каталога
Для мережі:
# (cd /каталог/джерело && tar cf - . ) | \
ssh user@host.dom (cd /каталог/призначення && tar xvfp - )
Якщо немає зв'язаних файлів:
# scp -pr user1@host1.dom:/каталог/джерело \
user2@host2.dom:/каталог/призначення
Тут, scp <==> rcp і ssh <==> rsh.
Ця інформація публікувалась Манойєм Шрівастава (Manoj Srivastava, srivasta@debian.org) в розсилці debian-user@lists.debian.org.
cp
Традиційно cp не була кандидатом на виконання завдань такого плану, оскільки вона не робить різниці між символьними чи жорсткими лінками. Окрім того вона не могла обробляти файли з пробілами..
Проте в GNU cp вже немає цих обмежень; проте, в несумісних з GNU системах, cp все ще може мати такі проблеми, тому цей метод в них не спрацює.
% cp -a . новий_каталог
tar
Команда tar обходить деякі з проблем, котрі виникають у ср з символьними лінками. Проте, на відміну від cpio, традиційно tar не підтримує спеціальних файлів.
При обробці кількох жорстких лінків одного файлу tar робить лише одну копію, але при цьому ви можете доступитись до такого файлу лише за однією назвою - цієї копії; cpio натомість робить стільки копій, скільки у вас є жорстких лінків, але зате ви можете доступитись до файлу за будь-якою з його назв.
Між версіями 2.2 (Potato) i 3.0 (Woody) tar змінив опції доступу до .bz2-файлів, отож використовуйте в сценаріях --bzip2 замість -I (Potato) чи -j (Woody).
pax
Новий, зроблений за стандартами POSIX (IEEE Std 1003.2-1992, сторінки 380–388 (параграф 4.48) та сторінки 936–940 (параграф E.4.48)), універсальний Переносний Архівний Обмінний інструмент(Portable Archive Interchange utility). pax прочита, запише і перелічить всіх учасників архіву і скопіює повну структуру каталога. pax незалежний від формату архіву і підтримує величезну їх кількість.
Проте реалізації pax все ще досить свіжі і недостатньо відладжені.
# apt-get install pax
$ pax -rw -p e . newdir # або
$ find . -depth | pax -rw -p e newdir
cpio
cpio копіює файли у архів cpio або tar. Архів може бути іншим файлом на диску, магнітною стрікою або каналом (pipe).
$ find . -depth -print0 | cpio --null --sparse -pvd new-dir
afio
afio - це кращий спосіб роботи з архівами у форматі cpio. Він як правило швидший за cpio, пропонує значно ширші можливості та чудово справляється з пошкодженнями даних. Від також підтримує багатотомові архіви; він сам стискає свої архіви, що є значно безпечніше і швидше, аніж стискання архівів tar чи cpio. afio - це найкращий спосіб резервування даних за допомогою сценаріїв.
$ find . -depth -print0 | afio -px -0a new-dir
Всі мої резервні копії на магнітні стрічки робляться за допомогою afio.
Диференційне резервування та синхронізація даних
Диференційне резервування та синхронізація даних можуть бути реалізовані кількома методами:
- rcs: резервування та історія, лише текст
- rdiff-backup: резервування та історія; підтримка симлінків
- pdumpfs: резервування та історія всередині файлової системи; підтримка симлінків
- rsync: одностороння синхронізація
- unison: двостороння синхронізація
- cvs: багатостороння синхронізація з резервуванням на стороні сервера та історією, лише текст. Детальніше див. ?параграф 12.1.
- arch: багатостороння синхронізація з резервуванням на стороні сервера, немає підтримки т.зв. "робочого каталогу".
- subversion: багатостороння синхронізація з резервуванням на стороні сервера та історією, Apache.
Комбінування одного з цих методів разом з архівуванням, описаним у попередньому параграфі та автоматичними регулярними завданнями, описаними у параграфі 8.6.27 дасть в результаті непогану систему резервування.
Я розповім про три простих у використанні інструменти.
Диференційне резервування за допомогою rdiff
rdiff-backup забезпечує просте і зручне резервування з диференційною історією для будь-яких типів файлів, включаючи симлінки. Щоб зробити копію домашнього каталогу у /mnt/backup:
$ rdiff-backup --include ~/tmp/keep --exclude ~/tmp ~/ /mnt/backup
Щоб відновити дані триденної давності з цього архіву у каталог ~/old:
$ rdiff-backup -r 3D /mnt/backup ~/old
Див. rdiff-backup(1).
Щоденне резервування за допомогою pdumpfs
pdumpfs - це проста система для щоденного резервування, подібна до dumpfs у Plan9, котра робить щодений зліпок системи. Ви можете доступитись до попередніх зліпків і отримати копію файлу за будь-який день в будь-який час. Резервуйте ваш домашній каталог за допомогою pdumpfs та cron!
pdumpfs формує зліпок за певний день у каталозі призначення. В момент першого запуску туди копіюються всі джерельні файли. Всі подальші рази pdumpfs копіюватиме лише новостворені та змінені файли, а для незмінених формує жорсткі лінки, щоб зекономити простір на диску.
$ pdumpfs src-dir dest-dir [dest-basename]
Див. pdumpfs(8).
Регулярне диференційне резервування за допомогою RCS
Changetrack постійно записує зміни у текстових конфігураційних файлах у ахіви RCS. Див. changetrack(1).
# apt-get install changetrack
# vi changetrack.conf
Якщо система завмерла
Знищення процесу
Зпустіть top щоб побачити список активних процесів. Натисніть P' щоб відсортувати їх по використанню процесора,
M' - по об'єму пам'яті, та `k' щоб вбити процес. Можна також використати БСД-подібну конструкцію ps aux | less чи System-V-подібну ps -efH | less. Синтаксис в стилі System-V показує ідентифікатори батьківських процесів (PPID), котрі можуть бути використані для пошуку та знищення зомбі (дочірніх процесів, котрі все ще працюють, хоча батьківські вже завершили свою роботу - прим. перекладача).
Команда kill знищує (або в більш загальному випадку віправляє сигнал) процес по ідентифікатору. killall робить те ж саме по назві процесу. Найчастіше вживаються наступні сигнали:
Номер | Ім’я | Дія |
---|---|---|
1 | HUP | перезапустити демон |
15 | TERM | звичайне завершення роботи |
9 | KILL | примусове завершення роботи |
Alt-SysRq
Опція ядра "Чарівна клавіша СистВиклик" ("Magic SysRq key") дає можливість вирішувати проблемні ситуації. На системах і386 натиснення Alt-SysRq, а потім однієї з клавіш r 0 k e i s u b має магічну дію.
r (від англ. un_r_aw - повернути до вжитку, відновити) відновлює клавіатуру після речей наподобі краху Х. Зміна рівня консольного журналювання до 0 відключає виведення повідомлень про помилки. k (англійське скорочення sa_k_ - system attention key, клавіша системного догляду) знищує всі процеси на поточній віртуальній консолі. e (від англ. t_e_rminate - знищити) знищує всі процеси на поточному терміналі за винятком init. i (англ. k_i_ll - вбити) знищує всі процеси за винятком init.
s, u та b (від англ. S_ync, u_mount, та re_b_oot - відповідно, "синхронізувати", "розмонтувати" і "перезавантажити") призначені для виходу з справді скрутних становищ (ці три комбінації потрібно натиснути послідовно, одну за другою, для того, щоб синхронізувати службовий кеш файлової системи, розмонтувати всі файлові системи та коректно перевантажити систему - прим. перекладача).
На час написання даного документу ядра в типовій поставці Дебіен не компілювались з цією опцією, так що вам потрібно перекомпілювати ядро, щоб отримати вищеописану функціональність. Детальніша інформація подана в /usr/share/doc/kernel-doc-версія/Documentation/sysrq.txt.gz або /usr/src/kernel-версія/Documentation/sysrq.txt.gz.
Маленькі елегантні команди, котрі варто запам'ятати
Прогортач
Типовим прогортачем (переглядач вмісту файлів) є less. Клавіша h в ньому викликає довідку. Він може зробити значно більше, аніж more (гра слів, котру неможливо перекласти - англ. less означає "менше", more - "більше"). При виконанні сценаріїв вивід less можна опрацьовувати за допомогою вираз($less-файл) чи вираз($less-канал). Додаткова інформація подається в /usr/share/doc/lessf/LESSOPEN. Опція -R дозволяє прямий вивід символів і задіює кольорові послідовності АНСІ. Див. також less(1).
Непоганою альтенативою для деяких кодових систем (EUC) є може бути такий прогортач як w3m.
Доступна пам'ять
Утиліти free та top дають достатньо інформації про використання пам'яті. Не хвилюйтесь про розмір у секції "used" (використано) рядка "Mem:" (пам'ять), а натомість гляньте на наступний рядок (38792 у прикладі нижче).
$ free -k # для машини з 256МБ пам'яті
Всього Викор. Вільно Загальна Буферна Кешована
Пам'ять: 257136 230456 26680 45736 116136 75528
-/+ буфери/кеш: 38792 218344
Обмінник: 264996 0 264996
Точну кількість доступної пам'яті можна дізнатись командою
grep '^Memory' /var/log/dmesg
котра в нашому випадку видать наступне
"Memory: 256984k/262144k available (1652k kernel code, 412k reserved, 2944k data, 152k init)".
Всього = 262144k = 256M (1k=1024, 1M=1024k)
Вільно в dmesg = 256984k = Всього - ядро - зарезервована - дані - init
Доступно оболонці = 257136k = Всього - ядро - зарезервована - дані
Близько 5МБ пам'яті недоступно для системи, бо їх використовує ядро.
Установка часу (БІОС)
# date MMDDhhmmCCYY
# hwclock --utc --systohc
# hwclock --show
Ці команди встановлюють системний та апаратний час. Час вказується відповідно до локального часового поясу, але апаратна частина використовує UTC.
Якщо апаратний час (БІОС) виставлений по Грінвічу, змініть налаштування на UTC=yes у файлі /etc/default/rcS.
Установка часу (NTP)
Посібник: ЯКЦЕ точно налаштувати дату та час.
Установка часу при постійному під'єднанні до інтернету
Автоматично корегувати годиник по віддаленому серверу:
# ntpdate server
Цей рядок вартувало б додати до /etc/cron.daily/ якщо у вас постійне під'єднання до мережі
Установка часу при непостійному під'єднанні до інтернету
Скористайтесь пакунком chrony.
Як контролювати можливості консолі наподобі зберігача екрану
Наступні команди відключають зберігач екрану.
У консолі Лінукс:
# setterm -powersave off
Запустіть консоль kon2 (kanji):
# kon -SaveTime 0
Якщо запущено X:
# xset s off # або
# xset -dpms # або
# xscreensaver-command -prefs
Прочитайте відповідні сторінки підручника щоб дізнатись, як налаштовувати інші можливості консолі. Прочитайте також stty(1) щоб навчитись дізнаватись та змінювати налаштування термінального рядка.
Пошук адміністративних баз даних
У glibc є програма getent(1), котра шукає адміністративні бази даних штибу passwd, group, hosts, services, protocols, чи networks.
getent база_даних [ключ ...]
Відключити звук (біп)
Дехто просто виймає динамік ;-) Для оболонки Баш:
echo "set bell-style none">> ~/.inputrc
Повідомлення про помилки на екрані консолі
Щоб впорядкувати повідомлення про помлики, перш за все перевірте /etc/init.d/klogd. Задайте KLOGD="-c 3"
у цьому сценарії та запустіть /etc/init.d/klogd restart
. Цього ж можна досягти, запустивши dmesg -n3
.
Рівні помилок тут означають наступне:
Код | Ім’я | Значення |
---|---|---|
0 | KERN_EMERG | система недоступна |
1 | KERN_ALERT | потрібно негайно щось вчинити |
2 | KERN_CRIT | критичні повідомлення |
3 | KERN_ERR | повідомлення про помилки |
4 | KERN_WARNING | застережні повідомлення |
5 | KERN_NOTICE | все в порядку, але візьміть на замітку |
6 | KERN_INFO | інформаційні повідомлення |
7 | KERN_DEBUG | наладжувальні повідомлення |
Якщо велика кількість докладних повідомлень про помилки непокоїть вас, задумайтесь над накладанням латки наподобі shutup-abit-bp6 (доступна в каталозі examples).
Окрім того можете поглянути на /etc/syslog.conf; перевірте, чи всі повідомлення про помилки відправляються на консоль.
Налаштування коректного типу консолі
Доступ до екрану консолі в Юнікс-подібних системах як правило реалізується за допомогою бібліотеки (n)curses. Таким чином користувач отримує незалежний від типу терміналу метод оновлення символів екрану з відповідною оптимізацією. Див. ncurses(3X) та terminfo(5).
У системі Дебіен є доволі багато передналаштованих елементів:
$ toe | less # всі записи
$ toe /etc/terminfo/ | less # записи, доступні користувачеві для змін
Експортуйте потрібний вам елемент як значення змінної середовища TERM.
Якщо запис xterm не працює з не-Дебіанівським xterm-ом, коли ви приєднуєтесь до Дебіен з віддаленої машини, змініть тип вашого терміналу з "xterm" на один з обмежених у можливостях варіантів наподобі "xterm-r6". Детальнішу інформацію шукайте в /usr/share/doc/libncurses5/FAQ. Найпростішим, найпримітивнішим типом терміналу є "dumb".
Повернення консолі до здорового глузду
Якщо термінал здурів після перегляду якого двійкового файлу, введіть (ви можете не бачити символів, котрі вводитимете:
$ reset
Перетворення файлу з ДОС-режиму в Юнікс-режим
Перетворення ДОСівського текстового файлу (кінець-рядка = ^MJ) у текстовий файл Юнікс (кінець-рядка = ^J) робиться наступним чином:
# apt-get install sysutils
$ dos2unix dosfile
Перетворення текстового файлу за допомогою recode
Наступні команди перетворюють текстовий файл між ДОС-, Мак- та Юнікс-режимами завершення рядка:
$ recode /cl../cr <dos.txt >mac.txt
$ recode /cr.. <mac.txt >unix.txt
$ recode ../cl <unix.txt >dos.txt
Програма recode легко конвертує файли між різними наборами символів та (поверхнями? англ. surfaces)
$ recode charset1/surface1..charset2/surface2 \
<input.txt >output.txt
Найчастіше використовуються наступні набори символів (гляньте також параграф 9.7.3 "Вступ до локалей"):
- us — ASCII (7 біт)
- l1 — ISO Latin-1 (ISO-8859-1, Західна Європа, 8 біт)
- EUCJP — EUC-JP для японської (Юнікс)
- SJIS — Shift-JIS для японської (Майкрософт)
- ISO2022JP — поштове кодування японської (7 біт)
- u2 — UCS-2 (універальний набір символів, 2 байти)
- u8 — UTF-8 (Універсальний Трансформуючий Формат, англ. Universal Transformation Format, 8 біт)
Найчастіше вживаними (поверхнями? англ. surfaces) є:
- /cr — кінцем рядка є повернення каретки (Мак)
- /cl — кінцем рядка є повернення каретки та переведення рядка (ДОС)
- / — кінцем рядка є переведення рядка (Юнікс)
- /d1 — порозрядний сприйнятний для людини десятковий дамп
- /x1 — порозрядний сприйнятний для людини шістнадцятковий дамп
- /64 — текст, кодований у Base64
- /QP — закодований та залапкований текст
Детальніша інформація подана у info recode.
Є й інші спеціалізовані інструменти для конвертування текстів:
- перетворення між кодовими сторінками:
- iconv — перетворення між локалями
- konwert — вишукані перетворення
- перетворення двійкових файлів:
- uuencode та uudecode — для Юнікс
- mimencode — для пошти
Заміна регулярних виразів
Замінити всі входження ПОЧАТКВИРАЗ на КІНЕЦЬВИРАЗ у всіх ФАЙЛАХ:
$ perl -i -p -e 's/ПОЧАТК_ВИРАЗ/КІНЕЦЬ_ВИРАЗ/g;' ФАЙЛИ ...
-i задає т.зв. "редагування на місці", -p для повного перегляду списку ФАЙЛІВ. Якщо ви змінюєте багато файлів, то можете полегшити відновлення даних після помилок, якщо використаєте параметр -i.bak замість -і; таким чином ви вбережете оригінальні файли, а текст буде замінено у новостворених із закінченням .bak.
Редагування файлу на місці за допомогою сценаріїв
Наступний сценарій видалить рядки з 5 по 10 та з 16 по 20.
#!/bin/bash
ed $1 <<EOF
16,20d
5,10d
w
q
EOF
Команда ed тут позначає те ж саме, що й vi у командному режимі. Редагування файлу з кінця полегшує написання сценарію (не треба перераховувати, на скільки зміститись рядки, котрі нам потрібно видалити, після видалення рядків з початку файлу - прим. перекладача).
Визначення відмінностей та застосування оновлень для текстових файлів
Слідуючи за однією з цих процедур, ви визначите відмінності між двома файлами та створите уніфікований diff-файл file.patch0 або file.patch1 в залежності від розташування файлу:
$ diff -u file.old file.new1 > file.patch0
$ diff -u old/file new1/file > file.patch1
Файл відмінностей (котрий також називають латкою) використовується для оновлень програми. Щоб оновити програму з його допомогою, потрібно:
$ patch -p0 file < file.patch0
$ patch -p1 file < file.patch1
Якщо ви маєте три версії джерельного коду, за допомогою diff3 ви можете об'єднати їх значно ефективніше:
$ diff3 -m file.mine file.old file.yours > file
Перетворення великого файлу на багато маленьких
$ split -b 650m file # розділити файл на шматки по 650 МБ
$ cat x* >largefile # злити багато маленьких файлів у один великий
Добування даних з таблиць текстових файлів
Давайте розглянемо текстови файл з назвою DPL в котрому через пробіли перелічені лідери проекту Дебіен та час їх вступу на посаду.
Ian Murdock August 1993
Bruce Perens April 1996
Ian Jackson January 1998
Wichert Akkerman January 1999
Ben Collins April 2001
Bdale Garbee April 2002
Martin Michlmayr March 2003
Щоб видобути дані з такого типу файлів часто викорисовується awk.
$ awk '{ print $3 }' <DPL # видрукувати місяці
August
April
January
January
April
April
March
$ awk '($1=="Ian") { print }' <DPL # лідери, котрі називались Іен (Ian)
Ian Murdock August 1993
Ian Jackson January 1998
$ awk '($2=="Perens") { print $3,$4 }' <DPL # Коли на посаду вступив Перенс (Perens)
April 1996
Оболонки штибу Баш також можуть використовуватись для аналізу такого типу файлів:
$ while read first last month year; do
echo $month
done <DPL
... точно такий же вивід, як у першому прикладі з awk
Щоб розділити рядки на слова, вбудована команда read використовує символи, перелічені у змінній $IFS (англ. internal field separators - розділювачі внутрішніх полів).
Якщо ви зміните IFS на ":", то зможете проаналізувати /etc/passwd:
$ oldIFS="$IFS" # зберегти старе значення
$ IFS=":"
$ while read user password uid gid rest_of_line; do
if [ "$user" = "osamu" ]; then
echo "ІД користувача $user рівний $uid"
fi
done < /etc/passwd
ІД користувача osamu рівний 1001
$ IFS="$oldIFS" # відновити попереднє значення
(Якщо для подібної задачі залучається awk, то розділювач полів задається за допомогою FS=":").
IFS також використовується оболонкою щоб розділити результати розкриття параметрів та арифметичних операцій чи підстановки команд. Але цього не відбувається всередині одинарних чи подвійних лапок. Тповим значенням IFS є поєднання <прогалина>, <табулятор> та <новий рядок>.
Будьте уважними при фокусах з IFS. Коли оболонка проінтерпретує деякі частини сценарію як його ввід, можуть відбуватись дивні речі.
$ IFS=":," # у якості IFS використовувати ":" та ","
$ echo IFS=$IFS, IFS="$IFS" # echo - вбудована команда Баш
IFS= , IFS=:,
$ date -R # просто вивід команди
Sat, 23 Aug 2003 08:30:15 +0200
$ echo $(date -R) # підоболонка --> ввід у головну оболонку
Sat 23 Aug 2003 08 30 36 +0200
$ unset IFS # скидання IFS до типових значень
$ echo $(date -R)
Sat, 23 Aug 2003 08:30:50 +0200
Шматочки сценарію для об'єднання команд в канали
Наступні команди роблять симпатичні речі за допомогою каналів.
find /usr | egrep -v "/usr/var|/usr/tmp|/usr/local"
# знайти всі файли у каталозі /usr за винятком деяких
xargs -n 1 команда # запустити команду для всіх елементів стандартного вводу
xargs -n 1 echo | # розділити відокремлені прогалинами елементи на окремі рядки
xargs echo | # об'єднати всі рядки в один
grep -e pattern| # виділити рядки, що містять шаблон
cut -d: -f3 -|
# виділити третє поле, відділене символом : (наприклад, у файлі паролів)
awk '{ print $3 }' | # виділити третє поле, відділене прогалинами
awk -F'\t' '{ print $3 }' |
# виділити третє поле, відділене тебуляторами
col -bx | # видалити backspace та розкрити табулятори в пробіли
expand -| # розкрити табулятори
sort -u| # відсортувати та видалити повторення
tr '\n' ' '| # об'єднати рядки в один
tr '\r' _| # видалити символ CR_
tr 'A-Z' 'a-z'| # перетворити великі літери у маленькі
sed 's/^/# /'| # зробити кожен рядок коментарієм
sed 's/\.ext//g'| # видалити ланцюжок .ext
sed -n -e 2p| # видалити другий рядок
head -n 2 -| # роздрукувати перші два рядки
tail -n 2 -| # роздрукувати останні два рядки
Шматки сценарію для проглядання переліку файлів
Нижчеописані способи проглядання файлів, що закінчуються на .ext передбачають коректну обробку особливих назв файлів (наприклад, тих, що містять прогалини): Цикл оболонки (цей приклад написаний в кількох рядках, з PS2=" ". Щоб зробити те ж саме в одному рядку, вставте двокрапки замість розривів рядків):
for x in *.ext; do
if test -f "$x"; then
команда "$x"
fi
done
Комбінація find та xargs:
find . -type f -maxdepth 1 -name '*.ext' -print0 | \
xargs -0 -n 1 команда
find з опцією -exec з командою:
find . -type f -maxdepth 1 -name '*.ext' \
-exec команда '{}' \;
find з опцією -exec з коротким сценарієм оболонки:
find . -type f -maxdepth 1 -name '*.ext' \
-exec sh -c "команда '{}' && echo 'успішно'" \;
Маленький дурний сценарій на Perl
Хоча будь-який awk-сценарій може бути автоматично переписаний на Perl за допомогою a2p(1), однорядкові awk-сценарії найкраще перетворювати в однорядкові сценарії на Perl вручну. Наприклад рядок
awk '($2=="1957") { print $3 }' |
еквівалентний будь-якому з наступних рядків:
perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
perl -lane 'print $F[2] if $F[1] eq "1957"' |
Всі прогалини в аргументах в рядках вище видаляються та спрощують автоматичне перетворення між ланцюжками та цифрами:
perl -lane 'print$F[2]if$F[1]eq+1957' |
Опції командного рядка описуються в perlrun(1). Значно божевільніші сценарії можна знайти на http://perlgolf.sourceforge.net.
Отримання тексту з сторінок тенет
Настунпий рядок запише сторінку тенет в текстовий файл. Дуже зручно при копіюванні конфігурації з Тенет.
$ lynx -dump http://www.remote-site.com/help-info.html >textfile
Також можна використати links чи w3m з незначними відмінностями у формуванні сторінки.
Якщо ви аналізуєте архів списку розсилки, використовуйте munpack щоб дістати чистий вміст листа з тексту сторінки.
Елегантне видруковування сторінки тенет
Наступна команда роздрукує сторінку на принтер PostScript чи у файл.
$ apt-get install html2ps
$ html2ps URL | lpr
Гляньте параграф 3.6.1 lpr/lpd. Також передивіться пакунки a2ps та mpage на предмент формування файлів PostScript.
Елегантне видруковування сторінки довідки
Наступна команда роздрукує сторінку на принтер PostScript чи у файл.
$ man -Tps some-manpage | lpr
$ man -Tps some-manpage | mpage -2 | lpr
Об'єднання двох PostScript чи PDF файлів
Ви можете об'єднати два файли наступним чином:
$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \
-sOutputFile=шняга.ps -f бяка1.ps бяка2.ps
$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
-sOutputFile=шняга.pdf -f бяка1.pdf бяка2.pdf
Час виконання команди
Показати час виконання процесу.
# time якась_команда >/dev/null
real 0m0.035s # час по настінному годиннику (скільки минуло реального часу)
user 0m0.000s # час в режимі користувача
sys 0m0.020s # час в режимі ядра
Команда nice
Команда nice (з пакунку GNU shellutils) задає пріоритет виконання команди при запуску. renice (bsdutils) та top можуть змінити пріоритет. Значення 19 означає найнижчий пріоритет процесу; негативні значення означають підвищений пріоритет, їх може задавати лише суперкористувач.
# nice -19 top # вельми мило
# nice --20 cdrecord -v -eject speed=2 dev=0,0 disk.img # дуже швидко
Іноді великі значення nice приносять більше шкоди аніж користі. Обережно користуйтесь цією командою.
Запланована діяльність (cron, at)
Користуйтесь програмами cron та at щоб плануванти завдання в Лінукс. Зверніться до at(1), crontab(5), crontab(8).
Запустіть команду crontab -e щоб створити або редагувати файл crontab і, відповідно, налаштувати регулярно виконувані операції. Приклад такого файлу:
# для запуску команд користуйтесь /bin/sh незалежно від того, що написано в /etc/passwd
SHELL=/bin/sh
# весь вивід відправляти пошткою користувачеві `paul', незалежно від того, чий це crontab-файл
MAILTO=paul
# Хв Год ДеньМісяця Місяць ДеньТижня команда (дні додаються логічним "АБО")
# запускати щодня о 00:05
5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# запускати в перший день місяця о 14:15 -- вивід відправити користувачеві poul
15 14 1 * * $HOME/bin/monthly
# Запускати в робочі дні о 22:00, нагадування для Джо. % для нового рядка, останній % для cc:
0 22 * * 1-5 mail -s "Зараз 10 вечора" joe%Джо,%%де діти?%.%%
23 */2 1 2 * echo "Запускати о 23 хвилині після 12год, 14год, 16год ..., 1 лютого"
5 4 * * sun echo "Запускати щонеділі о 04:05"
# Запускати кожного місяця щопонеділка о 03:40
40 3 1-7 * * [ "$(date +%a)" == "Mon" ] && command -args
Команда at планує одноразову роботу:
$ echo 'команда -аргументи'| at 3:40 monday
Перемикання між консолями за допомогою screen
Програма screen дозволяє вам запустити кілька віртуальних терміналів з власними інтерактивними оболонками на одному фізичному терміналі чи у одному вікні емуляції терміналу. Навіть якщо ви використовуєте віртуальні консолі чи вікна графічних терміналів наподобі xterm, все ж варто звернути увагу на screen з її багатим набором можливостей, серед яких
- історія роботи,
- копіювання та вставка,
- журналювання виводу,
- можливість від'єднати сесію від терміналу та приєднати її пізніше та багато іншого.
Сценарій віддаленого доступу
Якщо ви часто реєструєтесь на Лінукс-машині з віддаленого терміналу, screen з її можливістю від'єднання значно спростить ваше життя.
- Ви зареєстровані через діалап-з'єднання і запустили комплексну сесію screen з редакторами та іншими програмами у кількох вікнах.
- Раптом вам потрібно залишити термінал, але ви не хочете втратити роботу розірвавши з'єднання.
- Просто введіть ^A d щоб від'єднати сесію, а потім завершіть роботу (або ще швидше - введіть ^A DD)
- Коли ви пізніше зареєструєтесь, введіть команду screen -r, і screen сама приєднає всі ваші вікна назад.
Типові команди screen
Коли ви запустили screen, весь ввід клавіатури відправляється в поточне вікно за винятком командного скорочення, типово ^A. Всі команди screen віддаються введенням ^A плюс однієї клавіші [плюс будь-які параметри]. Частовживані команди:
Команда | Опис |
---|---|
^A ? | показати вікно довідки (скорочення клавіш) |
^A c | створити нове вікно та перемикнутись на нього |
^A n | перейти до наступного вікна |
^A p | перейти до попереднього вікна |
^A 0 | перейти до вікна номер 0 |
^A w | показати повний список вікон |
^A a | відправити поточному вікну комбінацію Ctrl-A |
^A h | записати копію поточного вікна у файл |
^A H | розпочати/завершити журналювання поточного вікна у файл |
^A ^X | заблокувати термінал (захищається паролем) |
^A d | від'єднати сесію від терміналу |
^A DD | від'єднати сесію та завершити роботу |
Це лише незначна частина команд та можливостей screen. Якщо ви хочете, щоб screen могла щось робити, швидше за все вона це вже може! Деталі шукайте в screen(1).
Backspace та/або Ctrl-H в screen
Якщо ви виявили, що клавіша backspace та/або Ctrl-H не працюють в запущеній screen, відкрийте файл /etc/screenrc, знайдіть рядок
bindkey -k kb stuff "\177"
та закоментуйте його (тобто додайте символ "#" на початок рядка).
Графічний аналог screen
Гляньте-но xmove(1).
Основи тестування мережі
Встановіть пакунки netkit-ping, traceroute, dnsutils, ipchains (для ядер 2.2) чи iptables (для ядер 2.4-2.6), та net-tools і:
$ ping google.com # перевірити з'єднання з інтернет
$ traceroute google.com # трасувати пакети ІР
$ ifconfig # перевірити конфігурацію хоста (наявність і стан мережевих
# інтерфейсів - прим.перекладача)
$ route -n # перевірити маршрутизацію
$ dig [@dns-server.com] host.dom [{a|mx|any}] |less
# перевірити записи DNS хоста host.dom за допомогою dns-server.com
# для типу {a|mx|any}
$ ipchains -L -n |less # перевірити фільтр пакетів (ядра 2.2)
$ iptables -L -n |less # перевірити фільтр пакетів (ядра 2.4)
$ netstat -a # показати всі відкриті порти
$ netstat -l --inet # показати слухаючі порти (котрі очікують на запит ззовні)
$ netstat -ln --tcp # показати слухаючі порти протоколу TCP (числа)
Очистка пошти з локального сховища
Щоб очистити локальну пошту:
# exim -q # очистити очікуючі листи
# exim -qf # очистити всі листи
# exim -qff # очистити навіть заморожені листи
-qff краще додати опцією у сценарій /etc/ppp/ip-up.d/exim. Для Sarge вище, замініть exim на exim4.
Видалення замороженої пошти з локального сховища
Щоб видалити заморожену пошту з локального сховища з показом помилок про доставку:
# exim -Mg `mailq | grep frozen | awk '{ print $3 }'`
Для Sarge, замініть exim на exim4.
Повторне отримання вмісту поштової скриньки
Вам потрібно заново отримати листи до відсортованих поштових скриньок у вашому домашньому каталозі з /var/mail/користувач якщо ваш домашній каталог був переповненим і procmail зазнав краху. Після звільнення простору у вашому домашньому каталозі запустіть:
# /etc/init.d/exim stop
# formail -s procmail файл-що-має-бути-очищеним
Пусті файли
Наступні комнади створюють пусті (порожні) файли:
$ dd if=/dev/zero of=filename bs=1k count=5 # 5КБ нульового вмісту
$ dd if=/dev/urandom of=filename bs=1M count=7 # 7МБ випадкового вмісту
$ touch filename # створити порожній файл (якщо файл існує, обновиться його атрибут mtime)
Наприклад, наступні команди, виконані з оболонки завантажувального диску Дебіен, знищать виіст жорсткого диску /dev/hda і зроблять його недоступним для подальшого використання в звичайному режимі (цебто без перестворення розділів)
# dd if=/dev/urandom of=/dev/hda ; dd if=/dev/zero of=/dev/hda
chroot
Програма chroot (див. chroot(8)), дозволяє мати кілька копій середовища ГНУ/Лінукс в одній системі одночасно без перезавантаження.
Ви також можете запустити ресурсоємну програму наподобі apt-get чи dselect у середовищі chroot на швидкій машині і під'єднати до неї в режимі запису файлову систему дочірньої машини для її оновлення.
Запуск іншої збірки Дебіен за допомогою chroot
Середовище Дебіен chroot в Sarge може бути легко створене командою debootstrap. Для пізніших збірок краще використовувати команду cdebootstrap з відповідними опціями. Наприклад, щоб створити Sid chroot в каталозі /sid-root за наявності швидкого доступу в інтернет, виконайте:
main # cd / ; mkdir /sid-root
main # debootstrap sid /sid-root <http://ftp.debian.org/debian/>
... спостерігайте за звантаженням цілої системи
main # echo "proc-sid /sid-root/proc proc none 0 0" >> /etc/fstab
main # mount proc-sid /sid-root/proc -t proc
main # cp /etc/hosts /sid-root/etc/hosts
main # chroot /sid-root /bin/bash
chroot # cd /dev; /sbin/MAKEDEV generic ; cd -
chroot # apt-setup # set-up /etc/apt/sources.list
chroot # vi /etc/apt/sources.list # point the source to unstable
chroot # dselect # you may use aptitude, install mc and vim :-)
В цьому місці ви повинні мати повноцінну систему Дебіен де ви можете бавитись без страху пошкодити основу систему.
Цей фокус з debootstrap також можна використати для встановлення Дебіен без встановлювального диску якщо у вас є диск з іншою збіркою ГНУ/Лінукс. Деталі див. на http://www.debian.org/releases/stable/i386/apcs04.html.en.
Налаштування реєстрації в chroot
Ввести chroot /sid-root /bin/bash просто, але при цьому ви потягнете за собою всі змінни середовища і т.ін. Значно краще з окремої віртуальної консолі запустити процес реєстрації та зареєструватись в chroot напряму.
Поскільки на типовій системі Дебіен на терміналах з tty1 по tty6 запущені консолі Лінукс, а на tty7 система X Window, давайте під chroot використаємо, наприклад, tty8. Після створення середовища chroot як це описано у попередньому параграфі, введіть з оболонки суперкористуача головної системи:
main # echo "8:23:respawn:/usr/sbin/chroot /sid-root "\
"/sbin/getty 38400 tty8" >> /etc/inittab
main # init q # перевантажити init
Налаштування Х в chroot
Хочете безпечно запускати найсвіжіші X та GNOME/KDE у вашому chroot? Це елементарно! Наступний приклад запустить GDM на віртуальному терміналі vt9.
Встановіть систему в chroot як це описано у параграфі 8.6.35.1. З оболонки системного адміністратора головної системи скопіюйте ключові конфігураційні файли в систему в chroot.
main # cp /etc/X11/XF86Config-4 /sid-root/etc/X11/XF86Config-4
main # chroot /sid-root # або скористайтесь консоллю chroot
chroot # cd /dev; /sbin/MAKEDEV generic ; cd -
chroot # apt-get install gdm gnome x-window-system
chroot # vi /etc/gdm/gdm.conf # в секції [servers] зробіть s/vt7/vt9/
chroot # /etc/init.d/gdm start
Файл /etc/gdm/gdm.conf був відредагований щоб замінити vt7 на vt9.
Тепер ви можете легко перемикатись туди-сюди між повноцінними графічними середовищами в chroot та основній системі просто перемикаючись між віртуальними терміналами, тобто за допомогою комбінацій клавіш Ctrl-Alt-F7 і Ctrl-Alt-F9. Розважайтесь!
[FIXME] Додати коментар та лінк на ініціалізаційний сценарій gdm.
Запуск іншої збірки в chroot
Для іншої збірки chroot створити так само легко. Ви встановлюєте систему у окремі розділи за допомогою встановлювача іншої збірки. Якщо його кореневий розділ розташовано в /dev/hda9:
main # cd / ; mkdir /other-dist
main # mount -t ext3 /dev/hda9 /other-dist
main # chroot /other-dist /bin/bash
А далі все так само, як це описано у попередніх параграфах.
Формування пакунків в chroot
Існує спеціалізований пакунок, pbuilder, котрий конструює систему в chroot і формує в ній пакунок. Це ідеальний спосіб перевірити коректність залежностей пакунку.
Як перевірити жорсткі лінки
Ви можете перевірити чи два файли не жорсткими лінками одного файлу за допомогою
$ ls -li file1 file2\
Монтування файлу образу жорсткого диску
Якщо file.img містить образ жорсткого диску і оригінальний жорсткий диск мав конфігурацію, що давала xxxx = (байт/сектор) * (секторів/циліндр), то наступна команда змонтує його в каталог /mnt:
# mount -o loop,offset=xxxx file.img /mnt
Зауважте, що більшість жорстких дисків мають 512 байт/сектор.
Samba
Основи отримання файлів з Віндовз:
# mount -t smbfs -o username=myname,uid=my_uid,gid=my_gid \
//server/share /mnt/smb # примонтувати ресурс Віндовз до Лінукс
# smbmount //server/share /mnt/smb \
-o "username=myname,uid=my_uid,gid=my_gid"
# smbclient -L 192.168.1.2 # подивитись список доступних ресурсів комп'ютера
Сусідні машини з Лінукс можна подивитись за допомогою:
# smbclient -N -L ip_address_of_your_PC | less
# nmblookup -T "*"
Інструменти для чужорідних файлових систем
Ядро Лінукс підтримує багато чужорідних файлових систем і до них можна доступитись просто монтуючи пристрій що їй містить. Для певних файлових систем також розроблені спеціальні інструменти щоб доступатись до них без монтування пристроїв. Це реалізовано у користувацьких програмах так що підтримка на рівні ядра не потрібна.
- mtools: для файлових систем МСДОС (МС-ДОС, Віндовз)
- cpmtools: для файлових систем CP/M
- hfsutils: для файлових систем HFS (оригінальний Макінтош)
- hfsplus: для файлових систем HFS+ (сучасний Макінтош)
Щоб створювати та перевіряти файлові системи FAT, зручно користуватись dosfstools.
Основні помилки, котрі варто запам'ятати
Нижче подано кілька прикладів небезпечних дій. Їх негативний ефект буде значно сильнішим, якщо вони будуть своєні у середовищі системного адміністратора.
rm -rf .*
Використання символів підстановки у аргументі командного рядка як наприклад у "rm -rf ." може призвести до небезпечних результатів, оскільки "." при розкриванні включає в себе "." та "..". Поточна версія команди "rm" у збірках Дебіен перевіряє передані їй аргументи та не видаляє ці каталоги, проте така її поведінка не гарантована в інших системах. Спробуйте виконати наступні команди щоб побачити як працюють символи підстановки.
echo .
: перелічує весь поточний каталог та сам поточний каталог
echo *
: перелічує всі файли, що не починаються з крапки, у поточному каталозі
echo .[^.]*
: перелічує всі файли та каталоги у поточному каталозі, що починаються з крапки
echo .*
: перелічує весь поточний каталог та сам поточний каталог.
rm /etc/passwd
Втрата деяких важливих файлів як наприклад /etc/passwd може принести масу клопотів. Система Дебіен робить їх регулярні резервні копії до каталогу /var/backups/. Після того, як відновите свої файли, не забудьте задати їм коректні права доступу.
# cp /var/backups/passwd /etc/passwd
# chmod 644 /etc/passwd
Див. також параграф 6.3.4.