[sisyphus] Как установить GRUB?
Sergey Vlasov
=?iso-8859-1?q?vsu_=CE=C1_altlinux=2Eru?=
Ср Апр 23 21:57:20 MSD 2008
On Sat, Apr 19, 2008 at 12:05:18AM +0300, diver wrote:
> С помощью raorn@ удалось выяснить что grub-install выдаёт ошибку:
> "The file /boot/grub/stage1 not read correctly." из-за наличия файлов в
> корне фс,
> которых как я понимаю там быть не должно.
> Загрузившись с LiveCD и при попытке удалить их через debugfs получаю:
> $rm /.rnd (rm .rnd)
> File not found by ext2_lookup while trying to resolve filename
>
> $kill_file /.rnd (kill_file .rnd)
> File not found by ext2_lookup
>
> Есть другие методы как их удалить?
>
> fsck на раздел никаких ошибок не находит, и в работе ОС проблем не замечаю.
[...]
> 881281 40755 (2) 0 0 4096 24-Jan-2006 21:37 sys
> < 0> 0 (1) 0 0 0 .rnd
> < 0> 0 (1) 0 0 0 .ismount-test-file
Похоже, в данном случае неправ grub - судя по коду ext2 в ядре,
элементы каталога с de->inode == 0 должны игнорироваться. Например,
вот кусок кода из fs/ext2/dir.c:ext2_readdir():
for ( ;(char*)de <= limit; de = ext2_next_entry(de)) {
if (de->rec_len == 0) {
ext2_error(sb, __FUNCTION__,
"zero-length directory entry");
ext2_put_page(page);
return -EIO;
}
if (de->inode) {
int over;
unsigned char d_type = DT_UNKNOWN;
if (types && de->file_type < EXT2_FT_MAX)
d_type = types[de->file_type];
offset = (char *)de - kaddr;
over = filldir(dirent, de->name, de->name_len,
(n<<PAGE_CACHE_SHIFT) | offset,
le32_to_cpu(de->inode), d_type);
if (over) {
ext2_put_page(page);
return 0;
}
}
filp->f_pos += ext2_rec_len_from_disk(de->rec_len);
}
Функция ext2_match(), используемая в ext2_find_entry() при поиске в
каталоге элемента с заданным именем, тоже игнорирует такие элементы:
static inline int ext2_match (int len, const char * const name,
struct ext2_dir_entry_2 * de)
{
if (len != de->name_len)
return 0;
if (!de->inode)
return 0;
return !memcmp(name, de->name, len);
}
Следовательно, исправлять надо не файловую систему, а код для работы с
ext2 в grub.
Вообще подобные элементы могут появляться в каталоге, например, при
удалении файла, элемент каталога для которого был первым в блоке (в
других случаях освободившееся место просто присоединяется к
предыдущему элементу); воспроизвести эту ситуацию можно путём создания
и последующего удаления большого количества файлов в каталоге. Обойти
проблему можно, если выполнить e2fsck -f -D - при этом пустые записи в
каталогах удаляются (особо разросшиеся каталоги оптимизируются и без
-D, но одного лишнего блока для автоматического запуска оптимизации
недостаточно).
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: Digital signature
Url : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20080423/149bc5fd/attachment-0002.bin>
Подробная информация о списке рассылки Sisyphus