解决linux读取不到wwid的问题 (linux 读取不到wwid)

解决Linux读取不到WWID的问题

WWID(World Wide Identifier)是指磁盘在存储设备中的唯一标识符,用于确定磁盘在系统中的位置。在Linux中,WWID对于磁盘管理和故障排除非常重要。然而,有时候我们会遇到Linux无法读取WWID的问题,这通常是因为配置错误或设备驱动问题导致的。下面,我们将详细介绍如何解决Linux无法读取WWID的问题。

一、检查配置文件

我们需要检查配置文件是否正确。只有在正确的配置文件中添加了 WWID,才能在Linux中正确识别和使用磁盘。在Linux中,通常使用multipath或udev来管理磁盘,我们需要检查它们的配置文件中是否正确添加了WWID。检查方法如下:

1. 查找udev配置文件

# ls /etc/udev/rules.d/

其中udev的配置文件通常以“60-xxx.rules”的格式存在,我们需要查找其中有关WWID的配置文件。

2. 确认WWID的配置

在找到有关WWID的配置文件后,我们需要确认其中是否已正确配置 WWID。WWID在文件中通常以以下形式出现:

ENV{ID_SERIAL}==”xxxxx”, ENV{ID_SERIAL_SHORT}==”xxxxx”, SYMLINK+=”id/xxxxx”

其中,xxxxx是WWID的值,确保它与您要找的磁盘的WWID值一致。如果配置正确,则此配置文件应包含您正在查找的磁盘的WWID。

3. 重启udev守护程序

在确认配置文件后,我们需要重启udev守护程序,使配置文件生效。重启方法如下:

# systemctl restart systemd-udevd

4. 检查WWID是否可以识别

检查磁盘是否可以识别WWID,方法如下:

# ls -l /dev/disk/by-id/

如果磁盘可以识别WWID,则会在结果中列出WWID。

二、升级设备驱动

如果我们无法在配置文件中解决问题,那么可能是设备驱动问题。有时,某些设备驱动程序可能无法解析WWID,导致Linux无法识别磁盘。为了解决此问题,我们需要升级设备驱动程序。

1. 检查设备驱动版本

我们需要检查当前设备驱动程序的版本。方法如下:

# rpm -qa | grep kmod

这将显示当前已安装的设备驱动程序的名称和版本号。请务必记下当前版本号,以备将来参考。

2. 下载更新的设备驱动

在确定当前设备驱动程序版本后,我们需要下载更新的设备驱动程序。由于不同设备厂商的驱动程序有所不同,我们需要查找并下载适用于您的设备的最新驱动程序。下载方法与常规软件包相同。

3. 安装更新的设备驱动

安装更新的设备驱动程序,方法如下:

# rpm -Uvh

安装新驱动程序后,我们需要重启系统以使新驱动程序生效。

# reboot

重启后,请确认是否能够正确识别磁盘的WWID。

三、更新内核

在某些情况下,更新内核可解决无法读取WWID的问题。更新内核会更新设备驱动程序和相关系统组件,可能会解决无法识别WWID的问题。

1. 确认当前内核版本

在更新内核之前,我们需要查询当前linux系统使用的内核版本。方法如下:

# uname -a

这将显示当前正在使用的内核版本信息。

2. 下载新内核

在确认当前内核版本后,我们需要下载新内核。新内核可从Linux官方网站下载。

3. 安装新内核

安装新内核方式有多种。对于rpm包管理的Linux,可以使用以下命令安装:

# rpm -Uvh

安装后,我们需要重新启动系统以使新内核生效。

# reboot

重启后,请检查是否能够正确识别磁盘的WWID。

结论

相关问题拓展阅读:

  • linux怎么读取SD卡CID?
  • 怎么让Uboot中设置的IP能够在Linux启动后读到
  • linux双击运行找不到环境变量

linux怎么读取SD卡CID?

使用以丛指bai下命du令:

cat /sys/devices/platform/jz-msc.0/mmc_host/mmc0/mmc0:1234/cid

或者渗岁配使用雀尘zhi通配符dao

cat /sys/devices/platform/jz-msc.0/mmc_host/mmc0/mmc0:*/cid

要在Linux系统上读取SD卡CID,可以使用以下命令:

首先,使型乱汪用以下命令查看SD卡设备名称:

sudo fdisk -l

这将列出所有已连接的设备,包括SD卡。请注意SD卡的设备名称,例如/陪旅dev/sdc。

然后,使用以下命令读取SD卡CID:

sudo cat /sys/class/mmc_host/mmcX/mmcX:0001/cid

其中,mmcX是SD卡的设备名称,例如/dev/sdc,X是数字。这将输出SD卡的CID信息。

请注意,读取SD卡CID需要使用root权限。如果没有root权限,请在命令前加上sudo。此外,不是所有SD卡都支持CID读取,因此可能无法读取某些SD卡的CID信卜仔息。

怎么让Uboot中设置的IP能够在Linux启动后读到

U-boot会给LinuxKernel传递很多参数,如:串手态口,RAM,videofb等。而Linuxkernel也会读取和处理这些参数。两者之间通过structtag来传递参数。U-boot把要传递给kernel的东西保存在structtag数据结构中,启动kernel时,把这个结构体的物理地址传给kernel;Linuxkernel通过这个地址,用parse_tags分析出传递过来的参数。本文主要以U-boot传递RAM和Linuxkernel读取RAM参数为例进行说明。1、u-boot给kernel传RAM参数./common/cmd_bootm.c文件中(丛拦指Uboot的根目录),bootm命令对应的do_bootm函数,当分析uImage中信息发现OS是Linux时,调用./lib_arm/bootm.c文件中的do_bootm_linux函数来启动Linuxkernel。在do_bootm_linux函数中:voiddo_bootm_linux(cmd_tbl_t*cmdtp,intflag,intargc,char*argv,\ulongaddr,ulong*len_ptr,intverify){#ifdefined(CONFIG_SETUP_MEMORY_TAGS)||\defined(CONFIG_CMDLINE_TAG)||\defined(CONFIG_INITRD_TAG)||\defined(CONFIG_SERIAL_TAG)||\defined(CONFIG_REVISION_TAG)||\defined(CONFIG_LCD)||\defined(CONFIG_VFD)setup_start_tag(bd);//初始化tag结构体开始#ifdefCONFIG_SERIAL_TAGsetup_serial_tag(¶ms);#endif#ifdefCONFIG_REVISION_TAGsetup_revision_tag(¶ms);#endif#ifdefCONFIG_SETUP_MEMORY_TAGSsetup_memory_tags(bd);//设置RAM参数#endif#ifdefCONFIG_CMDLINE_TAGsetup_commandline_tag(bd,commandline);#endif#ifdefCONFIG_INITRD_TAGif(initrd_start&&initrd_end)setup_initrd_tag(bd,initrd_start,initrd_end);#endif#ifdefined(CONFIG_VFD)||defined(CONFIG_LCD)setup_videolfb_tag((gd_t*)gd);#endifsetup_end_tag(bd);//初始化tag结构体结束#endiftheKernel(0,machid,bd->bi_boot_params);//传给Kernel的参数=(structtag*)型的bd->bi_boot_params//bd->bi_boot_params在board_init函数中初始化,如对于at91rm9200,初始化在at91rm9200dk.c的board_init中进行:bd->bi_boot_params=PHYS_SDRAM+0x100;//这个地址也是所有taglist的首地址,见下面的setup_start_tag函数}对于setup_start_tag和setup_memory_tags函数说明如下。函数setup_start_tag也在此文件中定义,如下:staticvoidsetup_start_tag(bd_t*bd){params=(structtag*)bd->bi_boot_params;//初始化(structtag*)型的全局变量毕郑源params为bd->bi_boot_params的地址,之后的setuptags相关函数如下面的setup_memory_tags就把其它tag的数据放在此地址的偏移地址上。params->hdr.tag=ATAG_CORE;params->hdr.size=tag_size(tag_core);params->u.core.flags=0;params->u.core.pagesize=0;params->u.core.rootdev=0;params=tag_next(params);}RAM相关参数在bootm.c中的函数setup_memory_tags中初始化:staticvoidsetup_memory_tags(bd_t*bd){inti;for(i=0;ihdr.tag=ATAG_MEM;params->hdr.size=tag_size(tag_mem32);params->u.mem.start=bd->bi_dram.start;params->u.mem.size=bd->bi_dram.size;params=tag_next(params);}//初始化内存相关tag}2、Kernel读取U-boot传递的相关参数对于LinuxKernel,ARM平台启动时,先执行arch/arm/kernel/head.S,此文件会调用arch/arm/kernel/head-common.S和arch/arm/mm/proc-arm920.S中的函数,并最后调用start_kernel:bstart_kernelinit/main.c中的start_kernel函数中会调用setup_arch函数来处理各种平台相关的动作,包括了u-boot传递过来参数的分析和保存:start_kernel(){setup_arch(&command_line);}其中,setup_arch函数在arch/arm/kernel/setup.c文件中实现,如下:void__initsetup_arch(char**cmdline_p){structtag*tags=(structtag*)&init_tags;structmachine_desc*mdesc;char*from=default_command_line;setup_processor();mdesc=setup_machine(machine_arch_type);machine_name=mdesc->name;if(mdesc->soft_reboot)reboot_setup(“s”);if(__atags_pointer)//指向各种tag起始位置的指针,定义如下://unsignedint__atags_pointer__initdata;//此指针指向__initdata段,各种tag的信息保存在这个段中。tags=phys_to_virt(__atags_pointer);elseif(mdesc->boot_params)tags=phys_to_virt(mdesc->boot_params);if(tags->hdr.tag!=ATAG_CORE)convert_to_tag_list(tags);if(tags->hdr.tag!=ATAG_CORE)tags=(structtag*)&init_tags;if(mdesc->fixup)mdesc->fixup(mdesc,tags,&from,&meminfo);if(tags->hdr.tag==ATAG_CORE){if(meminfo.nr_banks!=0)squash_mem_tags(tags);save_atags(tags);parse_tags(tags);//处理各种tags,其中包括了RAM参数的处理。//这个函数处理如下tags:__tagtable(ATAG_MEM,parse_tag_mem32);__tagtable(ATAG_VIDEOTEXT,parse_tag_videotext);__tagtable(ATAG_RAMDISK,parse_tag_ramdisk);__tagtable(ATAG_SERIAL,parse_tag_serialnr);__tagtable(ATAG_REVISION,parse_tag_revision);__tagtable(ATAG_CMDLINE,parse_tag_cmdline);}init_mm.start_code=(unsignedlong)&_text;init_mm.end_code=(unsignedlong)&_etext;init_mm.end_data=(unsignedlong)&_edata;init_mm.brk=(unsignedlong)&_end;memcpy(boot_command_line,from,COMMAND_LINE_SIZE);boot_command_line=’\0′;parse_cmdline(cmdline_p,from);//处理编译内核时指定的cmdline或u-boot传递的cmdlinepaging_init(&meminfo,mdesc);request_standard_resources(&meminfo,mdesc);#ifdefCONFIG_Pp_init_cpus();#endifcpu_init();init_arch_irq=mdesc->init_irq;system_timer=mdesc->timer;init_machine=mdesc->init_machine;#ifdefCONFIG_VT#ifdefined(CONFIG_VGA_CONSOLE)conswitchp=&vga_con;#elifdefined(CONFIG_DUMMY_CONSOLE)conswitchp=&dummy_con;#endif#endifearly_trap_init();}对于处理RAM的tag,调用了parse_tag_mem32函数:staticint__initparse_tag_mem32(conststructtag*tag){arm_add_memory(tag->u.mem.start,tag->u.mem.size);}__tagtable(ATAG_MEM,parse_tag_mem32);上述的arm_add_memory函数定义如下:staticvoid__initarm_add_memory(unsignedlongstart,unsignedlongsize){structmembank*bank;size-=start&~PAGE_MASK;bank=&meminfo.bank;bank->start=PAGE_ALIGN(start);bank->size=size&PAGE_MASK;bank->node=PHYS_TO_NID(start);}如上可见,parse_tag_mem32函数调用arm_add_memory函数把RAM的start和size等参数保存到了meminfo结构的meminfo结构体中。最后,在setup_arch中执行下面语句:paging_init(&meminfo,mdesc);对没有MMU的平台上调用arch/arm/mm/nommu.c中的paging_init,否则调用arch/arm/mm/mmu.c中的paging_init函数。这里暂不分析mmu.c中的paging_init函数。3、关于U-boot中的bd和gdU-boot中有一个用来保存很多有用信息的全局结构体--gd_t(globaldata缩写),其中包括了bd变量,可以说gd_t结构体包括了u-boot中所有重要全局变量。最后传递给内核的参数,都是从gd和bd中来的,如上述的setup_memory_tags函数的作用就是用bd中的值来初始化RAM相应的tag。对于ARM平台这个结构体的定义大致如下:include/a-arm/global_data.htypedefstructglobal_data{bd_t*bd;unsignedlongflags;unsignedlongbaudrate;unsignedlonghave_console;/*serial_init()wascalled*/unsignedlongreloc_off;/*RelocationOffset*/unsignedlongenv_addr;/*AddressofEnvironmentstruct*/unsignedlongenv_valid;/*ChecksumofEnvironmentvalid?*/unsignedlongfb_base;/*baseaddressofframebuffer*/void**jt;/*jumptable*/}gd_t;在U-boot中使用gd结构之前要用先用宏DECLARE_GLOBAL_DATA_PTR来声明。这个宏的定义如下:include/a-arm/global_data.h#defineDECLARE_GLOBAL_DATA_PTRregistervolatilegd_t*gda(“r8”)从这个宏的定义可以看出,gd是一个保存在ARM的r8寄存器中的gd_t结构体的指针。说明:本文的版本为U-boot-1.3.4、Linux-2.6.28,平台是ARM。

linux双击运行找不到环境变量

如果晌困改双击运行Linux程序,但是找不到环境变量,可能是因为尺败环境变量没有正确配置导致的。你可以通过修改用户设置文件~/.profile,宴判将PATH变量指向正确的程序文件夹,来解决这个问题。

在Linux中,双击一个文件并不能运行,除非该文件可以被系统正确识别,即该文件需要有一定的可执行权限。首先,检查可执行文件的权限,可以弊肢使用“ls -l ”命令查看文件权限,如果文件没有可执行权限,可以用“chmod +x ”命租乎世令给予文件可执行权限。此外,可能是由于环境变量没有设置导致的,在运行程序之顷启前要先根据程序的路径,设置环境变量,如export PATH=$PATH:/user/program/bin

如果你双击运行Linux程序找不到环液做敬境变量,那么可能是环境变量设置有问题。可以尝试使用终端命令查看环境变量,并尝试重新设置胡培环境变量,以便正确运行闹慎Linux程序。

linux 读取不到wwid的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 读取不到wwid,解决linux读取不到wwid的问题,linux怎么读取SD卡CID?,怎么让Uboot中设置的IP能够在Linux启动后读到,linux双击运行找不到环境变量的信息别忘了在本站进行查找喔。

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《解决linux读取不到wwid的问题 (linux 读取不到wwid)》
文章链接:https://zhuji.vsping.com/26318.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。