15

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

Сначала я попробовал проверить с помощью smartmontools ... Мой жесткий диск Seagate сообщает об одном текущем незавершенном секторе и одном офлайновом недоступном для исправления (предположительно, тот же самый). Количество перераспределенных секторов равно нулю.

5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
...
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       1
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       1

Однако самотестирование SMART (короткое, длинное, автономное, транспортировка) не обнаружило ошибок

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%      6631         -
# 2  Conveyance offline  Completed without error       00%      6630         -
# 3  Extended offline    Completed without error       00%      6622         -
# 4  Short offline       Completed without error       00%      6600         -
# 5  Extended offline    Completed without error       00%      6632         -

Я также попытался запустить badblocks -wsv(полный проходной тест чтения-записи 4) на диске, и плохие блоки не были найдены. Затем я последовал руководству (насколько это было возможно, поскольку я удалил свою файловую систему после запуска badblocks), найденному здесь: http://smartmontools.sourceforge.net/badblockhowto.html

Там написано, что если я перезаписываю сектор всеми нулями, диск должен переместить (перераспределить) ожидающий сектор. Шаблон последней записи Badblocks - все нули, так что следовало бы это сделать. однако ничего не изменилось, у меня все еще есть ожидающий сектор подсчет 1.
Затем я попытался выяснить, какой сектор является проблемным, и в выводе SMART есть журнал ошибок:

Error 2 occurred at disk power-on lifetime: 5344 hours (222 days + 16 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 7c 1b 1a 02 ae  Error: ABRT at LBA = 0x0e021a1b = 235018779

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  20 20 7f 18 1a 02 ae 00      00:09:05.228  READ SECTOR(S)
  20 20 01 17 1a 02 ae 00      00:09:05.228  READ SECTOR(S)
  20 20 01 01 00 00 a0 00      00:08:59.830  READ SECTOR(S)
  91 20 3f 01 00 00 af 00      00:08:59.826  INITIALIZE DEVICE PARAMETERS [OBS-6]
  10 20 01 01 00 00 a8 00      00:08:59.678  RECALIBRATE [OBS-4]

Error 1 occurred at disk power-on lifetime: 5009 hours (208 days + 17 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 b7 8c 02 e0  Error: UNC at LBA = 0x00028cb7 = 167095

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  25 20 1e 9e 8c 02 e0 00      00:02:20.691  READ DMA EXT
  25 20 1e 80 8c 02 e0 00      00:02:20.691  READ DMA EXT
  25 20 1e 62 8c 02 e0 00      00:02:20.690  READ DMA EXT
  25 20 1e 44 8c 02 e0 00      00:02:20.690  READ DMA EXT
  25 20 1e 26 8c 02 e0 00      00:02:20.690  READ DMA EXT

Таким образом, по-видимому, диск имел две ошибки.

84 51 7c 1b 1a 02 ae  Error: ABRT at LBA = 0x0e021a1b = 235018779

а также

40 51 00 b7 8c 02 e0  Error: UNC at LBA = 0x00028cb7 = 167095

Итак, я предположил, что это номера секторов: 167095 и 235018779. И я попытался написать нули с помощью dd:

dd if=/dev/zero of=/dev/sda bs=512 count=1 seek=167095

Теперь это хорошо. Однако, когда я попробовал с другим сектором:

dd if=/dev/zero of=/dev/sda bs=512 count=1 seek=235018779

Я получаю дд: '/dev/sda': не могу искать: неверный аргумент. Затем я заметил, что мой жесткий диск имеет только 234441658 секторов. Так что это вне диапазона. Но тогда почему SMART сообщил об ошибке по этому адресу ?!

Может ли кто-нибудь помочь мне понять это, а также посоветовать мне, как сделать это правильно, если я делаю это неправильно? Я подозреваю, что, возможно, я ошибаюсь при использовании блока 512 с dd. Это размер сектора, о котором сообщает SMART. возможно, эти адреса LBA являются байтами, а не блоками. Я попытался установить bs = 1 и записать только один байт в эти адреса на жестком диске. Это сработало (процесс записи dd)… Однако число ожидающих секторов после этого не изменилось. Я также вызвал sync и smartctl -t offline /dev /sda, чтобы попытаться «заставить» диск перераспределить сектор. Ничего такого...

Вот мой полный вывод smartctl --all /dev /sda :

smartctl 5.43 2012-06-30 r3573 [i686-linux-2.6.32-358.el6.i686] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Model Family:     Seagate Barracuda 7200.9
Device Model:     ST3120811AS
Serial Number:    6PT1N4VZ
Firmware Version: 3.AAE
User Capacity:    120,034,123,776 bytes [120 GB]
Sector Size:      512 bytes logical/physical
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   7
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Mon Nov 18 12:03:00 2013 UTC
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x82) Offline data collection activity
                    was completed without error.
                    Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0) The previous self-test routine completed
                    without error or no self-test has ever 
                    been run.
Total time to complete Offline 
data collection:        (  430) seconds.
Offline data collection
capabilities:            (0x5b) SMART execute Offline immediate.
                    Auto Offline data collection on/off support.
                    Suspend Offline collection upon new
                    command.
                    Offline surface scan supported.
                    Self-test supported.
                    No Conveyance Self-test supported.
                    Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                    power-saving mode.
                    Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                    General Purpose Logging supported.
Short self-test routine 
recommended polling time:    (   1) minutes.
Extended self-test routine
recommended polling time:    (  51) minutes.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   084   077   006    Pre-fail  Always       -       185600113
  3 Spin_Up_Time            0x0003   095   095   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   098   098   020    Old_age   Always       -       2185
  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   073   055   030    Pre-fail  Always       -       25890559714
  9 Power_On_Hours          0x0032   093   093   000    Old_age   Always       -       6632
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   098   098   020    Old_age   Always       -       2229
187 Reported_Uncorrect      0x0032   099   099   000    Old_age   Always       -       1
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   071   056   045    Old_age   Always       -       29 (Min/Max 25/29)
194 Temperature_Celsius     0x0022   029   044   000    Old_age   Always       -       29 (0 13 0 0 0)
195 Hardware_ECC_Recovered  0x001a   052   046   000    Old_age   Always       -       194244099
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       1
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       1
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x0000   100   253   000    Old_age   Offline      -       0
202 Data_Address_Mark_Errs  0x0032   066   219   000    Old_age   Always       -       34

SMART Error Log Version: 1
ATA Error Count: 2
    CR = Command Register [HEX]
    FR = Features Register [HEX]
    SC = Sector Count Register [HEX]
    SN = Sector Number Register [HEX]
    CL = Cylinder Low Register [HEX]
    CH = Cylinder High Register [HEX]
    DH = Device/Head Register [HEX]
    DC = Device Command Register [HEX]
    ER = Error register [HEX]
    ST = Status register [HEX]
Powered_Up_Time is measured from power on, and printed as
DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,
SS=sec, and sss=millisec. It "wraps" after 49.710 days.

Error 2 occurred at disk power-on lifetime: 5344 hours (222 days + 16 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 7c 1b 1a 02 ae  Error: ABRT at LBA = 0x0e021a1b = 235018779

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  20 20 7f 18 1a 02 ae 00      00:09:05.228  READ SECTOR(S)
  20 20 01 17 1a 02 ae 00      00:09:05.228  READ SECTOR(S)
  20 20 01 01 00 00 a0 00      00:08:59.830  READ SECTOR(S)
  91 20 3f 01 00 00 af 00      00:08:59.826  INITIALIZE DEVICE PARAMETERS [OBS-6]
  10 20 01 01 00 00 a8 00      00:08:59.678  RECALIBRATE [OBS-4]

Error 1 occurred at disk power-on lifetime: 5009 hours (208 days + 17 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 b7 8c 02 e0  Error: UNC at LBA = 0x00028cb7 = 167095

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  25 20 1e 9e 8c 02 e0 00      00:02:20.691  READ DMA EXT
  25 20 1e 80 8c 02 e0 00      00:02:20.691  READ DMA EXT
  25 20 1e 62 8c 02 e0 00      00:02:20.690  READ DMA EXT
  25 20 1e 44 8c 02 e0 00      00:02:20.690  READ DMA EXT
  25 20 1e 26 8c 02 e0 00      00:02:20.690  READ DMA EXT

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%      6631         -
# 2  Conveyance offline  Completed without error       00%      6630         -
# 3  Extended offline    Completed without error       00%      6622         -
# 4  Short offline       Completed without error       00%      6600         -
# 5  Extended offline    Completed without error       00%      6632         -

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

ОБНОВИТЬ:

Как и предполагалось в ответе от rob, я попытался перезаписать весь жесткий диск нулями. Проверил значения SMART, а затем начал читать весь жесткий диск. Снова проверил SMART значения. Результат: значения SMART, относящиеся к числу ожидающих / перераспределенных секторов, не меняются, в обоих случаях, сразу после записи и затем после чтения. Перераспределено 0. В ожидании 1.

2 ответа2

15

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

Когда вы запускаете badblocks -w , каждый шаблон сначала пишется, а затем читается. Возможно, что запись в нестабильный сектор завершится успешно, но последующее чтение завершится неудачно, что снова добавит его в список ожидающих секторов. Я бы попытался записать нули на весь диск с помощью dd if=/dev/zero of=/dev/sda , проверить состояние SMART, затем прочитать весь диск с помощью dd if=/dev/sda of=/dev/null и проверить снова СМАРТ-статус.

Обновить:

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

Давайте рассмотрим описание текущего ожидающего подсчета секторов:

Количество "нестабильных" секторов (ожидающих повторного отображения из-за неисправимых ошибок чтения). Если впоследствии нестабильный сектор читается успешно, сектор перераспределяется, и это значение уменьшается. Ошибки чтения в секторе не будут переназначать сектор немедленно (так как правильное значение не может быть прочитано, и поэтому значение для переназначения неизвестно, а также оно может стать читаемым позже); вместо этого микропрограмма привода запоминает, что сектор необходимо переназначить, и переназначит его при следующей записи. [29] Однако некоторые диски не будут немедленно переназначать такие сектора при записи; вместо этого накопитель сначала попытается выполнить запись в проблемный сектор, и если операция записи будет успешной, сектор будет помечен как исправный (в этом случае "Счет событий перераспределения" (0xC4) не будет увеличен). Это серьезный недостаток, поскольку, если такой диск содержит маргинальные сектора, которые постоянно выходят из строя только после того, как прошло некоторое время после успешной операции записи, то диск никогда не переназначит эти проблемные сектора.

Теперь давайте рассмотрим важные моменты:

... микропрограмма привода запоминает, что сектор необходимо переназначить, и переназначит его при следующей записи. [29] Однако некоторые диски не будут немедленно переназначать такие сектора при записи; вместо этого накопитель сначала попытается выполнить запись в проблемный сектор, и если операция записи будет успешной, сектор будет помечен как исправный.

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

  1. Запись не удалась, и в этом случае ожидающий сектор должен был быть переназначен.
  2. Запись успешно завершена, и в этом случае ожидающий сектор должен быть очищен ("отмечен как хороший").

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

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

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

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

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

e2fsck -l имя файла

Добавьте номера блоков, указанные в файле, указанном в filename, в список плохих блоков. Формат этого файла совпадает с форматом, сгенерированным программой badblocks(8). Обратите внимание, что номера блоков основаны на размере блоков файловой системы. Следовательно, badblocks(8) должен иметь размер блока файловой системы для получения правильных результатов. В результате намного проще и безопаснее использовать опцию -c для e2fsck, поскольку это обеспечит передачу правильных параметров в программу badblocks.

(Обратите внимание, что e2fsck -c предпочтительнее, чем e2fsck -l filename , и вы, возможно, даже захотите попробовать его, но, основываясь на ваших результатах, я очень сомневаюсь, что e2fsck -c найдет какие-либо поврежденные блоки.)

Конечно, вам придется выполнить некоторую арифметику, чтобы преобразовать LBA неисправного сектора (как предусмотрено SMART) в номер блока файловой системы. The Bad Blocks HowTo предоставляет удобную формулу:

  b = (int)((L-S)*512/B)
where:
b = File System block number
B = File system block size in bytes
L = LBA of bad sector
S = Starting sector of partition as shown by fdisk -lu
and (int) denotes the integer part.

HowTo также содержит полный пример с использованием этой формулы. После установки ОС вы можете проверить, занимает ли файл нестабильный сектор, используя debugfs (подробные инструкции см. В HowTo).

Другой вариант: разделить на части вокруг предполагаемого плохого блока. При установке ОС вы также можете попытаться разделить ошибки. Если я правильно выполнил арифметику, ошибка будет около 81,589 МБ, поэтому можно либо сделать / загрузить немного меньше и запустить следующий раздел после сектора 167095, либо пропустить первые 82 МБ или около того полностью.

ABRT 235018779 К сожалению, что касается ошибки ABRT в секторе 235018779, мы можем только предполагать, но спецификация ATA8-ACS дает нам некоторые подсказки.

Из рабочего проекта приложения AT 8 - Набор команд ATA/ATAPI (ATA8-ACS):

6.2.1 Ошибка отмены (ABRT), бит 2. Abort должен быть установлен в единицу, если команда не поддерживается. Abort может быть установлен в единицу, если устройство не может выполнить действие, запрошенное командой. Прерывание также должно быть установлено равным единице, если запрашивается адрес вне диапазона доступных пользователю адресов, если IDNF не установлен на единицу.

Рассматривая команды, ведущие к ABRT (несколько READ SECTOR (S) с последующей калибровкой и повторной инициализацией) ...

Abort должен быть установлен в единицу, если команда не поддерживается. - Это кажется маловероятным.

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

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

На тот случай, если вы еще не устали проводить диагностику ...

Вы можете попробовать smartctl -t long /dev/sda раз, чтобы увидеть, не вызывает ли она больше ошибок в журнале SMART, или вы можете оставить это как нерешенный X-файл ;) и периодически проверять журнал SMART, чтобы увидеть, происходит ли это снова. В любом случае, если вы продолжаете использовать диск, не переставляя или не перераспределяя ожидающий сектор, вы уже рискуете.

Используйте контрольную файловую систему

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

4

Статья Bad Sector Remapping дает используемый алгоритм.

На жестком диске есть два списка дефектов:

  • P-list - это дефекты, обнаруженные при изготовлении, а также известные как первичные дефекты. Они последовательно следуют за нормальными секторами. Плохой сектор будет указывать на его замену с использованием номера смены (сначала +1, затем +2 и т.д.).
  • G-List - это дефекты, которые возникают при нормальном использовании накопителя и известны как «Выросшие дефекты». Нет никаких ограничений на их распределение, и они не должны последовательно следовать дефектам P-списка. Плохой сектор укажет на его замену, используя простой номер сектора.

Следовательно, тот факт, что ваш плохой сектор на 577121 секторов превышает нормальный последний сектор, не означает, что у вас есть 577121 поврежденных секторов, если только это не дефект P-списка. Дефект G-списка может быть размещен где угодно, поэтому вполне возможно, что встроенное ПО выделит его в конце свободного пространства сектора.

Из википедии Известные атрибуты ATA SMART :

Количество перераспределенных секторов

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

Текущий счетчик ожидающих секторов

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

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

Документ MHDD Средство диагностики очень низкого уровня жесткого диска объясняет коды ошибок как:

UNC : data is uncorrectable
ABRT : command was aborted

Таким образом, сектор 167095 неисправим, и чтение / запись в 235018779 была прервана.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .