嵌入式Linux中常见的问题
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 关键字。至于 /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 位色,则可以通过如下的命令清空屏幕:
$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768
在应用程序中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开 /dev/fb0 设备,并通过mmap 系统调用进行地址映射,随后用 memset 将屏幕清空(这里假设显示模式是 1024x768-8 位色模式,线性内存模式):
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 命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。
通过 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\n");
}
#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)
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0)、(4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echotest > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。
2.伪终端(/dev/pty/)
伪终端(Pseudo Terminal)是成对的逻辑终端设备,例如/dev/ptyp3和/dev/ttyp3(或着在设备文件系统中分别是/dev/pty/m3和/dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ttyp3看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对的另一个上面(ptyp3)。而ptyp3则是另一个程序用于读写操作的逻辑设备。这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用ttyp3的程序则认为自己正在与一个串行端口进行通信。这很象是逻辑设备对之间的管道操作。
对于ttyp3(s3),任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。但对于使用ptyp3的程序,则需要专门设计来使用ptyp3(m3)逻辑设备。
例如,如果某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会开始连接到设备ptyp2(m2)上(一个伪终端端口上)。此时一个getty程序就应该运行在对应的ttyp2(s2)端口上。当telnet从远端获取了一个字符时,该字符就会通过m2、s2传递给getty程序,而getty程序就会通过s2、m2和telnet程序往网络上返回”login:”字符串信息。这样,登录程序与telnet程序就通过“伪终端”进行通信。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。
在使用设备文件系统(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 命令减少对象文件所需的存储量开销。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。