FAQ по ОС AIX Часть 3. Файлы. Резервное копирование и восстановление.


Где сохраняются сообщения системы (AIX log files) ?

 Как сделать файл размером больше 2 Гбайт ?

 Для чего нужна команда lsof?

Как восстановить удаленные файлы?

Ответы на эти и другие вопросы по ОС AIX Вы найдёте здесь…

Q: Где сохраняются сообщения системы (AIX log files) ?

A: Сообщения сохраняются в самых разных местах. Очень многие полезные журналы находятся в каталоге /var/adm/ras (RAS – аббревиатура, обозначает Reliability, Availability, Serviceability). Например, там находится файл errlog – в основном, в нём можно найти диагностические сообщения от аппаратуры. Просматривается командой errpt.
”Классический” UNIX-овый журнал syslogd – см. конфигурационный файл /etc/syslog.conf
Учтите, что если Вы указали в файле /etc/syslog.conf место расположения журнала, то сначала надо этот файл (журнал) создать
# touch <журнал>
а потом перезапустить подсистему syslogd
# refreshs syslogd
Не забудьте также про права доступа к журналу – нехорошо, если его смогут просматривать все, кому не лень.

Q: Как определить имя файла по номеру inode ?

A: # ncheck -i nnnn /mountpoint
или
find /mountpoint –inum nnnn

nnnn – номер inode, mntpoint – точка монтирования файловой системы с этим файлом

 

Q: Как уменьшить размер файла /var/adm/wtmp?

A: Файл /var/adm/wtmp растет с каждым входом пользователя в систему. Содержимое wtmp просматривается командой ‘last’. Она показывает в обратном порядке все login-ы и перезагрузки, которые были с самого начала файла wtmp.
Можно посмотреть отдельные записи, например:
# last root
# last reboot

Этот файл не надо удалять, но его содержимое можно сбросить:

 

# > /var/adm/wtmp — перенаправить ‘пустой’ вывод в файл. Длина файла = 0. 

 

Q: Как сделать файл размером больше 2 Гбайт ?

A: Используйте файловую систему JFS2 (Enhanced JFS). В ней можно создавать файлы размером до 1Тб. Советуем также проверить лимит на максимальный размер файла (в том числе для root). Команда ulimit покажет текущий лимит (в 512-байтных блоках, -1 = лимит не установлен), команда ulimit ulimited снимает лимит для текущего окружения. Если нужно убрать лимит “навсегда”, воспользуйтесь smit chuser или отредактируйте файл /etc/security/limit, параметр fsize, для снятия лимита сделайте его равным -1.

 

Q: Как восстановить файл libc.a, который мы случайно удалили?

A: Можно восстановить без перезагрузки и переинсталляции, если есть другая копия

libc.a , которая тоже называется "libc.a". Если вы переместили libc.a в другую директорию, то вам повезло. Сделайте:

export LIBPATH=/other/directory

И ваши последующие команды будут работать. Но если вы переименовали libc.a, это не поможет. Если есть директория, подмонтированная по NFS, то можно поместить libc.a на тот хост, и указать LIBPATH на ту директорию, как показано выше.

Если не помогает, то перезагрузитесь в сервисном режиме и получите приглашение #.

Не надо делать "getrootfs", AIX может начать поиск libc.a на диске, и получите эту же проблему. Надо сделать importvg, varyonvg, и mount /usr куда-нибудь. Затем вручную переместить libc.a назад или скопировать новую с загрузочного носителя.

 

 

Q: Для чего нужна команда lsof?

A: Команды lsof (LiSt Open Files) позволяет определить:
-файлы, которые открыл процесс,
 -процесс, который использует данный сетевой адрес,
 -процессы, которые открыли файлы в файловой системе.
Очень полезная штуковина.

 

 

 

Q: Как сделать файл размером больше 2 Гбайт ?

Используйте файловую систему JFS2 (Enhanced JFS). В ней можно создавать файлы размером до 1Тб. Советуем также проверить лимит на максимальный размер файла (в том числе для root). Команда ulimit покажет текущий лимит (в 512-байтных блоках, -1 = лимит не установлен), команда ulimit ulimited снимает лимит для текущего окружения. Если нужно убрать лимит “навсегда”, воспользуйтесь smit chuser или отредактируйте файл /etc/security/limit, параметр fsize, для снятия лимита сделайте его равным -1.

<!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} p.tx, li.tx, div.tx {mso-style-name:tx; mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:612.0pt 792.0pt; margin:2.0cm 42.5pt 2.0cm 3.0cm; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

 

 

Q: Что нужно знать о работе с лентами?

A: НАСТРОЙКА ЧЕРЕЗ SMIT:

BLOCK size (0=переменная длина)

Устанавливает размер блока на ленте. При чтении размер блока должен быть установлен равным размеру блока во время записи ленты. Если в некоторых командах ленты записывались с ЛЮБЫМ размером блока, то их можно прочитать, установив размер блока = 0 (переменная длина). См. "BLOCK SIZES" ниже.

Использовать DEVICE BUFFERS при записи

Установите ‘yes’. Тогда устройство будет буферизовать данные внутренним образом при операциях записи. Это значительно улучшает производительность, но в некоторых случаях может быть нежелательным, поскольку данные не записываются на ленту до заполнения буфера.

BLOCK SIZES:

В режиме ‘блок переменной длины’ (0) блоки, записанные на ленту, имеют размеры, заданные в запросах к драйверу read() и write(). В этом случае, действительные размеры блоков на ленте могут быть изменены опциями backup-команд (tar -C, cpio -C, backup -C).

В режиме переменной длины запросы read() с большими размерами блока на ленте прочитают данные из следующего блока ленты. Именно эта возможность позволяет читать (командой dd) ленты, записанные с любым размером блока (фиксированным или переменным). Выход команды dd можно передать через конвейер командам restore, tar или cpio. Заметьте, что backup, tar, cpio не могут читать все ленты, используя большой размер блока (так как они предполагают ошибку, если получат короткий блок после read().)

# dd ibs=128k obs=16k if=/dev/rmt0 | ...

На 8мм накопителе применять фиксированный блок не кратный 1Кбайт неэффективно. Он всегда записывает (внутренне) блоками по 1Кбайт. Это моделирует эффект блоков переменной длины. Но, например, применение фиксированного размера блока 512 байт (или используя переменный размер блока и записывая в write() по 512 байт), расходует напрасно половину ленты и дает половину максимальной скорости передачи данных.

Чтобы выяснить реальный размер блока на ленте:

1) Установите переменный размер блока на ленте (0)
2) $ dd if=<tape> of=/tmp/dummy bs=128k count=1
3) $ ls -l /tmp/dummy
4) Длина файла /tmp/dummy = размеру блока на ленте.

ОБМЕН ДАННЫМИ С ДРУГИМИ СИСТЕМАМИ (В ТОМ ЧИСЛЕ И НЕ-UNIX)

Многие ленточные накопители поддерживают блоки и переменной и фиксированной длины. В режиме переменной длины на ленту записываются блоки длиной, указанной в команде записи (tar и backup определяют длину блок в опции -b). В режиме фиксированной длины размеры блоков фиксированы, и все операции записи должны быть кратны фиксированному размеру блока.

Разные версии Unix часто (внутренне) нарезают большие операции чтения/записи на куски (по 65535, 65534, 65532 байт) перед выполнением фактического чтения/записи. Это означает, что чтение/запись 64Kбайт будет разбито на запись 65535 байт и запись длины 1 байт (в фиксированном режиме запись не будет выполнена). По этой причине следует избегать размеры блоков >= 64K (-C128 и больше). AIX не разбивает запросы чтения/записи, но знайте об этой ситуации в других системах.

Если лента записана с неизвестным размером блока, то измените конфигурацию через SMIT (или chdev), чтобы использовать блоки переменной длины. Затем dd с большим размером входного блока, и передайте через pipe команде restore/tar/cpio. Например:

$ chdev -l rmt0 -a block_size=0

$ dd if=/dev/rmt0 ibs=128k obs=16k | tar -tvf-

 

Q: Как выполнить удаленный backup?

A: Несколько способов. Простейший – tar обращается к устройству на другой машине.

$ tar -b1 -cf - . | rsh REMOTEHOST "dd ibs=512 obs=1024 of=/dev/TAPEDEVICE"

Советуем ещё почитать про продукт IBM Tivoli Storage Manager.

 

Q: Как сделать точный дубликат ленты по сети?

A: Если место на диске ограничено (не хотите создавать временный файл), то можно сделать дубликат по сети:

LOCAL=/dev/tape_dev

REMOTE=/dev/tape_dev

# dd if=$LOCAL ibs=64k obs=512 | rsh remote_host dd ibs=512 obs=64k of=$REMOTE

 

Q: Что означает размер блока на ленте = 0 ?

A: Ленточные накопители обычно делятся на 2 вида: c фиксированным и переменным размером блока. 1/4" лента – с фиксированным блоком, 8мм лента – с переменным.

На накопитель с фиксированным блоком ядро всегда посылает данные кусками (lumps) с подходящим размером блока. Изменение размера, передаваемое в write(2) (например, через опцию bs в команде dd), дает ядру больше данных для передачи в поток. На накопителе с переменным блоком ядро записывает на устройство все, что ему передадут. На 8мм накопителе для лучшего использования ленты блоки должны быть кратны 1Кбайт.

Если вы (через SMIT) установите для 1/4" накопителя с переменным блоком размер блока не 0, то AIX будет считать его устройством с фиксированным блоком (даже если это не так). По умолчанию 8мм накопители (как и 1/4") установлены на размер блока 512 байт. Это расточительно, но иначе mksysb and installp не будут работать.

Если установить размер блока = 0, то устройство будет считаться с переменным блоком. И размер блока, передаваемый на запись, становится размером физического блока на ленте. Но (используя разумный размер блока в dd) все должно быть нормально.

 

Q: Как сбросить (reset) зависший ленточный накопитель ?

A: Если процесс, использующий ленту, остановлен, но все еще удерживает ленточный накопитель, то этот процесс нельзя убить никаким сигналом, и накопитель не может использоваться другими процессами без перезагрузки машины. Но следующее может помочь.

В AIX (и в большинстве UNIX-ов) нет функции reset для ленточных накопителей. Но можно послать стандартное SCSI сообщение ‘Cброс устройства на шине’ (BDR =

Bus Device Reset) ленточному накопителю, используя небольшую программу.

Если ленточный накопитель не отвечает на BDR, тогда будет послано сообщение SCSI Bus Reset (это сбросит все устройства на SCSI шине). Сбросы SCSI шины – это крайность, и вы не должны применять эту программу без надобности. Но бывают случаи (например, вставили замятую или старую ленту в 8мм накопитель), когда нет другого пути для сброса накопителя кроме перезагрузки (внешнее устройство можно выключить/включить – и это лучший выбор)

/* taperst: сброс ленточного накопителя, посылая ему сигнал BDR */

#include <stdio.h>

#include <fcntl.h>

#include <errno.h>

#include <sys/scsi.h>

int main(int argc, char **argv)

{ /* Это может быть выполнено только root-ом */

if (argc != 2) {

fprintf(stderr, "Usage: %s /dev/rmt#n", argv[0]); return 1; }

if (openx(argv[1], O_RDONLY, 0, SC_FORCED_OPEN) < 0) {

perror(argv[0]); return 2; }

return 0;

}

 

Q: Как восстановить отдельные файлы с ленты mksysb ?

A: AIX  для записи ленты mksysb использует backup вместо tar.

$ tctl fsf 3

$ restore -xvf /dev/rmt0.1 ./your/file/name
Обратите внимание на то, что надо использовать относительные имена файлов (перед первым / ставьте точку “.”, например, “./etc/inittab” вместо “/etc/inittab”).

Или smit.

 

Q: Как заставить работать накопитель HP 4мм DAT?

A: Для HP25470/80A DDS:

MRS disabled: установить переключатели 3,6,7,8=0 и 1,2,4,5=1

MRS enabled: установить переключатели 3,6,7=0 и 1,2,4,5,8=1

 

Q: Как копировать ленты DAT ?

A: Если у вас 2 накопителя, то командой tcopy(1). Иначе традиционный подход:

$ dd if=/dev/rmt0 bs=1024b | dd of=/dev/rmt1 bs=1024b

Для копирования нескольких файлов, поместите эту строку в цикл while, указав накопитель без перемотки (/dev/rmt0.1). Для использования накопителей с 2-х машин или получите GNU-й dd (соединенный с GNU-м tar), или используйте что-то вроде:

$ dd if=/dev/rmt0 bs=1024b | rsh hostname dd of=/dev/rmt0 bs=1024b

 

Q: Как ускорить backup-ы на DLT-лентах ?

A: DLT-лентам нужны высокие скорости передачи данных,  чтобы они оставались в поточном режиме. Для этого нужно установить режим блоков переменной длины (фиксированный размер блока = 0). Также надо установить размер буфера примерно 64Kбайт для backup (или 128 блоков для tar).

 

 

Q: Как восстановить удаленные файлы?

A: Самый простой, надёжный и единственно верный способ – с резервных копий (backup) файла, файловой системы или группы томов. Резервная копия должна быть, а всё, что удалено – то удалено. И точка.

Если копий нет, то можно найти/купить утилиту для восстановления файлов. Например, на http://www.compunix.com/ есть программа (работает под SMIT-ом) для всех версий AIX. Evaluation-версия покажет список удаленных файлов, которые можно восстановить, купив полную версию.

Отчаянные, отчаявшиеся, безрассудные, отъявленные и просто отпетые читают дальше.

Детально изучите утилиту fsdb и архитектуру файловой системы AIX. (Безумству храбрых … Не знаем, не проверяли. НИКАКИХ ГАРАНТИЙ!)

Если файл удалён, то блоки файловой системы, принадлежавшие файлу, все еще существуют, но уже не распределены для этого файла. Пока в этой файловой системе не создаются новые файлы, а старые не растут, эти блоки будут оставаться нетронутыми. Можно попытаться перераспределить блоки ‘предыдущему' файлу командой ‘fsdb’ (filesystem debugger).

СДЕЛАЙТЕ BACKUP ВСЕЙ ФАЙЛОВОЙ СИСТЕМЫ ДО !!!

Шаги для восстановления файла (ПРИМЕР ДЛЯ ФАЙЛОВОЙ СИСТЕМЫ JFS):

1) # ls -id {dir} - где dir – директория, где размещался файл). Запишите номер INODE

2) Размонтировать файловую систему
#  umount /{Mountpoint}
3) # fsdb /{Mountpoint} или

# fsdb /dev/{LVname} - где Mountpoint – точка монтирования файловой системы,

LVname – имя логического тома файловой системы)

4) ‘{INODE}i’ (где INODE - номер inode из шага #1)

Это даст информацию об inode для директории. Поле ‘a0’ содержит номер блока директории. Следующие шаги предполагают, что используется только одно поле ‘a0’. Если значение появляется в ‘a1’, и т.д., возможно понадобится повторить шаги #5, #6 для каждого блока, пока не найдем файл, который надо восстановить.

5) ‘a0b’ (перемещает к блоку, на который указывает поле ‘a0’ этого inode)

6) ‘p128c’ (печатает 128 байт директории в символьном формате)

Поищите там имя файла. Если его нет, повторите этот шаг, пока не найдете. Запишите адрес, где начинается имя файла. Также запишите адрес, где начинается предшествующее (PRIOR) имя файла. Если так и не нашли имя файла, то вернитесь к шагу #5 и выберите ‘a1b’, ‘a2b’, и т.д.

Заметьте, что адрес 1-го поля показан сдвинутым влево. Сделайте нкремент (добавьте по 1) адреса для каждой позиции вправо (в 8-ичной системе).

7) ‘a0b’ (перемещает к блоку, на который указывает поле ‘a0’ этого inode)

Если имя файла найдено в блоке 1, используйте ‘a1b’ и т.д.

8) ‘p128e’ (печатает 128 байт директории в формате слова, в 10-ичной системе). Найдите адрес файла для восстановления (как записано в шаге #6) в крайней левой колонке. Если адрес не найден, повторите, пока не найдете.

9) Запишите адрес файла, который появился непосредственно перед файлом, который хотите восстановить.

10) Найдите адрес (ADDRESS) поля длина записи (record LENGTH field) для файла в шаге #9, предполагая формат:

{ADDRESS}: x x x x x x x x x x ...

| | | | |-------- filename ------|

inode # --+----+ | |

| +-- filename length

record LENGTH --+

Заметьте, что номер inode может начинаться в любой позиции строки, и что каждое число представляется 2-мя байтами. Поэтому адрес поля LENGTH будет

‘{ADDRESS} + (#hops * 2) +1’

11) Начиная от 1-го слова в номере inode, считайте в 8-ичной системе, пока не достигнете номера inode восстанавливаемого файла, предполагая каждое слово 2-байтным.

12) ‘0{ADDRESS}B={BYTES}’

(где ADDRESS – адрес поля длины записи (record LENGTH field), найденный в шаге #10, и BYTES – число байт (в 8-ичной системе), подсчитанное в шаге #11)

13) Если значение, найденное в поле LENGTH в шаге #10 больше 255, введите:

‘0{ADDRESS-1}B=0’ где ADDRESS-1 это ADDRESS из шага #10 -1. Это нужно, чтобы очистить 1-й байт слова.

14) ‘q’ (выход из fsdb)

15) # fsck {Mountpoint} или # fsck /dev/{LVname}

Эта команда выдаст ошибки для каждого восстановленного файла с запросами, хотите ли вы удалить файл. Ответьте ‘n’ на все запросы. Для каждого перечисленного файла запишите связанный номер INODE.

16) # fsdb /{Mountpoint} или # fsdb /dev/{LVname}

17) {BLOCK}i.ln=1 (где BLOCK – номер блока из шага #15). Это изменит счетчик ссылок (link) для inode, связанного с восстанавливаемым файлом. Повторите этот шаг для каждого файла, перечисленного в шаге step #15.

18) ‘q’ (выход из fsdb)

19) # fsck {Mountpoint} или # fsck /dev/{LVname}

Больше не должно появляться запросов REMOVE. Ответьте ‘y’ на все вопросы, имеющие отношение к восстановлению карты расположения блоков, inode и/или суперблока (fixing the block map, inode map, and/or superblock).

А лучше всего – иметь резервную копию.

 

 

Оставьте комментарий