[an error occurred while processing this directive]

Изменение номера inode файла в Linux
Для некоторых специфических целей может понадобиться изменить номер inode у существующего файла, 
либо создать файл с заранее заданным номером. Штатными средствами сделать это -
задача нетривиальная,
однако с помощью модуля ядра это несложно. 

Создаем файл inode_modify.c следующего содержания: 

 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/version.h>

 #include <linux/fs.h>
 #include <linux/namei.h>

 #ifndef BUF_LEN
 #define BUF_LEN 256
 #endif

 char file[BUF_LEN];
 unsigned long new_num=0;

 module_param_string( name, file, BUF_LEN, 0);
 module_param(new_num, ulong, 0);


 struct nameidata nd;

 unsigned long get_number() {
	int error;
	error = path_lookup( file, 0, &nd);
	printk( KERN_ALERT "name = %s\n", file);
	if(error) {
		printk( KERN_ALERT "Can't access file\n");
		return -1;
	}
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
	return nd.path.dentry->d_inode->i_ino;
 #else 
	return nd.dentry->d_inode->i_ino;
 #endif
 }

 unsigned long set_number(unsigned long new_num) {
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
	nd.path.dentry->d_inode->i_ino = new_num;
	return nd.path.dentry->d_inode->i_ino;
 #else 
	nd.dentry->d_inode->i_ino = new_num;
	return nd.dentry->d_inode->i_ino;
 #endif
 }
 int inode_modify_init(){
	unsigned long inode_num;
	inode_num = get_number();
	printk ( KERN_ALERT "Inode number is %lu\n", inode_num);
	printk ( KERN_ALERT "New inode number is %lu\n",  set_number(new_num));
	return 0;
 }

 void inode_modify_exit(){
	printk(KERN_ALERT "Exiting...\n"); 
 }

 module_init(inode_modify_init);
 module_exit(inode_modify_exit);

 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Victor Leschuk <Victor.Leschuk@ebanat.com>");

И простой Makefile: 

 obj-m := inode_modify.o

После чего в директории с модулем: 

 $ make -C  /path/to/kernel/sources SUBDIRS=$PWD modules

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

Далее тестируем модуль: 

 $ touch /dev/shm/test
 $ ls -i /dev/shm/test
 172461 /dev/shm/test
 $ sudo insmod ./inode_modify.ko name=/dev/shm/test new_num=12345
 $ ls -i /dev/shm/test
 12345 /dev/shm/test
 $ sudo rmmod inode_modify 
 $ dmesg |tail
 name = /dev/shm/test
 Inode number is 172461
 New inode number is 12345
 Exiting...
 
30.09.2009 , Автор: Victor Leschuk
Ключи: linux, module, kernel, module, inode, fs / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / C/C++, сборка, отладка

[an error occurred while processing this directive]

[an error occurred while processing this directive]