[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