1-构建嵌入式Linux开发环境.docx

上传人:小飞机 文档编号:1893053 上传时间:2022-12-24 格式:DOCX 页数:23 大小:208.23KB
返回 下载 相关 举报
1-构建嵌入式Linux开发环境.docx_第1页
第1页 / 共23页
1-构建嵌入式Linux开发环境.docx_第2页
第2页 / 共23页
1-构建嵌入式Linux开发环境.docx_第3页
第3页 / 共23页
1-构建嵌入式Linux开发环境.docx_第4页
第4页 / 共23页
1-构建嵌入式Linux开发环境.docx_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《1-构建嵌入式Linux开发环境.docx》由会员分享,可在线阅读,更多相关《1-构建嵌入式Linux开发环境.docx(23页珍藏版)》请在三一办公上搜索。

1、目 录构建嵌入式Linux系统1.取本实验相关的软件包到ftp下载以下软件包: 文件名备注binutils-2.16.1.tar.bz2 gcc-4.0.2.tar.bz2 glibc-2.3.6.tar.bz2 glibc-linuxthreads-2.3.6.tar.bz2 linux-2.6.15.4.tar.bz2 linux-libc-headers-2.6.12.0.tar.bz2 制作交叉编译工具链所需的源码包 crosstool-0.43.tar.gz制作交叉编译工具链的脚本和补丁 crosstool.tar.bz2已制作好的交叉编译工具链,需要解包到/opt目录使用 linu

2、x-2.6.27.tar.bz2内核2.6.27 patch-2.6.27-aka针对2440开发板制作的内核patch zImage已编译好的内核,可直接下载到开发板 rootfs-basic.tar基本根文件系统打包,由于有设备文件,所以解包需要root权限 rootfs-basic.cramfs采用cramfs文件系统格式的基本根文件系统映像,可直接下载到开发板 busybox-1.9.1.tar.bz2busybox源码包,嵌入式根文件系统基本命令集 sqlite-3.4.0.tar.gzsqlite源码包,嵌入式数据库 libcgi-1.0.tar.gzlibcgi源码包,用于编写C

3、GI程序的C函数库 qtopia-core-opensource-src-4.2.2.tar.gzQtopia Core源码包,Qt的嵌入式版本 2.交叉编译工具链要做嵌入式Linux开发,首先需要有交叉编译工具链(cross compiling toolchain),也就是在主机(x86 PC)上可编译生成目标板可执行文件(ARM指令)的编译工具。和普通的编译工具链一样,交叉编译工具链也包括编译、链接、修改目标文件的各种程序,如gcc、glibc、ld、gas、objdump、readelf等等。交叉编译工具链本身也是需要编译生成的,要得到一套完整的交叉编译工具链需要编译以下源码包: bin

4、utils gcc glibc linux(内核) linux-libc-headers glibc-linuxthreads 这些源码包具有非常强的版本依赖关系,如果源码包的版本不匹配,在编译过程中会出现各种各样的问题,有些问题需要对源码做些修改或者打补丁,有些问题则是没有解决办法的,只能更换匹配较好的版本。编译的步骤也是比较复杂的,主要有以下几步: 0. 根据目标平台配置内核源代码,生成内核头文件 1. 编译binutils 2. 编译器的自举(bootstrap),也就是先编译出gcc的部分功能(没有glibc支持,只有C编译器没有C+编译器) 3. 编译glibc 4. 编译完整的gc

5、c 幸运的是,已经有人写出了制作交叉编译器的脚本( ),该脚本中提供了一系列源码包版本的匹配方案,使用者需要选择目标平台和源码包的版本匹配方案,执行该脚本会自动从官方网站( http:/www.gnu.org/ 和 http:/www.kernel.org/ )下载源代码,自动打补丁,然后自动完成所有的编译步骤。 首先从 下载crosstool-0.43.tar.gz,在主目录下解包 $ tar xf crosstool-0.43.tar.gz; cd crosstool-0.43现在选择一种源码包的版本组合,各种版本组合的兼容性可以参考 ,在此我们选择在arm平台上glibc版本较高,兼容性

6、较好的一个组合: gcc-4.0.2 cgcc-4.0.2 glibc-2.3.6 binutils-2.16.1 linux-2.6.15.4 hdrs-2.6.12.0 修改crosstool-0.43目录下的脚本demo-arm.sh,取消这一行开头的#号注释符: #eval cat arm.dat gcc-4.0.2-glibc-2.3.6.dat sh all.sh -notest同时将原本没有注释的这一行注释掉(前面加#号): eval cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat sh all.sh -notest注意该脚本开头有 TARBA

7、LLS_DIR=$HOME/downloadsRESULT_TOP=/opt/crosstool这说明,该脚本运行时,自动从 http:/www.gnu.org/ 和 http:/www.kernel.org/ 下载相关的源码包到主目录的downloads目录下,如果你已经下载过这些源码包,将它们拷到downloads目录下就可以不必再次下载了。对应于我们选择的版本组合,downloads目录下的源码包有: binutils-2.16.1.tar.bz2 gcc-4.0.2.tar.bz2 glibc-2.3.6.tar.bz2 glibc-linuxthreads-2.3.6.tar.bz2

8、 linux-2.6.15.4.tar.bz2 linux-libc-headers-2.6.12.0.tar.bz2 整个编译结束后,交叉编译工具链将放在/opt/crosstool目录下,因此脚本需要在/opt下建子目录,如果不希望使用root权限运行该脚本,则需要事先给/opt目录设置写权限: $ sudo chmod a+w /opt然后修改arm.dat,其中有 TARGET=arm-unknown-linux-gnu这是按标准的命名规则为工具链命名的,但是通常我们都采用更简单的命名,很多软件的Makefile中交叉编译器默认也都采用简单的命名,为此我们把它改为TARGET=arm-

9、linux。 由于编译过程需要用到patch、bison、flex,确认你的系统中安装了这些软件包。 在编译过程中可能还会遇到脚本的兼容性问题,如果你的Linux发行版将sh指向dash(例如Ubuntu),应将其改指向bash: $ cd /bin$ sudo ln -sf bash sh虽然用dash执行脚本时非常高效并且其实现完全遵守POSIX标准,然而现存的很多脚本(比如glibc中的脚本)有不符合POSIX标准的用法,所以仍需改用bash执行。 准备就绪后,在crosstool-0.43目录下运行demo-arm.sh脚本开始编译。编译完成后,交叉编译工具链的可执行文件位于/opt/

10、crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux/bin目录,我们可以把这个路径添加到PATH环境变量中,例如将以下命令添加到/.bashrc启动脚本: export PATH=$PATH:/opt/crosstool/gcc-4.0.2-glibc-2.3.6/arm-linux/bin此外,网上也可下载到已编译好的交叉编译工具链,比如 http:/www.snapgear.org/snapgear/downloads.html ,但是使用别人编译好的交叉编译工具链有很多限制,不能按自己的特殊需要对其定制,比如有些项目需要特定版本的gcc和glibc,再比如

11、需要soft-float的编译器(生成指令模拟浮点数运算)。 以上编译步骤需要很长时间,也可以直接从ftp下载已制作好的交叉编译工具链安装到主机: $ sudo chmod a+w /opt$ tar xf crosstool.tar.bz2 -C /opt然后在/.bashrc启动脚本中修改PATH环境变量。 3.熟悉开发环境3.1 U-boot的基本使用方法连接好开发板的网线和串口线,启动minicom(配置成115200 8N1,无Flow Control)。按下开发板电源,立刻按除回车以外的任意键,进入bootloader提示符AKAE2440#。如果没来及按键就已经启动了内核,可以按

12、开发板上的RESET键重来。 注意:u-boot的终端不能处理控制字符,不要用移动光标键或翻页键等,退格键可以用。按了产生控制字符的键再输入命令就会产生错乱,这时可以按下回车输入当前这条已经错乱的命令,然后在新的提示符下重新键入命令。 输入printenv命令显示bootloader的参数。 更改参数使用命令set或者setenv,如下图所示:上图中,setenv ipaddr 192.168.1.22表示设置开发板的IP地址为192.168.1.22。setenv netmask 255.255.255.0表示设置子网掩码为255.255.255.0。setenv serverip 192.

13、168.1.21表示设置与开发板相连的PC机IP是192.168.1.21。可以根据你的情况重新设置。为了统一起见,在后面的实验中,我们统一设置为: AKAE2440 # set ipaddr 192.168.2.100AKAE2440 # set serverip 192.168.2.21 (这一项应该和你的主机IP一致)AKAE2440 # set netmask 255.255.255.0AKAE2440 # set gateway 192.168.2.21 (网关ip设置成什么无所谓,一般都设为主机ip)AKAE2440 # savesave将这些设定写入flash中,下次开发板上电时

14、仍然有效。如果不save则仅改变内存中的参数值,reset后会恢复flash中原来的参数值。 设置完成后在开发板上ping 主机的ip地址,检查网络是否正常,如下所示:AKAE2440 # ping 192.168.2.21host 192.168.2.21 is alive这表示主机能ping通,网络正常。如果显示如下:AKAE2440 # ping 192.168.2.21ping failed; host 192.168.2.21 is not alive.这就表示主机不能ping通,网络异常,需要检查你的网络。还有一些常见的参数:AKAE2440 # set bootdelay 3Bo

15、otdelay设为3,表示开发板上电后等待3秒再启动,这3秒时间内按任意键会进入u-boot命令行状态,如下图所示:另外,还有:AKAE2440 # set bootmode nfs或者AKAE2440 # set bootmode nandBootmode 可以设为nfs或者nand两者之一,这个参数表明了u-boot启动时,根文件系统在哪里寻找,如果是nand表示根文件系统保存在开发板本身的flash某个分区中,要到flash上去找;如果是nfs则表示u-boot要去你的PC机的nfs服务的目录(PC机硬盘上)去找。在开发板bootloader输入以下命令查看64M flash是如何分区的

16、。 AKAE2440 # mtdpartsDevice nand0 . # parts = 4#: name size offset mask_flags0: u-boot 0x00100000 0x00020000 01: kernel 0x00200000 0x00100000 02: ext2 0x01000000 0x00300000 03: temp 0x02d00000 0x01300000 0u-boot分区保存bootloader程序,Linux内核保存在kernel分区,根文件系统会保存到ext2分区, temp分区本实验中没有用到。 如果mtdparts命令未显示上述图样,

17、可能是flash未作分区操作,可以使用mtdparts default命令来创建上述那样的默认分区。如下图所示: 如果要保存新的分区表,使用命令save保存到flash中,否则reset后将恢复flash中原来的分区表。 下载文件到开发板内存中,需要通过tftp协议。开发板是tftp客户端,主机是tftp服务器。在配置好主机的tftp服务之后,主机上会有一个tftp服务的主目录/tftproot,我们把要下载到开发板上的文件都先拷贝到这个目录中,之后才能下载。tftp命令的格式为 tftp 文件名。注意我们都是把内核zImage文件下载到0x30008000地址上,把根文件系统img文件下载到

18、0x30800000地址上。当我们用命令tftp 0x30008000 zImage把内核zImage下载到内存地址0x30008000上之后,先使用nand erase kernel命令擦除掉flash的kernel分区上的数据(否则在读出flash数据时会报失败),然后可以用nand write 0x30008000 kernel 0x200000命令把内存中的内核文件烧写到flash的对应kernel分区中去,如下图所示: 同理,当我们用命令tftp 0x30800000 rootfs.cramfs把根文件系统rootfs.cramfs映像文件下载到内存地址0x30800000上之后,用

19、nand write 0x30800000 ext2 0x1000000命令把它烧写到flash的ext2分区中去,当然,在烧写之前也要先使用 nand erase ext2擦除掉flash的ext2分区,否则烧写后读出数据会失败。如下图所示:注意:如果发现tftp服务配置是正确的,但是有些文件不能够下载,则很有可能是文件权限的问题。可以使用sudo chmod 777 zImage rootfs.cramfs这样的命令来更改文件访问权限。现在,内核和cramfs根文件系统都烧写到flash上去了,只要设置好正确的内核启动参数就可以启动开发板了。AKAE2440 # set bootcmd n

20、and read 0x30008000 kernel 0x200000; myboot 0x30008000AKAE2440 # set bootargs noinitrd console=ttySAC0,115200AKAE2440 # set bootmode nandAKAE2440 # set init /linuxrc AKAE2440 # set root /dev/mtdblock2AKAE2440 # savebootcmd参数表示u-boot上电后会自动执行的命令,第一条nand read 0x30008000 kernel 0x200000表示从flash上kernel分区

21、去读取Linux内核到开发板内存地址0x30008000处,大小为0x200000字节;第二条命令是myboot 0x30008000表示跳转到地址0x30008000去启动Linux内核。这两条命令要用分号“;”隔开,但是设置bootcmd参数时设置给它的是一个字符串,所以分号要用转义字符“;”代替。bootargs就是我们常说的Linux内核的启动命令行参数(Linux_cmd_line)。U-boot通过这个参数告知内核一些关键的启动参数。实际上,在Uboot中,最后的完整的启动命令行参数是由前面设置那些一个一个的小项组合而成的。真正完整的命令行参数是:noinitrd console=

22、ttySAC0,115200 init=/linuxrc cs89x0_media=rj45 root=/dev/mtdblock2 mtdparts=akae2440-nand:1M(u-boot),2M(kernel),16M(ext2),45M(temp) ip=192.168.2.100:192.168.2.21:192.168.2.21:255.255.255.0:eth0:off noinitrd表示内核启动时不需要初始化一个内存磁盘ramdisk;而root=/dev/mtdblock2表示根文件系统在flash的编号为2的分区上(从0开始编号的,所以是第三个分区,回忆前面的u-

23、boot的分区信息,flash上分区依次是u-boot,kernel,ext2,temp,我们的根文件系统就在第三个分区ext2上);console=ttySAC0, 115200表示打开一个串行终端ttySAC0,它是通过串口1工作的,波特率为115200;init=/linuxrc表示内核启动好后第一个执行的应用程序是/linuxrc,根目录下的linuxrc;mtdparts=akae2440-nand:1M(u-boot),2M(kernel),16M(ext2),45M(temp)表示u-boot传递给内核的分区信息。我们在选择使用nfs根文件系统还是cramfs根文件系统的时候,b

24、ootargs、bootcmd和init参数基本都一样,不用改变,需要改变的是bootmode参数,由bootmode参数的设置决定去选择root参数(描述cramfs根文件系统所在位置)还是nfsroot参数(描述nfs根文件系统所在位置),即bootmode为nand时选择root参数,bootmode为nfs时选择nfsroot参数。在启动进入到Linux系统后,可以通过在命令行终端键入如下命令来查看命令行参数:$cat /proc/cmdline现在启动。 AKAE2440 # reset这时屏幕上出现很多内核启动信息,之后提示登录,输入root即可登录。 (none) login:

25、root现在可以试试各种Linux基本命令。注意cramfs是只读文件系统,在开发板上运行时不能改动里面的文件。 有些时候我们可能会尝试配置不同的内核选项,会得到不同的几个内核zImage文件,这样都烧写到flash上再reset启动太浪费时间,可以用tftp把内核zImage加载到内存0x30008000地址上,不烧写,直接用myboot 0x30008000去启动内存上的内核。如下图示:3.2 将自己定制的根文件系统下载到开发板运行“根文件系统”是一种不严格的说法,其实是指文件系统中的文件和目录,这些文件和目录构成了一个Linux系统运行所需的基本框架。ftp上的rootfs-basic.

26、tar是根文件系统的打包,由于包含设备文件,需要root权限才能解包: $ sudo tar xf rootfs-basic.tar解包后可以根据自己的需要修改其中的目录和文件,然后将根文件系统目录制作成cramfs映像再下到开发板运行,这样就达到了修改根文件系统中的目的。 首先确认你的主机上安装了软件包cramfsprogs,然后制作cramfs文件系统映像: $ mkcramfs /rootfs rootfs.cramfs然后按照前面的步骤把rootfs.cramfs下载到开发板的ext2分区,运行一下试试。 3.3 设置开发板的启动方式为NFS Root基本思想是:在主机上开NFS服务器

27、,把主机上的/rootfs目录导出为NFS服务目录,使开发板一启动就自动加载主机的/rootfs目录为根文件系统,省去了下载和烧写映像的麻烦,在主机上修改根文件系统中的文件立刻在开发板的系统上生效,在开发过程中十分便利。 首先在主机上安装和配置NFS服务,确认你的主机安装了nfs-kernel-server软件包。然后修改配置文件/etc/exports,添加下面一行(注意*号后面紧跟左括号,无空格,每个逗号后面也不能有空格): /home/akaedu/rootfs *(rw,sync,no_root_squash)这表示我们把上一节中通过解压rootfs-basic.tar得到的/home

28、/akaedu/rootfs/目录设置为nfs服务目录。更改配置后需要重启NFS服务: $ sudo /etc/init.d/nfs-kernel-server restart用rpcinfo -p命令看一下portmapper和nfs服务是否正常启动了,用exportfs命令看一下导出目录的设置是否正确。 进入开发板的bootloader,修改内核启动参数: AKAE2440 # set bootcmd nand read 0x30008000 kernel 0x200000; myboot 0x30008000AKAE2440 # set bootargs noinitrd console

29、=ttySAC0,115200AKAE2440 # set init /linuxrc AKAE2440 # set nfsroot /home/akaedu/rootfsAKAE2440 # set bootmode nfsAKAE2440 # saveAKAE2440 # reset真正完整的内核启动命令行参数是:noinitrd console=ttySAC0,115200 init=/linuxrc root=/dev/nfs nfsroot=192.168.2.21:/home/akaedu/rootfs mtdparts=akae2440-nand:1M(u-boot),2M(ke

30、rnel),16M(ext2),45M(temp) ip=192.168.2.100:192.168.2.21:192.168.2.21:255.255.255.0:eth0:off 注意,如果某一项参数很长,而minicom提供的终端却不能自动换行,一行写不下的部分只好盲打了,注意不要打错。如果是图形界面的console,可以把字体调小使得一行可以容得下这么长的参数,或者在gedit写字板程序中写好后直接粘贴到console窗口(我们推荐采用这种方法,把经常用到的启动参数都集中写好,以后可以选择对应的参数直接粘贴就好了,非常方便)。关于NFS根文件系统的内核启动参数参考内核源代码的Docum

31、entation/nfsroot.txt文档。 现在可以自己交叉编译一些小程序,然后拷贝到主机的/rootfs目录,我们可以立刻在开发板上运行该程序,而不需要重新下载和烧写了。 3.4 配置YAFFS文件系统cramfs是只读文件系统,在Flash上压缩存储,解压并加载到RAM运行。由于只读因而功能上很受限制,但可以保护系统文件不被意外的写操作损坏。实际产品往往配置两个Flash分区,一个只读分区用于存放系统文件(程序文件和库文件),另一个可写分区,采用JFFS或YAFFS文件系统,用于存放应用程序数据,为了简便起见,我们只分一个区,使用可写的YAFFS文件系统。注意,完成这个实验之前先要完成

32、上一节内容,能启动到nfs根文件系统。 首先用NFS方式启动系统。YAFFS文件系统和我们熟悉的ext2不同,不需要格式化,只需要全部擦除就可以用了。用根文件系统中的flash_eraseall命令擦除root分区并mount上来。以下命令在开发板上执行 # flash_eraseall /dev/mtd2Erasing 16 Kibyte 6b8000 - 10 % complete.Skipping bad block at 0x006bc000Erasing 16 Kibyte 3dfc000 - 99 % complete.# mount -t yaffs /dev/mtdblock2

33、 /mntyaffs: dev is 32505859 name is mtdblock2yaffs: Attempting MTD mount on 31.3, mtdblock2block 432 is bad# ls /mntlost+foundflash_eraseall命令是从mtd项目( http:/www.linux-mtd.infradead.org/ )的源代码中交叉编译得来的。 现在可以把根文件系统中的所有文件拷贝到Flash分区。以下命令在开发板上执行: # cp -a bin etc lib linuxrc opt sbin srv tmp usr /mnt/# mkd

34、ir -p /mnt/proc /mnt/sys /mnt/dev /mnt/mnt /mnt/var/run# mknod /mnt/dev/console -m 600 c 5 1# mknod /mnt/dev/null -m 666 c 1 3# umount mnt# reboot注意:像/proc、/sys这样正mount着特殊文件系统的目录和/dev目录下的设备文件一定不可以用cp命令拷贝。/mnt目录显然也不能拷贝。这些目录和设备文件需要手动创建。 重启目标系统之后进入U-boot,修改内核启动参数使之从ext2分区启动即可(如果下次还用NFS启动,这里就不save了): AK

35、AE2440 # set bootmode nandAKAE2440 # set root /dev/mtdblock2AKAE2440 # set bootargs noinitrd rootfstype=yaffs rw console=ttySAC0,115200AKAE2440 # saveAKAE2440 # reset现在试试能不能修改Flash根文件系统中的文件。 4.编译内核将内核释放到/linux-2.6.27目录下 $ tar xf linux-2.6.27.tar.bz2进入内核目录: $ cd linux-2.6.27(本开发板不用修改makefile,打补丁时就会自动

36、修改)首先修改Makefile,找到 ARCH ?= $(SUBARCH)CROSS_COMPILE ?=改为 ARCH ?= armCROSS_COMPILE ?= arm-linux-注意ARCH ?=arm后面不能有空格,要确保空格已删除干净,并且不要漏了arm-linux-末尾的“-”。下面对内核打patch(注意打patch不要重复打): /linux-2.6.27$ patch -p1 Pseudo filesystems - /proc file system support; Sysctl support (/proc/sys); sysfs file system suppo

37、rt 和Virtual memory file system support (former shm fs); Tmpfs POSIX Access control Lists。 /proc file system(或者叫procfs)是内核提供给用户程序的接口,很多Linux程序都需要在procfs中读写数据,比如busybox,因此这个选项一般是不能少的。Virtual memory file system(或者叫tmpfs)用于内存虚拟磁盘,后面我们在做根文件系统时要mount一个tmpfs到/dev目录下。 3、不需要改变Boot options - Default kernel co

38、mmand string,因为bootloader中的内核启动参数会取代这里的设置。 4、选中Device Drivers - Network device support - Ethernet (10 or 100Mbit) - CS8900A support,添加对网卡芯片的支持。在File systems - Network File Systems菜单中选上NFS client support;NFS client support for NFS version3;NFS client support for the NFSv3 ACL protocol extension和Root

39、file system on NFS。 5、选中Device Drivers - Memory Technology Devices (MTD) - MTD partitioning support,在Device Drivers - Memory Technology Devices (MTD),选中NAND Device Support和它下面的NAND Flash support for S3C2410/S3C2440 SoC; S3C2410 NAND driver debug,不要选择S3C2410 NAND Hardware ECC,因为S3C2410硬件生成ECC码的算法和我们所

40、需要的不一致。 6、在File systems - Miscellaneous filesystems中选中YAFFS2 file system support; Auto select yaffs2 format; cache short names in RAM, 再选上Compressed ROM file system support (cramfs)。 7、在Device Drivers - Graphics support中选中Support for frame buffer devices, 再选中它下面的Enable firmware EDID; Enable video Mo

41、de Handling Helpers; S3C2410 LCD framebuffer support,不选择Virtual Frame Buffer support因为它是一个用于调试的虚拟设备驱动而不是实际硬件的驱动。如果还选中了Bootup Logo,那么在内核启动过程中初始化framebuffer时会在屏幕上看到Linux的企鹅logo,这是测试framebuffer驱动是否正常工作最直接的方法。Bootup Logo有三种规格,我们的开发板支持VGA输出,可以选择224色的漂亮logo。 8、在 Device Drivers - USB support中选中Support for

42、Host-side USB,然后选择OHCI HCD support,在Device Drivers - Input device support中选中Mouse interface,设置屏幕分辨率Horizontal screen resolution和Vertical screen resolution为1024和768。 9、选中Device Drivers -Real time clock - Set system time from RTC on startup and resume; /sys/class/rtc/rtcN (sysfs); /proc/driver/rtc (pr

43、ocfs for rtc0); /dev/rtcN (character devices); Test driver/device.10、如果不希望在/dev目录下生成大量伪终端设备文件,可以取消选择Device Drivers - Character devices - Legacy (BSD) PTY support。 配置完成后用make命令编译内核,这个过程需要较长时间,编译好的内核位于/linux-2.6.27/arch/arm/boot/zImage。现在将自己编译的内核下载到开发板,看系统能不能正常启动。 5.制作根文件系统5.1 根文件系统框架和busybox首先用mkdir手

44、动创建如下的基本目录结构: $ tree rootfs/rootfs/|- bin|- dev|- etc| |- init.d| - network| |- if-down.d| |- if-post-down.d| |- if-pre-up.d| - if-up.d|- lib|- mnt|- opt|- proc|- sbin|- srv|- sys|- tmp|- usr| |- bin| |- lib| - sbin- var - run/bin /sbin /usr/bin /usr/sbin系统的基本命令,系统关键组件的可执行文件位于/bin和/sbin,其它应用程序的可执行文件位于/usr/bin和/usr/sbin,bin和sbin的区别在于,bin目录下的可执行文件用于日常操作,例如ls、

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号