LINUX.ORG.RU

Проблема с хардом. Не могу прочитать каталог.


0

0

Домашняя файлопомойка. Один из дисков.

$raidho athost # fdisk /dev/sdb -l

Диск /dev/sdb: 500.1 ГБ, 500107862016 байт
255 heads, 63 sectors/track, 60801 cylinders
Units = цилиндры of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00091741

Устр-во Загр Начало Конец Блоки Id Система
/dev/sdb1 * 1339 60801 477636547+ 83 Linux
/dev/sdb2 1 1338 10747453+ 5 Расширенный
/dev/sdb5 1 1275 10241374+ 83 Linux
/dev/sdb6 1276 1338 506016 82 Linux своп / Solaris


Один из разделов /dev/sdb1 смонтирован в каталог /share/store

UUID=4ebd8d28-7471-423d-b8b5-97269b56a2f4 /share/store ext3 relatime 0 2

$raidho athost # ll /share/store/
итого 230532
drwxrwxrwx 2 nobody nogroup 4096 2009-07-25 15:19 library
drwx------ 2 root root 16384 2009-01-13 15:28 lost+found
drwxr-xr-x 27 athost athost 235790336 2009-08-06 09:42 otstoinik
drwxrwxrwx 2 nobody nogroup 4096 2009-07-17 19:53 pvrdata
drwxrwxrwx 2 athost athost 4096 2009-07-17 15:51 temp
drwxrwxrwx 2 nobody nogroup 4096 2009-07-20 23:09 Thumbs
drwxr-xr-x 4 athost athost 4096 2009-05-14 13:31 torrent

С утра обнаружил, что не могу прочитать содержимое каталога otstoinik, в котором валяется всякое скачанное кино и с которым работает торрент.
Выражается это в том, что при попытке зайти в этот каталог mc или прочитать содержимое ls они виснут.

Отмонтировал, прогнал fsck /dev/sdb1
Долго шуршало, результат нулевой.

Parted выдает вот такую шнягу:

$raidho athost # parted /dev/sdb
GNU Parted 1.8.8
Использование /dev/sdb
Добро пожаловать в GNU Parted! Наберите 'help' для получения списка команд.
(parted) print
Модель: ATA WDC WD5000AAKS-2 (scsi)
Диск /dev/sdb: 500GB
Размер сектора (логический/физический): 512B/512B
Таблица разделов: msdos

Error during translation: Invalid or incomplete multibyte or wide character



Извечный вопрос "Что делать?"



★★★★★

Да, df вроде правильный размер показывает

$raidho athost # df -h /dev/sdb1
Файловая система Разм Исп Дост Исп% смонтирована на
/dev/sdb1 449G 401G 25G 95% /share/store

athost ★★★★★
() автор топика

> Error during translation: Invalid or incomplete multibyte or wide character

Похоже просто проблема с локализацией parted. Перед запуском попробуй сделать export LANG=C или export LC_ALL=C.

> Извечный вопрос "Что делать?"


В dmesg есть что-нибудь? Что говорит smartctl по поводу этого диска? Тестировал на бед-блоки с помощью badblocks?

Deleted
()
Ответ на: комментарий от Deleted

>> Error during translation: Invalid or incomplete multibyte or wide character

> Похоже просто проблема с локализацией parted. Перед запуском попробуй сделать export LANG=C или export LC_ALL=C.


Естественно, проблему с диском это не исправит. Просто интерфейс parted'а будет на английском и не будут выдаваться ошибки по поводу кривого перевода.

Deleted
()
Ответ на: комментарий от Deleted

> LANG=C

Угу. Спасибо.

(parted) print
Model: ATA WDC WD5000AAKS-2 (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number Start End Size Type File system Flags
2 32.3kB 11.0GB 11.0GB extended
5 64.5kB 10.5GB 10.5GB logical ext3
6 10.5GB 11.0GB 518MB logical linux-swap
1 11.0GB 500GB 489GB primary ext3 boot

Озадачено чешу репу... С чего это проблемный раздел стал загрузочным, если / и /boot/ на sdb5

athost ★★★★★
() автор топика
Ответ на: комментарий от athost

> Озадачено чешу репу... С чего это проблемный раздел стал загрузочным, если / и /boot/ на sdb5

А, там grub, наверное, стоит.

Млять, как хреново утро началось.

athost ★★★★★
() автор топика
Ответ на: комментарий от Deleted

> В dmesg есть что-нибудь? Что говорит smartctl по поводу этого диска? Тестировал на бед-блоки с помощью badblocks?

В dmesg пусто, кроме

[ 9214.142005] EXT3 FS on sdb1, internal journal
[ 9214.142020] EXT3-fs: mounted filesystem with ordered data mode.

smart вроде тоже нормальный (диск практически новый), только вот это мне не понравилось:

UDMA_CRC_Error_Count 0x0032 200 200 000 Old_age Always - 19764


athost ★★★★★
() автор топика
Ответ на: комментарий от athost

> UDMA_CRC_Error_Count 0x0032 200 200 000 Old_age Always - 19764

Попробуй сменить шлейф. Больше ничего в голову не приходит.

Deleted
()
Ответ на: комментарий от Deleted

Пробовал, и в десктоп уже втыкать пробовал. Те же яйца:(

athost ★★★★★
() автор топика

> не могу прочитать содержимое каталога otstoinik, в котором валяется всякое скачанное кино и с которым работает торрент.

в зависимости от настроек твоего торрент-клиента, скаченные файлы могут быть ДИКО зафрагментированны. Решается только "cp -r otstoinik otstoinik1; rm -fr otstoinik; mv otstoinik1 otstoinik". Копирование будет очень медленным, и диск будет страшно шуршать и греться (у меня копирование таких торрентов идёт в среднем со скоростью 100Mb/min).

pupok ★★
()
Ответ на: комментарий от pupok

Еще вчера вечером я из этого каталога кино смотрел и читался он абсолютно без тормозов.

athost ★★★★★
() автор топика
Ответ на: комментарий от athost

Попробуй badblocks -s /dev/sdb1. Если чтение пройдёт без ошибок, то виноват не диск, а ФС. Если ошибки будут - виноват диск, в этом случае лучше попробовать скопировать весь раздел куда-нибудь на другой диск, чтобы потом можно было вытащить файлы (если совсем помрёт).

Deleted
()

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

Получается, что я их посмотреть на телеке могу, а переписать или удалить -- нет:)))

Как достать инфу?

athost ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Нет бедов. Понятно, что ошибка ФС и именно на этом каталоге, правда, этот каталог 99% раздела занимает.

athost ★★★★★
() автор топика
Ответ на: комментарий от athost

> Нет бедов. Понятно, что ошибка ФС и именно на этом каталоге, правда, этот каталог 99% раздела занимает.

Попробуй отмонтировать раздел и пройтись по нему fsck.ext3 -fv /dev/чтотамутебя.

Deleted
()
Ответ на: комментарий от Deleted

> Попробуй отмонтировать раздел и пройтись по нему fsck.ext3 -fv /dev/чтотамутебя.

Только не факт, что после этого сможешь вытащить оттуда данные. Так что если есть возможность - сделай полный бэкап раздела. Собственно если сделаешь бэкап, то можно экспериментировать уже с ним, а не с диском.

Deleted
()
Ответ на: комментарий от Deleted

> Попробуй отмонтировать раздел и пройтись по нему fsck.ext3 -fv /dev/чтотамутебя.

Да именно это я и делал с самого начала.

Вообще-то файлы из каталога копируются, если указать полный путь с именем файла.

athost ★★★★★
() автор топика
Ответ на: комментарий от athost

Т.е. в конечном итоге не работает только ls на данный каталог.

athost ★★★★★
() автор топика
Ответ на: комментарий от crick

> strace bash -c 'cd otstoinik' может что выплюнет интересное

тогда уж strace bash -c 'ls'
зацикливается на этом:

getdents(3, /* 85 entries */, 4096) = 4080
getdents(3, /* 85 entries */, 4096) = 4080
getdents(3, /* 85 entries */, 4096) = 4080
getdents(3,




athost ★★★★★
() автор топика
Ответ на: комментарий от athost

> Вообще-то файлы из каталога копируются, если указать полный путь с именем файла.

Хм... Может это бага в ls?

Deleted
()
Ответ на: комментарий от athost

> getdents(3, /* 85 entries */, 4096) = 4080
> getdents(3, /* 85 entries */, 4096) = 4080

> getdents(3, /* 85 entries */, 4096) = 4080

> getdents(3,


Strace это выводит и останавливается (зависает) или постоянно срёт такими сообщениями? И сколько в этой директории файлов?

Deleted
()
Ответ на: комментарий от Deleted

Срет не останавливаясь.

В каталоге приблизительно 300-400 файлов.

athost ★★★★★
() автор топика
Ответ на: комментарий от Deleted

> И попробуй ls -f1 /path/to/buggy/dir/.

Тоже самое, просто команда висит, strace выдает туже срань не переставая.

athost ★★★★★
() автор топика
Ответ на: комментарий от Deleted

> А ls из поставки busybox? Зайди в шелл бизибокса (bb) и сделай ls оттуда.

Да, не, это не ls.

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

athost ★★★★★
() автор топика
Ответ на: комментарий от athost

> Без изменений.

Тоже виснет? Вот же фигня то... ИМХО всё-таки что-то повредилось в структуре ФС...

Deleted
()
Ответ на: комментарий от Deleted

> ИМХО всё-таки что-то повредилось в структуре ФС...

Да, понятно это. Как исправить-то, вот в чем вопрос.

athost ★★★★★
() автор топика
Ответ на: комментарий от athost

> Да, понятно это. Как исправить-то, вот в чем вопрос.

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

Deleted
()
Ответ на: комментарий от Deleted

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

Это очень трудоемкий процесс. Хочется так "раз" и кривой каталог поправил:)

athost ★★★★★
() автор топика
Ответ на: комментарий от athost

> Опять же причина непонятна, а это не есть хорошо.

Тогда:
1. Создать образ раздела;
2. Удалить с него всё по максисмуму, кроме проблемного каталога;
3. "Обнулить" все файлы внутри каталога (если это конечно _не_ решит проблему), чтобы они не занимали место;
4. Сжать полученный образ;
5. Отправить его в LKML и лично вот этому чуваку: http://en.wikipedia.org/wiki/Theodore_Ts%27o, пусть разбираются что могло к такому привести.

И кстати, ты пробовал обновлять/откатывать ядро и e2fsprogs?

Deleted
()
Ответ на: комментарий от athost

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

А так размер каталога "235790336" байт как бы намекает, что у вас там до одного места файлов. Посмотрите, "strace -v ls", там будут видны имена файлов, может поможет.

mky ★★★★★
()
Ответ на: комментарий от Deleted

Спасибо за помощь.

Пока оставлю все как есть.

athost ★★★★★
() автор топика
Ответ на: комментарий от mky

> Весело, значит ls всегда хочет прочитать все имена файлов из каталога сохраняя их в память и только потом их выводить на экран. Надо будет запомнить.

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

> А так размер каталога "235790336" байт как бы намекает, что у вас там до одного места файлов. Посмотрите, "strace -v ls", там будут видны имена файлов, может поможет.


Автор сказал, что у него в той директории всего ~400 файлов. День назад всё работало, так что не думаю что файлы там успели расплодиться.

Я абсолютно не знаю структуру ext3, но мне почему-то кажется, что список айнодов файлов в директории каким-то образом "зациклился" и getdents постоянно ходит по кругу.

Deleted
()
Ответ на: комментарий от mky

> Посмотрите, "strace -v ls", там будут видны имена файлов, может поможет.

Непереставая вываливает вот такое:

_reclen=48, d_name=".directory.lock.aKhz56"} {d_ino=11439183, d_off=72449835, d_reclen=48, d_name=".directory.lock.UiUk56"} {d_ino=12901464, d_off=72450191, d_reclen=48, d_name=".directory.lock.JXov56"} {d_ino=14600354, d_off=72451049, d_reclen=48, d_name=".directory.lock.zmtH56"} {d_ino=12141602, d_off=72451317, d_reclen=48, d_name=".directory.lock.XWTp56"} {d_ino=13788577, d_off=72451513, d_reclen=48, d_name=".directory.lock.CbFB56"} {d_ino=12433469, d_off=72451621, d_reclen=48, d_name=".directory.lock.OTXr56"} {d_ino=9828422, d_off=72451647, d_reclen=48, d_name=".directory.lock.gAw656"} {d_ino=11347966, d_off=72452616, d_reclen=48, d_name=".directory.lock.Lwmk56"} {d_ino=11443172, d_off=72452666, d_reclen=48, d_name=".directory.lock.FHVk56"} {d_ino=13045665, d_off=72453053, d_reclen=48, d_name=".directory.lock.Ooqw56"} {d_ino=13814739, d_off=72453338, d_reclen=48, d_name=".directory.lock.IKOB56"} {d_ino=10288398, d_off=72453402, d_reclen=48, d_name=".directory.lock.zEKc56"}},

athost ★★★★★
() автор топика
Ответ на: комментарий от athost

ИМХО, ваша torrent качалка сошла с ума. Убейте её, запустите как советовали "ls -f1" и подождите, допустим 1 час (вывод ls можно перенаправить в файл). А потом надо перемещать нужные файлы из этого каталога и делать "rm -rf otstoinik". Интерестно, у вас иноды на этом диске остались?

235790336 / 48 = 4912298 файлов в каталоге?

mky ★★★★★
()
Ответ на: комментарий от Deleted

200 Метров то не лишнии, удалив файлы из каталога мы не освободим место, занятое самим каталогом. Во всяком случае раньше было так. Поэтом каталог лучше удалять. Правда не знаю, rm -rf удаляет файлы по мере их чтения с помощью getdents() или, аналогично ls, сначала будет создавать список в памяти.

mky ★★★★★
()
Ответ на: комментарий от mky

> 200 Метров то не лишнии, удалив файлы из каталога мы не освободим место, занятое самим каталогом.

Зато ls не будет давиться списком файлов =).

Deleted
()
Ответ на: комментарий от mky

> запустите как советовали "ls -f1" и подождите, допустим 1 час

Спасибо за помощь. Буду пробовать.

athost ★★★★★
() автор топика
Ответ на: комментарий от athost

> Буду пробовать.

Попробуй вычистить хлам из директории такой командой:

find /path/to/dir/ -name .directory.lock.\* -exec rm -v '{}' \;

Deleted
()
Ответ на: комментарий от Deleted

> find /path/to/dir/ -name .directory.lock.\* -exec rm '{}' \;

как "ls -f1" через 10 минут работы дохнут то нехватки памяти.

athost ★★★★★
() автор топика
Ответ на: комментарий от athost

Погоди до вечера, я дома попробую написать простую программу-чистилку =).

Deleted
()
Ответ на: комментарий от athost

Дак дайте им свопа :)

Вот код на Си, который чистит заданный каталог от файлов вида ".directory.lock.*".
Запишите его в файл cld.c, потом "gcc cld.c -o cld", потом "./cld /share/store/otstoinik"
--------------------------------------
#include <unistd.h>                                                             
#include <sys/types.h>                                                          
#include <dirent.h>                                                             
#include <string.h>                                                             
#include <stdio.h>                                                              
                                                                                
int main(int argc, char *argv[]){                                               
    DIR *d;                                                                    
    struct dirent *dpt;                                                                                                                                        

                                                                                    if ( argc < 2 || chdir(argv[1]) ) return 1;                                 
    if ( (d = opendir("./")) == NULL ) return 2;                                
    while ( (dpt = readdir(d)) != NULL ) {                                      
        fputs(dpt->d_name, stdout);                                             
        if ( !memcmp(".directory.lock.", dpt->d_name, 16))                      
            if ( !unlink(dpt->d_name) )                                         
                fputs( " : removed", stdout);                                   
         fputs( "\n", stdout);                                                  
    }                                                                           
    return 0;                                                                   
}
--------------------------------------
P.S. Надеюсь у вас установлен gcc
P.P.S. GPLv3, никакой гарантии.

mky ★★★★★
()
Ответ на: комментарий от mky

Чего то криво запостилось. В том смысле, что куча пробелов перед "if ( argc < 2 ..." совершенно лишнии.

mky ★★★★★
()
Ответ на: комментарий от mky

> Вот код на Си, который чистит заданный каталог от файлов вида ".directory.lock.*".

+1, я то же самое хотел написать. Но пришёл домой и лёг спать =).

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.