Linux NLS Name:深入了解Linux中NLS名称的作用和应用 (linux nls name)

一、 引言

Linux是一种开源的操作系统,由于其开放性、安全性、高效性等特点,受到越来越多技术爱好者、开发者、企业的青睐。Linux中NLS(National Language Support,国际化支持)是与字符集和多语言有关的重要概念,它为不同的语言和区域提供了支持,具有很大的作用和应用价值。本文就通过深入分析Linux中的NLS名称,探讨NLS的作用和应用,帮助读者更好地理解和使用Linux。

二、 NLS名称的定义

NLS在Linux中是一个用于字符集和本地化的标准接口,它为不同语言和区域的用户提供了支持。NLS名称是用于标识不同字符集和本地化环境的Unicode名称,主要用于文件系统的编码、系统日志的记录、系统时间的设置等方面,是Linux系统运行的重要组成部分。NLS名称的形式如:nls_.,其中字符集名称是指支持的字符集类型,如utf8、gbk等;本地化名称是指支持的区域和语言类型,如简体中文、英文、日文等。

三、 NLS名称的作用和应用

1、 文件系统的编码

在Linux中,文件系统的编码是由NLS名称控制的。当文件系统的编码与当前的语言环境不匹配时,就可能出现无法识别字符、乱码等情况。例如,在中文环境下使用Windows系统创建的文件,需要将文件系统的NLS名称设置为支持中文的字符集名称和本地化名称,才能正确地读写中文内容。同样地,在使用Linux系统时,也需要根据自己的语言环境选择合适的NLS名称,以确保文件系统的编码正确无误。

2、 系统日志的记录

系统日志是Linux系统重要的运行记录、调试和故障排除工具。在记录系统日志时,NLS名称也很重要。如果日志文件使用的编码与当前的语言环境不匹配,就会出现乱码或无法显示的情况,从而影响日志的可读性和分析效果。因此,在记录系统日志时,需要将NLS名称设置为与当前语言环境相同的字符集和本地化环境。

3、 系统时间的设置

在Linux中,时间的显示和处理是受NLS名称限制的。系统时间是一个重要的指标,不同语言环境下需要显示不同的时间格式。例如,在中文环境下,时间通常以“年、月、日、时、分、秒”的格式显示,而在英文环境下则以“日、月、年、时、分、秒”的格式显示。因此,在设置系统时间时,需要根据环境选择合适的NLS名称,以确保时间的格式正确无误。

四、 NLS名称的使用方法

在Linux中,NLS名称的使用方法通常有两种。一种是在启动系统时,在命令行中添加-nls参数来指定NLS名称,例如:

[root@localhost ~]# mount -o nls=utf8 /dev/sdb1 /mnt

这表示在挂载/dev/sdb1分区时使用utf8编码的文件系统。另一种是通过修改系统配置文件/etc/locale.conf来设置全局的NLS名称,例如:

[root@localhost ~]# vi /etc/locale.conf

LANG=en_US.UTF-8

这表示将系统的全局语言环境设置为英文语言环境,并使用UTF-8编码。

五、 结论

相关问题拓展阅读:

linux 编译内核几个常见问题解决方法

之一次把自己编译的驱动模块加载进开发板,就出现问题,还好没花费多长时间,下面列举出辩戚现的问题及解决方案

1:出现inod: error inserting ‘hello.ko’: -1 Invalid module format

法一(网上的):是因为内核模块生成的环境与运行的环境不一致,用linux-2.6.27内核源代码生成的模块,可能就不能在linux-2.6.32.2内核的linux环境下加载,需要在linux-2.6.27内核的linux环境下加载。

a.执行 uname -r //查看内核版本

b.一般出错信息被记录在文件/var/log/messages中,执行下面命令看错误信息

# cat /var/log/messages |tail

若出现类似下面:

Jun 4 22:07:54 localhost kernel:hello: version magic ‘2.6.35.6-45.fc14.i686.PAE

‘ should be ‘2.6.35.13-92.fc14.i686.PAE’

则把 Makefile里的KDIR :=/lib/modules/2.6.35.6-45.fc14.i686.PAE/build1 改为

KDIR :=/lib/modules/2.6.35.13-92.fc14.i686.PAE/build1 //改成自己内核源码路径

(这里的build1是一个文件链接,链接到/usr/src/kernels/2.6.35.6-45.fc14.i686.PAE和13-92的)

然并卵,我的fedora 14 /usr/src/kernels下并没有2.6.35.13-92.fc14.i686.PAE,只有2.6.35.13-92.fc14.i686,虽然不知道两者有什么区别,但改成2.6.35.13-92.fc14.i686还是不行,照样这个问题,还好后来在看教学视频的到启发

法二:改的还是那个位置

KDIR :=/opt/FriendlyARM/linux-2.6.32.//把这里改成你编译生成kernel的那个路径

all:

$ (MAKE) -C $ (KDIR) M = $ (PWD) modules ARCH=arm CROSS_COMPILE=arm-linux- //加这句

2. hello: module license ‘unspecified’ taints kernel.

Disabling lock debugging due to kernel taint

方法:在模块程序中加入: MODULE_LICENSE(“GPL”);

3. rmmod: chdir(2.6.32.2-FriendlyARM): No such file or directory 错误解决

方法:lod 可查看模块信息

即无法删除对应的模块。

就是必须在/lib/modules下建立错误提示的对应的目录((2.6.32.2)即可。

必须创建/lib/modules/2.6.32.2这样一个空目录,否则不能卸载ko模块.

# rmmod nls_cp936

rmmod: chdir(/lib/modules): No such file or directory

但是这样倒是可以卸载nls_cp936,不过会一直有这样一个提示:

rmmod: module ‘nls_cp936’ not found

初步发现,原来这是编译kernel时使用make modules_install生成的一个目录,

但是经测试得知,rmmod: module ‘nls_cp936’ not found来自于busybox,并不是来自判渣kernel

1).创建/lib/modules/2.6.32.2空目录

2).使用如下源码生成rmmod命令,就掘灶悄可以没有任何提示的卸载ko模块了

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv)

{

const char *modname = argv;

int ret = -1;

int maxtry = 10;

while (maxtry– > 0) {

ret = delete_module(modname, O_NONBLOCK | O_EXCL);//系统调用sys_delete_module

if (ret #include

#include

#include

#include /* Necessary because we use the proc fs */

#define procfs_name “proctest”

MODULE_LICENSE(“GPL”);

struct proc_dir_entry *Our_Proc_File;

int procfile_read(char *buffer,char **buffer_location,off_t offset, int buffer_length, int *eof, void *data)

{int ret;

ret = sprintf(buffer, “HelloWorld!\n”);

return ret;

}

int proc_init()

{Our_Proc_File = create_proc_entry(procfs_name, 0644, NULL);

if (Our_Proc_File == NULL) {

remove_proc_entry(procfs_name, NULL);

printk(KERN_ALERT “Error: Could not initialize /proc/%s\n”,procfs_name);

return -ENOMEM;}

Our_Proc_File->read_proc = procfile_read;//

//Our_Proc_File->owner = THIS_MODULE;

Our_Proc_File->mode = S_IFREG | S_IRUGO;

Our_Proc_File->uid = 0;

Our_Proc_File->gid = 0;

Our_Proc_File->size = 37;

printk(“/proc/%s created\n”, procfs_name);

return 0;

}

void proc_exit()

{remove_proc_entry(procfs_name, NULL);

printk(KERN_INFO “/proc/%s removed\n”, procfs_name);

}

module_init(proc_init);

module_exit(proc_exit);

view plain copy

ifneq ($(KERNELRELEASE),)

obj-m :=proc.o

else

KDIR :=/opt/FriendlyARM/linux-2.6.32.2

#KDIR :=/lib/modules/2.6.35.13-92.fc14.i686.PAE/build1

PWD :=$(shell pwd)

all:

$(MAKE) -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-

clean:

rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif

make后生成proc.ko,再在开发板上inod proc.ko即可

linux nls name的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux nls name,Linux NLS Name:深入了解Linux中NLS名称的作用和应用,linux 编译内核几个常见问题解决方法的信息别忘了在本站进行查找喔。


数据运维技术 » Linux NLS Name:深入了解Linux中NLS名称的作用和应用 (linux nls name)