linux | 常用命令

目录含义

/bin 存储一些二进制可执行命令文件,/usr/bin 也存放了一些基于用户的命令文件。
/sbin 存储了很多系统命令,/usr/sbin 也存储了许多系统命令。
/root 超级用户 root 的根目录文件。
/home 普通用户默认目录,在该目录下,每个用户都有一个以本用户名命名的文件夹。
/boot 存放 Ubuntu 系统内核和系统启动文件。
/mnt 通常包括系统引导后被挂载的文件系统的挂载点。
/dev 存放设备文件,我们后面学习 Linux 驱动主要是跟这个文件夹打交道的。
/etc 保存系统管理所需的配置文件和目录。
/lib 保存系统程序运行所需的库文件,/usr/lib 下存放了一些用于普通用户的库文件。
/lost+found 一般为空,当系统非正常关机以后,此文件夹会保存一些零散文件。
/var 存储一些不断变化的文件,比如日志文件
/usr 包括与系统用户直接有关的文件和目录,比如应用程序和所需的库文件。
/media 存放 Ubuntu 系统自动挂载的设备文件。
/proc 虚拟目录,不实际存储在磁盘上,通常用来保存系统信息和进程信息。
/tmp 存储系统和用户的临时文件,该文件夹对所有的用户都提供读写权限。
/opt 可选文件和程序的存放目录。
/sys 系统设备和文件层次结构,并向用户程序提供详细的内核数据信息。

目录信息查看命令ls

文件浏览是最基本的操作了,Shell 下文件浏览命令为 ls,格式如下:

ls [选项] [路径]

ls 命令主要用于显示指定目录下的内容,列出指定目录下包含的所有的文件以及子目录,
它的主要参数有:
-a 显示所有的文件以及子目录,包括以“.”开头的隐藏文件。
-l 显示文件的详细信息,比如文件的形态、权限、所有者、大小等信息。
-t 将文件按照创建时间排序列出。
-A 和-a 一样,但是不列出“.”(当前目录)和“…”(父目录)。 -R 递归列出所有文件,包括子目录中的文件。
Shell 命令里面的参数是可以组合在一起用的,比如组合“-al”就是显示所有文件的详细信
息,包括以“.”开头的隐藏文件。

列出块设备信息

lsblk

目录切换命令 cd

要想在 Shell 中切换到其它的目录,使用的命令是 cd,命令格式如下:

cd [路径]

路径就是我们要进入的目录路径,比如下面所示操作:
cd / //进入到根目录“/”下,Linux 系统的根目录为“/”,
cd /usr //进入到目录“/usr”里面。
cd … //进入到上一级目录。
cd ~ //切换到当前用户主目录
比如我们要进入到目录“/usr”下去,并且查看“/usr”下有什么文件

当前路径显示命令 pwd

pwd 命令用来显示当前工作目录的绝对路径,不需要任何的参数

系统信息查看命令 uname

要查看当前系统信息,可以使用命令 uname,命令格式如下:

uname [选项]

可选的选项参数如下:
-r 列出当前系统的具体内核版本号。
-s 列出系统内核名称。
-o 列出系统信息。

清屏命令 clear

clear 命令用于清除终端上的所有内容,只留下一行提示符。

切换用户执行身份命令 sudo

Ubuntu(Linux)是一个允许多用户的操作系统,其中权限最大的就是超级用户 root,有时候
我们执行一些操作的时候是需要用 root 用户身份才能执行,比如安装软件。通过 sudo 命令可以
使我们暂时将身份切换到 root 用户。当使用 sudo 命令的时候是需要输入密码的,这里要注意输
入密码的时候是没有任何提示的!命令格式如下:

sudo [选项] [命令]

选项主要参数如下:
-h 显示帮助信息。
-l 列出当前用户可执行与不可执行的命令
-p 改变询问密码的提示符。

添加用户命令 adduser

在讲解 sudo 命令的时候我们已经用过命令“adduser”,此命令需要 root 身份去运行。命令
格式如下:

adduser [参数] [用户名]

常用的参数如下:
-system 添加一个系统用户
-home DIR DIR 表示用户的主目录路径
-uid ID ID 表示用户的 uid。 -ingroup GRP 表示用户所属的组名。
adduser 的使用我们前面已经演示过了,大家可以试着再添加一个用户。

删除用户命令 deluser

deluser [参数] [用户名]

主要参数有:
-system 当用户是一个系统用户的时候才能删除。
-remove-home 删除用户的主目录
-remove-all-files 删除与用户有关的所有文件。
-backup 备份用户信息

切换用户命令 su

前面在讲解命令“sudo”的时候说过,“sudo”是以 root 用户身份执行一个命令,并没有更
改当前的用户身份,所有需要 root 身份执行的命令都必须在前面加上“sudo”。命令“su”可以
直接将当前用户切换为 root 用户,切换到 root 用户以后就可以尽情的进行任何操作了!因为你
已经获得了系统最高权限,在 root 用户下,所有的命令都可以无障碍执行,不需要在前面加上
“sudo”,“su”命令格式如下:

su [选项] [用户名]

常用选项参数如下:
-c –command 执行指定的命令,执行完毕以后回复原用户身份。
-login 改变用户身份,同时改变工作目录和 PATH 环境变量。
-m 改变用户身份的时候不改变环境变量
-h 显示帮助信息

要切换回原来的用户,使用命令“sudo su 用户名”即可

显示文件内容命令 cat

cat [选项] [文件]

选项主要参数如下:
-n 由 1 开始对所有输出的行进行编号。
-b 和-n 类似,但是不对空白行编号。
-s 当遇到连续两个行以上空白行的话就合并为一个行空白行。

显示和配置网络属性命令 ifconfig

ifconfig 是一个跟网络属性配置和显示密切相关的命令,通过此命令我们可以查看当前网络
属性,也可以通过此命令配置网络属性,比如设置网络 IP 地址等等,此命令格式如下:

ifconfig interface options | address

主要参数如下:
interface 网络接口名称,比如 eth0 等。
up 开启网络设备。
down 关闭网络设备。
add IP 地址,设置网络 IP 地址。
netmask add 子网掩码。

系统帮助命令 man

man [命令名]

系统重启命令 reboot

通过点击 Ubuntu 主界面右上角的齿轮按钮来选择关机或者重启系统,同样的我们也可以
使用 Shell 命令“reboot”来重启系统,

直接输入命令“reboot”然后点击回车键。

系统关闭命令 poweroff

在终端中输入命令“poweroff”然后按下回车键即可关闭 Ubuntu 系统

软件安装命令 install

Ubuntu 下很多软件是需要先自行下载源码,下载源码以后自行编译,编译完成以后使用命令“intsall”来安装。当然 Ubuntu 下也有其它的软件安装方法,但是用的最多的就是自行编译源码然后安装,尤其是嵌入式 Linux 开发。
命令“install”格式如下:
install [选项]… [-T] 源文件 目标文件
或:install [选项]… 源文件… 目录
或:install [选项]… -t 目录 源文件…
或:install [选项]… -d 目录…
“install”命令是将文件(通常是编译后的文件)复制到目的位置,在前三种形式中,将源文
件复制到目标文件或将多个源文件复制到一个已存在的目录中同时设置其所有权和权限模式。
在第四种形式会创建指定的目录。命令“install”通常和命令“apt-get”组合在一起使用的。

apt下载软件,首次使用ubuntu下载,必须更新源,在系统设置-软件和更新-下载自:中国的服务器。

  1. 更新本地数据库
    这个命令会访问源地址,并且获取软件列表并保存在本电脑上

    sudo apt-get update
    
  2. 检测依赖关系

    sudo apt-get check
    
  3. 软件安装
    apt-get负责下载软件
    install负责安装软件
    package-name是软件名字

    sudo apt-get install package-name
    
  4. 软件更新

    sudo apt-get upgrade package-name
    
  5. 卸载软件

    sudo apt-get remove package-name
    
  6. 查看已安装

    dpkg -l | grep ftp
    

vi编辑器

安装vi编辑器

sudo apt-get install vim

创建文件

vim test.txt

常用操作:

  1. 切换到输入模式

    i 在当前光标所在字符的前面,转为输入模式。
    I 在当前光标所在行的行首转换为输入模式。
    a 在当前光标所在字符的后面,转为输入模式。 --常用
    A 在光标所在行的行尾,转换为输入模式。
    o 在当前光标所在行的下方,新建一行,并转为输入模式。
    O 在当前光标所在行的上方,新建一行,并转为输入模式。
    s 删除光标所在字符。
    r 替换光标处字符。

  2. 保存
    首先退出插入模式,按下ESC
    输入“:”进入底行模式
    输入“wq”,回车
    x 保存当前文档并且退出
    q 退出。
    w 保存文档。
    q! 退出 VI/VIM,不保存文档。

  3. 常用命令
    dd 剪切
    ndd 剪切多行
    yy 复制
    nyy 复制多行
    gg 行首(:0 或者 :1 回车)
    shift+g 行尾($回车 或者 G)

创建新文件命令touch

可以用 vi 指令来创建一个文本文档,touch 不仅仅可以用用来创建文本文档,其它类型的文
档也可以创建,命令格式如下:

touch [参数] [文件名]

使用 touch 创建文件的时候,如果[文件名]的文件不存在,那就直接创建一个以[文件名]命
名的文件,如果[文件名]文件存在的话就仅仅修改一下此文件的最后修改日期,常用的命令参
数如下:
-a 只更改存取时间。
-c 不建立任何文件。
-d<日期> 使用指定的日期,而并非现在日期。
-t<时间> 使用指定的时间,而并非现在时间。

文件夹创建命令mkdir

既然可以创建文件,那么肯定也可以创建文件夹,创建文件夹使用命令“mkdir”,命令格
式如下:

mkdir [参数] [文件夹名目录名]

主要参数如下:
-p 如所要创建的目录其上层目录目前还未创建,那么会一起创建上层目录。

文件及目录删除命令—rm

既然有创建文件的命令,那肯定有删除文件的命令,要删除一个文件或者文件夹可以使用
命令“rm”,此命令可以完成删除一个文件或者多个文件及文件夹,它可以实现递归删除。对于
链接文件,只删除链接,原文件保持不变,所谓的链接文件,其实就是 Windows 下的快捷方式
文件,此命令格式如下:

rm [参数] [目的文件或文件夹目录名]

命令主要参数如下:
-d 直接把要删除的目录的硬连接数据删成 0,删除该目录。
-f 强制删除文件和文件夹(目录)。 -i 删除文件或者文件夹(目录)之前先询问用户。
-r 递归删除,指定文件夹(目录)下的所有文件和子文件夹全部删除掉。
-v 显示删除过程。

文件夹(目录)删除命令rmdir

上面我们讲解了如何使用命令“rm”删除文件夹,那就是要加上参数“-rf”,其实 Linux 提
供了直接删除文件夹(目录)的命令—rmdir,它可以不加任何参数的删除掉指定的文件夹(目录), 命令格式如下:

rmdir [参数] [文件夹(目录)]

命令主要参数如下:
-p 删除指定的文件夹(目录)以后,若上层文件夹(目录)为空文件夹(目录)的话就将其一起
删除。

文件复制命令cp

Linux 下的复制命令为“cp”,命令描述如下:

cp [参数] [源地址] [目的地址]

主要参数描述如下:
-a 此参数和同时指定“-dpR”参数相同
-d 在复制有符号连接的文件时,保留原始的连接。
-f 强行复制文件,不管要复制的文件是否已经存在于目标目录。
-I 覆盖现有文件之前询问用户。
-p 保留源文件或者目录的属性。
-r 或-R 递归处理,将指定目录下的文件及子目录一并处理

文件移动命令—mv

有时候我们需要将一个文件或者文件夹移动到另外一个地方去,或者给一个文件或者文件
夹进行重命名,这个时候我们就可以使用命令“mv”了,此命令格式如下:

mv [参数] [源地址] [目的地址]

主要参数描述如下:
-b 如果要覆盖文件的话覆盖前先进行备份。
-f 若目标文件或目录与现在的文件重复,直接覆盖目的文件或目录。
-I 在覆盖之前询问用户。

文件压缩和解压缩

  1. 命令 zip
    zip 命令看名字就知道是针对.zip 文件的,用于将一个或者多个文件压缩成一个.zip 结尾的文件,命令格式如下:

    zip [参数] [压缩文件名.zip] [被压缩的文件]
    zip -rv test2.zip test2
    

    主要参数函数如下:
    -b<工作目录> 指定暂时存放文件的目录。
    -d 从 zip 文件中删除一个文件。
    -F 尝试修复已经损毁的压缩文件。
    -g 将文件压缩入现有的压缩文件中,不需要新建压缩文件。
    -h 帮助。
    -j 只保存文件的名,不保存目录。
    -m 压缩完成以后删除源文件。
    -n<字尾符号> 不压缩特定扩展名的文件。
    -q 不显示压缩命令执行过程。
    -r 递归压缩,将指定目录下的所有文件和子目录一起压缩。
    -v 显示指令执行过程。
    -num 压缩率,为 1~9 的数值。

  2. 命令 unzip
    unzip 命令用于对.zip 格式的压缩包进行解压,命令格式如下:

     unzip [参数] [压缩文件名.zip]
     unzip test2.zip
    

    主要参数如下:
    -l 显示压缩文件内所包含的文件。
    -t 检查压缩文件是否损坏,但不解压。
    -v 显示命令显示的执行过程。
    -Z 只显示压缩文件的注解。
    -C 压缩文件中的文件名称区分大小写。
    -j 不处理压缩文件中的原有目录路径。
    -L 将压缩文件中的全部文件名改为小写。
    -n 解压缩时不要覆盖原有文件。
    -P<密码> 解压密码。
    -q 静默执行,不显示任何信息。
    -x<文件列表> 指定不要处理.zip 中的哪些文件。
    -d<目录> 把压缩文件解到指定目录下。

  3. 命令 tar
    我们前面讲的 zip 和 unzip 这两个是命令只适用于.zip 格式的压缩和解压,其它压缩格式就
    用不了了,比如 Linux 下最常用的.bz2 和.gz 这两种压缩格式。其它格式的压缩和解压使用命令
    tar,tar 将压缩和解压缩集合在一起,使用不同的参数即可,命令格式如下:

     tar [参数] [压缩文件名] [被压缩文件名]
     tar -vcjf test1.tar.bz2 test1
     tar -vczf test1.tar.gz test1
     tar -vczf test.tar.gz *        //压缩当前文件夹下非隐藏文件的文件
     tar -vczf test.tar.gz .[!.]*  //压缩当前文件夹下隐藏文件排除两个隐藏文件夹"."和“..”
     tar -vczf test.tar  #`ls -a`   //全部压缩
    

    常用参数如下:
    -c 创建新的压缩文件。
    -C<目的目录> 切换到指定的目录。
    -f<备份文件> 指定压缩文件。
    -j 用 tar 生成压缩文件,然后用 bzip2 进行压缩。
    -k 解开备份文件时,不覆盖已有的文件。
    -m 还原文件时,不变更文件的更改时间。
    -r 新增文件到已存在的备份文件的结尾部分。
    -t 列出备份文件内容。
    -v 显示指令执行过程。
    -w 遭遇问题时先询问用户。
    -x 从备份文件中释放文件,也就是解压缩文件。
    -z 用 tar 生成压缩文件,用 gzip 压缩。
    -Z 用 tar 生成压缩文件,用 compress 压缩。

    使用如下所示两行命令完成.bz2 和.gz 格式文件的解压缩:

     tar -vxjf test1.tar.bz2                 //解压.tar.bz2
     sudo tar -vcjf rootfs.tar.bz2 *         //压缩.tar.bz2
     
     tar -vxzf test2.tar.gz	                 //解压.tar.gz
     sudo tar -vczf test2.tar.gz *	         //压缩.tar.gz
     
     -C选项:
     tar -vxzf test3.tar.gz -C test //解压到test文件夹
    

    上述两行命令中,-vxjf 用来完成.bz2 格式压缩文件的解压,-vxzf 用来完成.gz 格式压缩文
    件的解压。

文件查询和搜索

1、命令 find
find 命令用于在目录结构中查找文件,其命令格式如下:

find [路径] [参数] [关键字]

路径是要查找的目录路径,如果不写的话表示在当前目录下查找,关键字是文件名的一部
分,主要参数如下:
-name 按照文件名称查找,查找与 filename 匹配的文件,可使用通配符。
-depth 从指定目录下的最深层的子目录开始查找。
-gid<群组识别码>查找符合指定的群组识别码的文件或目录。
-group<群组名称> 查找符合指定的群组名称的文件或目录。
-size<文件大小> 查找符合指定文件大小的文件。
-type<文件类型> 查找符合指定文件类型的文件。
-user<拥有者名称> 查找符合指定的拥有者名称的文件或目录。
搜索目录/etc 中以“vim”开头的文件为例

find /etc/ -name vim*

2、命令 grep
find 命令用于在目录中搜索文件,我们有时候需要在文件中搜索一串关键字,grep 就是完
成这个功能的,grep 命令用于查找包含指定关键字的文件,如果发现某个文件的内容包含所指
定的关键字,grep 命令就会把包含指定关键字的这一行标记出来,grep 命令格式如下:
grep [参数] 关键字 文件列表
grep 命令一次只能查一个关键字,主要参数如下:
-b 在显示符合关键字的那一列前,标记处该列第 1 个字符的位编号。
-c 计算符合关键字的列数。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用此参数!否则 grep 指令
将回报信息并停止搜索。
-i 忽略字符大小写。
-v 反转查找,只显示不匹配的行。
-r 在指定目录中递归查找。
比如我们在目录/usr 下递归查找包含字符“Ubuntu”的文件

grep -ir "Ubuntu" /usr

文件类型

这里的文件类型不是说这个文件是音乐文件还是文本文件,在用户根目录下使用命令“ls
-l”来查看用户根目录下所有文件的详细信息
在这里插入图片描述
每个文件的详细信息占一行,每行最前面都是一个符号就标记了当前文
件类型,比如 autofs的第一个字符是“c”,buf 文件第一个字符是“d”。这些字符表示
的文件类型如下:

  • 普通文件,一些应用程序创建的,比如文档、图片、音乐等等。
    d 目录文件。
    c 字符设备文件,Linux 驱动里面的字符设备驱动,比如串口设备,音频设备等。
    b 块设备文件,存储设备驱动,比如硬盘,U 盘等。
    l 符号连接文件,相当于 Windwos 下的快捷方式。
    s 套接字文件。
    p 管道文件,主要指 FIFO 文件。

Ubuntu 用户系统

Ubuntu 是一个多用户系统,我们可以给不同的使用者创建不同的用户账号,每个用户使用
各自的账号登陆,使用用户账号的目的一是方便系统管理员管理,控制不同用户对系统的访问
权限,另一方面是为用户提供安全性保护。
我们前面在安装 Ubuntu 系统的时候被要求创建一个账户,当我们创建好账号以后,系统会
在目录/home 下以该用户名创建一个文件夹,所有与该用户有关的文件都会被存储在这个文件
文件夹中。同样的,创建其它用户账号的时候也会在目录/home 下生成一个文件夹来存储该用
户的文件

装系统的时候创建的用户其权限比后面创建的用户大一点,但是没有 root 用户权限大,
Ubuntu 下用户类型分为以下 3 类:
● 初次创建的用户,此用户可以完成比普通用户更多的功能。
● root 用户,系统管理员,系统中的玉皇大帝,拥有至高无上的权利。
● 普通用户,安装完操作系统以后被创建的用户。
以上三种用户,每个用户都有一个 ID 号,称为 UID,操作系统通过 UID 来识别是哪个用
户,用户相关信息可以在文件/etc/passwd 中查看到
在这里插入图片描述
从配置文件 passwd 中可以看到,每个用户名后面都有两个数字,比如用户“root”
后面“0:0”,第一个数字是用户的 ID,另一个是用户的 GID,也就是用户组 ID。Ubuntu
里面每个用户都属于一个用户组里面,用户组就是一组有相同属性的用户集合。

权限管理

对于一个文件通常有三种权限:读®、写(w)和执行(x),使用命令“ls -l”可以查看某个目
录下所有文件的权限信息
在这里插入图片描述

drwxrwxr-x 3 zys zys 4096 3月  21 10:12 driver

其中“drwxrwxr-x”表示文件权限与用户和用户组之间的关系,第一位表示文件类型,d 文件夹。剩下的 9 位以 3 位为一组,分别表示文件拥有者的权限,文件拥有者所在用户组
的权限以及其它用户权限。后面的“zys zys”分别代表文件拥有者(用户)和该
用户所在的用户组,因此文件 driver 的权限情况如下:
①、文件 driver 的拥有者是用户 zys,其对文件 driver 的权限是“rwx”,也就是对该
文件拥有读写和执行三种权限。
②、用户 zys 所在的用户组也叫做 zys,其组内用户对于文件 driver 的权
限是“rwx”。
③、其它用户对于文件 driver 的权限是“r-x”,可以读,可以执行。
对于文件,可读权限表示可以打开查看文件内容,可写权限表示可以对文件进行修改,可
执行权限就是可以运行此文件(如果是软件的话)。对于文件夹,拥有可读权限才可以使用命令 ls
查看文件夹中的内容,拥有可执行权限才能进入到文件夹内部。
如果某个用户对某个文件不具有相应的权限的话就不能进行相应的操作,比如根目录“/”
下的文件只有 root 用户才有权限进行修改,如果以普通用户去修改的话就会提示没有权限。

修改文件权限

修改test文件的权限为-r—w---x

chmod 421 test2.sh

在这里插入图片描述

chmod u+x build.sh
chmod u-x build.sh
注:普通文件一般不能给执行权限,目录是必须有执行权限的,要不然无法进入目录
    如果需要同时修改目录及目录下的子文件,需要加 -R,表示递归

修改文件所有者

将test2.sh 所有者改为 toms

chown toms test2.sh   

修改文件所属用户组

首先我们查看下系统目前的所属组,可以使用命令:cat /etc/passwd 可以查看所有用户的列表

w 可以查看当前活跃的用户列表

cat /etc/group 查看用户组

将文件test2.sh用户所属组改为 toms

chgrp toms test2.sh

字符设备驱动相关

cat /proc/devices	//查看当前系统中已经使用了那些设备号
lsmod	//查看已经挂载的设备
mknod /dev/led c 200 0 //手动创建设备节点
ls /dev	//查看设备节点

后台运行线程

命令后加"&" 表示后台运行

./spinlockApp /dev/spinlockled 1&

查看动态库so是否包含某个接口

nm libmy_modbus.so | grep modbus_strerror

在这里插入图片描述
T 代表已实现

U 代表未实现,可能在其它库中实现.这时此库的链接顺序应放在实现此函数的库的前面。

查询端口占用情况

ps aux |grep 8080
netstat -an |grep 8080

推荐使用

lsof -i:8080

gcc常用选项

GCC 编译器在编译一个C语言程序时需要经过以下 4 步:

  1. 将C语言源程序预处理,生成.i文件。
  2. 预处理后的.i文件编译成为汇编语言,生成.s文件。
  3. 将汇编语言文件经过汇编,生成目标文件.o文件。
  4. 将各个模块的.o文件链接起来生成一个可执行程序文件。
  5. 在这里插入图片描述

常用编译命令选项

  1. 无选项
    用法:gcc test.c
    作用:将test.c预处理、汇编、编译并链接形成可执行文件。
    这里未指定输出文件,默认输出为a.out。

  2. 选项 -o
    用法:gcc test.c -o test
    作用:将test.c预处理、汇编、编译并链接形成可执行文件test。
    -o选项用来指定输出文件的文件名。

  3. 选项 –E
    预处理指定的源文件,不进行编译。
    将C语言源文件进行预处理,但是并不编译该程序。对于一般的预处理问题,可以使用这个选项进行查看,例如,宏的展开问题、文件的包含问题等。

    用法:gcc -E test.c -o test.i
    作用:将test.c预处理输出test.i文件。

  4. 选项 –S
    将C语言源文件编译为汇编语言,但是并不汇编该程序。

    用法:gcc -S test.i
    作用:将预处理输出文件test.i汇编成test.s文件。

  5. 选项 –c
    编译、汇编指定的源文件,但是不进行链接

    用法:gcc -c test.s
    作用:将汇编输出文件test.s编译输出test.o文件。

  6. 选项 -o

    用法:gcc test.o -o test
    作用:将编译输出文件test.o链接成最终可执行文件test。

  7. 选项-O

    用法:#gcc -O1 test.c -o test

    作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。

  8. 选项-I directory
    大写i
    用法:指定 include 包含文件的搜索目录

  9. 选项-g 生成调试信息,该程序可以被调试器调试

  10. 选项 –L directory 指定库文件目录

gcc编译指定头文件路径

将.c编译成.o文件 头文件目录…/include

gcc -c dev_list.c -I ../include

磁盘管理

Linux 的磁盘管理体系和 Windows 有很大的区别,在 Windows 下经常会遇到“分区”这个

概念,在 Linux 中一般不叫“分区”而叫“挂载点”。 “挂载点”就是将一个硬盘的一部分做
成文件夹的形式,这个文件夹的名字就是“挂载点”,不管在哪个发行版的 Linux 中,用户是绝
对看到不到 C 盘、D 盘这样的概念的,只能看到以文件夹形式存在的“挂载点”.

在这里插入图片描述

设备挂载

挂载其实可以理解为让U盘挂载我们电脑上某一个文件夹下,这个文件夹作为一个接口,帮助我们访问U盘。

把sdc1挂载到usb文件夹下

sudo mkdir usb
sudo mount /dev/sdc1 /usb

取消挂载

sudo umount /dev/sdc1

设置tab键为4字节

VI 编辑器默认 TAB 键为 8 空格,我们改成 4 空格,用 vi 打开文件/etc/vim/vimrc,在此文
件最后面输入如下代码:
在这里插入图片描述

vim显示行号

在文件/etc/vim/vimrc 中添加:
在这里插入图片描述

屏幕作为终端

  1. uboot中设置bootargs
    在这里插入图片描述

    setenv bootargs 'console=tty1 console=ttymxc0,115200 rw root=/dev/nfs nfsroot=192.168.2.136:/home/zys/linux/nfs/rootfs ip=192.168.2.157:192.168.2.136:192.168.2.1:255.255.255.0::eth0:off'
    

    打开开发板根文件系统中的/etc/inittab 文件
    在这里插入图片描述

打开linux内核的图形化配置界面,make menuconfig

在这里插入图片描述

ubuntu下ftp服务

安装ftp
sudo apt-get install vsftpd
sudo vi /etc/vsftpd.conf
修改 取消屏蔽
local_enable=YES
write_enable=YES
重启服务
sudo /etc/init.d/vsftpd restart

tftp服务

sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd
mkdir /home/zys/linux/tftpboot
chmod 777 /home/zys/linux/tftpboot
安装完成以后新建文件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d 目话自行创建,然后在里面输入如下内容:

server tftp
{
 socket_type = dgram
 protocol = udp
 wait = yes
 user = root
 server = /usr/sbin/in.tftpd
 server_args = -s /home/zys/linux/tftpboot/ 
 disable = no
 per_source = 11
 cps = 100 2 
 flags = IPv4
}

启动 tftp 服务
sudo service tftpd-hpa start
打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容:

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/zys/linux/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"

重启服务
sudo service tftpd-hpa restart
测试下载文件

tftp 80800000 192.168.2.187:zImagetftp 80800000 zImage

nfs服务

sudo apt-get install nfs-kernel-server rpcbind
创建一个文件夹 当做nfs的目录
sudo vi /etc/exports
在最后添加刚刚创建的文件路径
/home/zys/linux/nfs *(rw,sync,no_root_squash)
重启
sudo /etc/init.d/nfs-kernel-server restart

开启ssh远程登录

sudo apt-get install openssh-server
ssh 的配置文件为/etc/ssh/sshd_config

交叉编译器 arm-linux-gnueabihf-gcc

sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
修改环境变量,使用 VI 打开/etc/profile 文件
sudo vi /etc/profile
打开/etc/profile 以后,在最后面输入如下所示内容:
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
重启ubuntu
在使用交叉编译器之前还需要安装一下其它的库
sudo apt-get install lsb-core lib32stdc++6
arm-linux-gnueabihf-gcc -v

“arm-linux-gnueabihf-gcc”的含义如下:
1、arm 表示这是编译 arm 架构代码的编译器。
2、linux 表示运行在 linux 环境下。
3、gnueabihf 表示嵌入式二进制接口。
4、gcc 表示是 gcc 工具

查询设备号

输入命令“cat /proc/devices”可以查看当前已经被使用掉的设备号

vscode文件路径指定

编写 Linux 驱动,因此会用到 Linux 源码中的函数。我们需要在 VSCode 中添加 Linux
源码中的头文件路径。打开 VSCode,按下“Crtl+Shift+P”打开 VSCode 的控制台,然后输入
“C/C++: Edit configurations(JSON) ”,打开 C/C++编辑配置文件,打开以后会自动在.vscode 目录下生成一个名为 c_cpp_properties.json 的文件

编译设备树

在linux根目录下执行make all 或者 make dtbs,前者是编译所有东西,包括zImage,.ko驱动及设备树,后面是只编译设备树。

如何确定编译哪个dts文件呢?在arch/arm/boot/dts/Makefile,
c dtb-$(CONFIG_SOC_IMX6ULL) += \ imx6ull-14x14-ddr3-arm2.dtb \ imx6ull-14x14-ddr3-arm2-adc.dtb \ imx6ull-14x14-ddr3-arm2-cs42888.dtb \ imx6ull-14x14-ddr3-arm2-ecspi.dtb \ imx6ull-14x14-ddr3-arm2-emmc.dtb \
当选中 I.MX6ULL 这个 SOC 以后(CONFIG_SOC_IMX6ULL=y),所有使用到
I.MX6ULL 这个 SOC 的板子对应的.dts 文件都会被编译为.dtb。如果我们使用 I.MX6ULL 新做
了一个板子,只需要新建一个此板子对应的.dts 文件,然后将对应的.dtb 文件名添加到 dtb-
$(CONFIG_SOC_IMX6ULL)下,这样在编译设备树的时候就会将对应的.dts 编译为二进制的.dtb
文件。
设备树语法参考 Devicetree SpecificationV0.2.pdf

设备树相关指令

  • 设备树在源码中的位置

     /home/zys/linux/IMX6ULL/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek/arch/arm/boot/dts
    
  • 编译所有dts,在源码根目录下

      make dtbs
    
  • 编译指定dts

      make xxx.dtb
    
  • 编译完成拷贝dtb到tftb文件夹

      cp arch/arm/boot/dts/imx6ull-alientek-nand.dtb /home/zys/linux/tftpboot/ -f
    
  • 查看设备树节点

      ls /proc/device-tree
    
  • 查看设备树中节点文件的内容

      cat /proc/device-tree/alphaled/name
    

编译脚本编写

新建一个capp.sh

#! /bin/bash
arm-linux-gnueabihf-gcc $1.c -o $1
file $1 #32位LSB ARM版本的
sudo cp $1 /home/zys/linux/nfs/rootfs/lib/modules/4.1.15 -f

chmod 777 capp.sh //修改权限
./capp.sh testApp //运行 编译testApp.c 为 testApp可执行文件

解析:
$1 代表接收的第一个参数 第0个参数是./capp.sh 第一个参数就是编译的文件名

开机自启动

p998
在这里插入图片描述

编译u-boot

  1. 编译之前先安装 ncurses 库,否则编译会报错,
    sudo apt-get install libncurses5-dev
  2. 将uboot放在ubuntu的/home/zys/linux/uboot中,uboot在开发板光盘->1、例程源码->3、正点原子 Uboot 和 Linux 出厂源码-> uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2。
  3. 解压
    tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2
  4. 编写脚本(编译uboot),mx6ull_alientek_nand.sh
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- disclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr256_nand_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
  1. 使用 chmod 命令给予 mx6ull_alientek_nand.sh 文件可执行权限,然后就可以使用这个 shell
    脚本文件来重新编译 uboot,命令如下:
    ./mx6ull_alientek_nand.sh
  2. 编译好之后就可以进行烧写了,这里烧写到sd里,然后以sd启动。
    在这里插入图片描述
    可以看出 插上sd卡之后 sdb就是sd卡
    ./imxdownload u-boot.bin /dev/sdb

Linux内核编译

编译内核步骤:

  1. make distclean
  2. make imx_alientek_nand_defconfig(配置 重要 有两种方式)
  3. make menuconfig(可选)
  4. make j8

内核编译方式一 使用脚本

./imx6ull_alientek_nand.sh

配置文件为arch/arm/configs/imx_alientek_nand_defconfig

内核编译方式二 默认配置

make menuconfig图形化配置,完成后会生成.config
make
同样的 也可以直接指定配置文件
make imx_v7_defconfig,完成后会生成.config
make

配置完成后,.config 保存着 Linux 最终的配置信息,编译 Linux 的时候会读取此文件中
的配置信息。最终根据配置信息来选择编译 Linux 哪些模块,哪些功能。

下面使用方式一来编译内核

  1. ./im6ull-alientek-nand.sh
    生成zImage说明编译成功在这里插入图片描述

  2. 编译完成得到zImage和imx6ull-14x14-evk.dtb,然后把这个两个文件拷贝到tftp里

     cp arch/arm/boot/zImage /home/zys/linux/tftpboot/ -f
     cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb /home/zys/linux/tftpboot/ -f
    
  3. 从网络启动 Linux 系统
    这里我们使用 tftp 从 Ubuntu 中下载 zImage 和设备树文件
    在这里插入图片描述

setenv bootargs 'console=tty1 console=ttymxc0,115200 rw root=/dev/nfs nfsroot=192.168.2.136:/home/zys/linux/nfs/rootfs ip=192.168.2.157:192.168.2.136:192.168.2.1:255.255.255.0::eth0:off'
setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-nand.dtb;bootz 80800000 - 83000000'
saveenv

如果出现内核崩溃,说明没有挂载成功网络文件系统。
因为我是新装的一台机器,直接把虚拟机里做好的rootfs文件夹拷贝到新机器里,所以出现了挂载失败的问题。这里需要在虚拟机rootfs文件夹中进行打包,将当前文件夹内所有内容打包
打包和解压

tar -vczf rootfs.tar.gz *
tar -vxzf rootfs.tar.gz -C rootfs

sudo tar -vcjf rootfs.tar.bz2 *

在这里插入图片描述

后台运行

命令后面加 &

任务管理器

top
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值