嵌入式Linux常见问题

2019-07-12 17:49发布

Linux问题集   1 linux设置环境变量及保存地点 1. 显示环境变量HOME $ echo $HOME /home/terry   2. 设置一个新的环境变量WELCOME $ exportWELCOME="Hello!" $ echo$WELCOME Hello!   3. 使用env命令显示全部的环境变量 $ env HOSTNAME=terry.mykms.org PVM_RSH=/usr/bin/rsh SHELL=/bin/bash TERM=xterm HISTSIZE=1000 ... 4. 使用set命令显示全部本地定义的Shell变量 $ set BASH=/bin/bash BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu") BASH_VERSION='2.05b.0(1)-release' COLORS=/etc/DIR_COLORS.xterm COLUMNS=80 DIRSTACK=() DISPLAY=:0.0 ...   5. 使用unset命令来清除环境变量 set能够设置某个环境变量的值。清除环境变量的值用unset命令。假设未指定值,则该变量值将被设为NULL。示比例如以下: $ exportTEST="Test..." #添加一个环境变量TEST $ env|grepTEST #此命令有输入,证明环境变量TEST已经存在了 TEST=Test... $ unset $TEST#删除环境变量TEST $ env|grepTEST #此命令没有输出,证明环境变量TEST已经存在了   6. 使用readonly命令设置仅仅读变量 假设使用了readonly命令的话。变量就不能够被改动或清除了。示比例如以下: $ exportTEST="Test..." #添加一个环境变量TEST $ readonlyTEST #将环境变量TEST设为仅仅读 $ unset TEST#会发现此变量不能被删除 -bash: unset:TEST: cannot unset: readonly variable $TEST="New" #会发现此也变量不能被改动 -bash: TEST:readonly variable   环境变量的全局设置位于/etc/profile文件,假设须要添加新的环境变量能够加入下属行 exportPATH=$PATH:/path1:/path2:/pahtN        2  ubuntu下安装删除命令 apt表示是advancedpacakge Tool. apt-cachesearch package             搜索包 apt-cacheshow packagename           获取包的信息如版本号和大小。 apt-getinstall packagename          安装包。 apt-getinstall pacekage --reinstall   又一次安装 apt-get -finstall packagename       强行安装 apt-getremove packagename            删除某个程序 apt-getremove packagename --pure    干净的卸掉 apt-getautoremove                    自己主动删除不要的包   apt-getupdate        apt-getupgrade             更新已经安装的包 apt-getdist-upgrade       升级系统。没用过   apt-cachedepends pacakgename  了解使用的依赖,非常少用 apt-cacherdepends packagename 了解详细的依赖。 apt-getbuild-dep packagename    安装相关的编译环境。这个有时须要用。 apt-getsource package           下载安装该包的源代码,编程时有时须要看   apt-get clean apt-getautoclean      清理下载文件存档。 apt-getcheck          检查是否有损坏的依赖,非常少用。   能够通过man apt获得更为具体的解释。        3 怎样让linux在启动时自己主动载入脚本 1 先编写脚本。比方名字为a.sh 2 保存路径为:/etc/rc.d/a.sh 3 改动/etc/rc.d/rc.local    在该文件末尾增加a.sh脚本的存放路径:/etc/rc.d/a.sh    保存,退出 ,就OK了。       4  mount umount 命令 mount语法: mount [选项]<-t 类型> [-o 挂载选项] <设备> <挂载点>   -t 选项用于指定分区上文件系统的类型。您最常遇到的文件系统应该是ext2FS(GNU/Linux 文件系统)或 ext3FS(改进了日志性能的 ext2FS),VFAT(适用于全部 DOS/Windows® 分区:FAT12, 16 or 32)以及 ISO9660(CD-ROM 文件系统)。假设您不指定不论什么类型,mount 将会试着读取分区中的超块来推測文件系统。 -o 选项用于指定一个或多个挂载选项。可供选择的选项视文件系统类型不同而有所不同。请參看 mount(8) 手冊页中的细节。通常将分区挂载在 /mnt 或其他挂载点(挂载点必须已经存在)。   举例: $ mount -text3 /dev/hdb1 /mnt   要卸下分区。可使用umount 命令。语法: umount <挂载点|设备>   举例: $ umount /mnt  或者: $ umount/dev/hdb1   提示:有些时候,可能某些设备(一般是 CD-ROM)正忙或无法响应。此时,大多数用户的解决的方法是又一次启动计算机。我们大可不必这么做。比如,假设umount /dev/hdc 失败的话。您能够试试“lazy” umount。语法十分简单:   umount -l<挂载点|设备>   此命令将会断开设备并关闭打开该设备的所有句柄。通常,您能够使用 eject <挂载点|设备>命令弹出碟片。所以,假设eject 命令失效而您又不想又一次启动。请使用 lazy umount。   假设我们想让系统在启动的时候自己主动挂载某些分区,则应该编辑/etc/fstab 文件。该文件的每一行相应一组挂载关系,包含文件系统、挂载点以及其他选项。这里是该文件的一个样例:   /dev/hda1   /          ext2    defaults        1 1 /dev/hda5   /home      ext2    defaults        1 2 /dev/hda6   swap       swap    defaults        0 0 none        /mnt/cdrom  supermount dev=/dev/scd0,fs=udf:iso9660,ro,--0 0 none        /mnt/floppy supermountdev=/dev/fd0,fs=ext2:vfat,--,sync,umask=0 0 0 none        /proc       proc   defaults        0 0 none        /dev/pts    devpts mode=0622       0 0   每行都由下面内容组成: 文件系统所在的设备; 挂载点; 文件系统类型; 挂载选项; dump 工具备份标志; fsck(文件系统检查(FileSystem ChecK))的检查顺序。   总是有一行说明了根文件系统。swap 分区是一种特殊的分区,由于您无法在树形结构中找到其相应位置,并且这些分区的挂载点域仅仅写着swap keyword。至于 /proc 文件系统。我们会在第 10 章 /proc 文件系统中有更具体的描写叙述。第二种特殊的文件系统是/dev/pts。   举例个样例。假设想把/dev/hdb1自己主动挂载到/usr ,就得在 /etc/fstab 文件里加入以下一行: /dev/hdb1        /usr         ext2   defaults  1 2 这样,分区将会在每次启动时自己主动挂载。而且必要时检查错误。   如今我们来介绍两个特殊选项:noauto 和 user。noauto 选项指定了文件系统不应该在启动时挂载。而仅仅应该在您想要挂载的时候才挂载。而user 选项指定了不论什么用户都能够挂载或卸下文件系统。这两个选项通经常使用于 CD-ROM 和软盘驱动器。有关 /etc/fstab 中其他选项的详情。请您查看 fstab(5) 手冊页。   使用 /etc/fstab 的优点在于。它将极大简化 mount 命令的语法。要挂载文件里描写叙述的文件系统。您仅仅须要引用挂载点或设备。要挂载软盘,您能够仅仅输入: $ mount/mnt/floppy 或: $ mount/dev/fd0          5  文件的加锁问题 问:用fcntl给文件加锁,在一个进程中加给一个文件多次加同一类型的锁。不会报错吗? 答:假设一个进程对一个文件区间已经有一把锁,后来该进程又企图在同一文件区间再加一把锁,那么新锁将替换老锁。        6   framebuffer简单介绍 FrameBuffer 是出如今 2.2.xx 内核其中的一种驱动程序接口。这样的接口将显示设备抽象为帧缓冲区。用户能够将它看成是显示内存的一个映像,将其映射到进程地址空间之后。就能够直接进行读写操作,而写操作能够马上反应在屏幕上。该驱动程序的设备文件通常是/dev/fb0、/dev/fb1 等等。比方,如果如今的显示模式是 1024x768-8 位 {MOD},则能够通过例如以下的命令清空屏幕: $ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768   在应用程序中。一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比方以下的程序就打开 /dev/fb0 设备,并通过mmap 系统调用进行地址映射,随后用 memset 将屏幕清空(这里如果显示模式是 1024x768-8 位 {MOD}模式,线性内存模式): int fb;          unsigned char* fb_mem;          fb = open ("/dev/fb0",O_RDWR);          fb_mem = mmap (NULL, 1024*768,PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);          memset (fb_mem, 0, 1024*768);   FrameBuffer 设备还提供了若干 ioctl 命令,通过这些命令,能够获得显示设备的一些固定信息(比方显示内存大小)、与显示模式相关的可变信息(比方分辨率、象素结构、每扫描线的字节宽度),以及伪彩 {MOD}模式下的调 {MOD}板信息等等。   通过 FrameBuffer 设备,还能够获得当前内核所支持的加速显示卡的类型(通过固定信息得到)。这样的类型通常是和特定显示芯片相关的。比方眼下最新的内核(2.4.9)中,就包括有对S3、Matrox、nVidia、3Dfx 等等流行显示芯片的加速支持。在获得了加速芯片类型之后,应用程序就能够将 PCI 设备的内存I/O(memio)映射到进程的地址空间。这些memio 通常是用来控制显示卡的寄存器,通过对这些寄存器的操作,应用程序就能够控制特定显卡的加速功能。   PCI 设备能够将自己的控制寄存器映射到物理内存空间,而后,对这些控制寄存器的訪问,给变成了对物理内存的訪问。因此。这些寄存器又被称为"memio"。一旦被映射到物理内存。Linux的普通进程就能够通过 mmap 将这些内存 I/O 映射到进程地址空间,这样就能够直接訪问这些寄存器了。   当然,由于不同的显示芯片具有不同的加速能力。对memio 的使用和定义也各自不同,这时,就须要针对加速芯片的不同类型来编写实现不同的加速功能。比方大多数芯片都提供了对矩形填充的硬件加速支持,但不同的芯片实现方式不同。这时,就须要针对不同的芯片类型编写不同的用来完毕填充矩形的函数。   讲到这里,读者可能已经意识到 FrameBuffer 仅仅是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,假设希望在FrameBuffer 之上进行图形编程。还须要完毕其它很多工作。举个样例来讲。FrameBuffer 就像一张画布,使用什么样子的画笔,怎样画画。还须要你自己动手完毕。     7  strings命令的作用 一些二进制格式的文件。你想知道里面有哪些常量字符串。就很实用。比方你生成这样一个程序,a.c: int main(void) {    return printf ("hello world "); } #cc -o a.outa.c #strings./a.out /lib64/ld-linux-x86-64.so.2 _Jv_RegisterClasses_ _gmon_start_ _ libc.so.6 printf __libc_start_main GLIBC_2.2.5 hello world       8  什么是tty? 终端设备是一种字符型设备。它有多种类型,通常使用tty来统称。tty是Teletype的缩写。Teletype是最早出现的一种终端设备,非常象电传打字机(或者说就是?)。是由Teletype公司生产的。在Linux系统的设备特殊文件文件夹/dev/下。终端设备文件一般有下面几种:   1.串端终端(/dev/ttySn)    串行port终端(Serial Port Terminal)是使用计算机串行port连接的终端设备。计算机把每一个串行port都看作是一个字符设备。有段时间这些串行port设备通常被称为终端设备,由于那时它的最大用途就是用来连接终端。这些串行port所相应的设备名称是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev/ttyS1)等,设备号各自是(4,0)、(4,1)等,分别相应于DOS系统下的COM1、COM2等。若要向一个port发送数据,能够在命令行上把标准输出重定向到这些特殊文件名称上就可以。比如,在命令行提示符下键入:echotest > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)port的设备上。   2.伪终端(/dev/pty/)    伪终端(Pseudo Terminal)是成对的逻辑终端设备。比如/dev/ptyp3和/dev/ttyp3(或着在设备文件系统中各自是/dev/pty/m3和/dev/pty/s3)。它们与实际物理设备并不直接相关。假设一个程序把ttyp3看作是一个串行port设备,则它对该port的读/写操作会反映在该逻辑终端设备对的还有一个上面(ptyp3)。而ptyp3则是还有一个程序用于读写操作的逻辑设备。这样,两个程序就能够通过这样的逻辑设备进行互相交流。而当中一个使用ttyp3的程序则觉得自己正在与一个串行port进行通信。这非常象是逻辑设备对之间的管道操作。    对于ttyp3(s3),不论什么设计成使用一个串行port设备的程序都能够使用该逻辑设备。但对于使用ptyp3的程序,则须要专门设计来使用ptyp3(m3)逻辑设备。    比如,假设某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会開始连接到设备ptyp2(m2)上(一个伪终端port上)。此时一个getty程序就应该执行在相应的ttyp2(s2)port上。当telnet从远端获取了一个字符时。该字符就会通过m2、s2传递给getty程序,而getty程序就会通过s2、m2和telnet程序往网络上返回”login:”字符串信息。这样,登录程序与telnet程序就通过“伪终端”进行通信。通过使用适当的软件,就能够把两个甚至多个伪终端设备连接到同一个物理串行port上。    在使用设备文件系统(device filesystem)之前,为了得到大量的伪终端设备特殊文件,使用了比較复杂的文件名称命名方式。由于仅仅存在16个ttyp(ttyp0—ttypf)的设备文件,为了得到很多其它的逻辑设备对,就使用了象q、r、s等字符来取代p。比如。ttys8和ptys8就是一个伪终端设备对。只是这样的命名方式眼下仍然在于RedHat等Linux系统中使用着。    但Linux系统上的Unix98并不使用上述方法。而使用了”pty master”方式,比如/dev/ptm3。它的相应端则会被自己主动地创建成/dev/pts/3。这样就能够在须要时提供一个pty伪终端。文件夹/dev/pts是一个类型为devpts的文件系统。而且能够在被载入文件系统列表中看到。尽管“文件”/dev/pts/3看上去是设备文件系统中的一项,但事实上它全然是一种不同的文件系统。   3.控制终端(/dev/tty)    假设当前进程有控制终端(Controlling Terminal)的话。那么/dev/tty就是当前进程控制终端的设备特殊文件。能够使用命令”ps–ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”能够查看它详细相应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接或别名。   4.控制台(/dev/ttyn,/dev/console)    在Linux系统中。计算机显示器通常被称为控制台终端或控制台(Console)。它仿真了类型为Linux的一种终端(TERM=Linux)。而且有一些设备特殊文件与之相关联:tty0、tty1、tty2等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时。我们就能够切换到tty2、tty3等上面去。tty1–tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,Linux系统所产生的信息都会发送到该终端上。因此无论当前我们正在使用哪个虚拟终端,系统信息都会发送到我们的屏幕上。C}$k]    你能够登录到不同的虚拟终端上去,因而能够让系统同一时候有几个不同的会话存在。但仅仅有系统或超级用户root能够向/dev/tty0进行写操作,并且有时/dev/console会连接至/dev/tty0或/dev/tty1上。   5.其他类型    Linux系统中还针对非常多不同的字符设备建有非常多其他种类的终端设备特殊文件。比如针对ISDN设备的/dev/ttyIn终端设备等。这里不再赘述。     9  nm 命令和strip 命令 nm 命令显示对象文件、可运行文件以及对象文件库里的符号信息。   strip 命令降低XCOFF 对象文件的大小。strip 命令从 XCOFF 对象文件里有选择地除去行号信息、重定位信息、调试段、typchk 段、凝视段、文件头以及全部或部分符号表。一旦您使用该命令,则非常难调试文件的符号。因此,通常应该仅仅在已经调试和測试过的生成模块上使用 strip 命令。使用 strip 命令降低对象文件所需的存储量开销。