Linux
1. Linux 内核知识
1.1 内核源码目录
路径 | 存放内容 |
---|---|
/arch | 不同CPU架构下的核心代码。其中的每一个子目录都代表Linux支持的CPU架构 ,比如arm,x86,MIPS,PPC等 |
/block | block目录下放的是一些linux存储体系中关于块设备管理的代码;譬如说SD卡、iNand、Nand、硬盘等都是块设备。你几乎可以认为块设备就是存储设备 |
/crypto | 常见的加密算法的C语言实现代码,譬如crc32、md5、sha1等 |
/Documentation | 说明文档,对每个目录的具体作用进行说明 |
/drivers | 内核中所有设备的驱动程序,其中的每一个子目录对应一种设备驱动 |
/firmware | 固件代码,固件其实是软件,不过这个软件是固话到IC里面运行的,所以叫固件 |
/fsLinux | 支持的文件系统代码,及各种类型的文件的操作代码。每个子目录都代表Linux支持的一种文件系统类型 |
/include | 头文件目录,公共的(各种CPU架构共用的)头文件都在这里。每种CPU架构特有的一些头文件在arch/arm/include目录及其子目录下 |
/init | init是初始化的意思,这个目录下的代码就是linux内核启动时初始化内核的代码 |
/ipc | 内核中进程间的通信代码 |
/kernel | Linux核心功能源码,主要包括程序调度,控制进程,模块化等等 |
/lib | lib是库的意思,这里面都是一些公用的有用的库函数,注意这里的库函数和C语言的库函数不一样的。在内核编程中是不能用C语言标准库函数,这里的lib目录下的库函数就是用来替代那些标准库函数的。比如在内核中要把字符串转成数字用atoi,但是内核编程中只能用lib目录下的atoi函数,不能用标准C语言库中的atoi。再比如在内核中要打印信息时不能用printf,而要用printk,这个printk就是我们这个lib目录下的 |
/mm | 内存管理代码,譬如页式存储管理内存的分配和释放等 |
/net | 网络通信相关代码 ,譬如TCP/IP协议栈等都在这里 |
/samples | 内核编程的示例代码 |
/scripts | 脚本,这个目录下全部是脚本文件,这些脚本文件不是linux内核工作时使用的,而是用来辅助对linux内核进行配置编译生成的,比如裁剪内核等等 |
/security | 安全性相关的代码 |
/sound | 音频设备的驱动程序 |
/tools | Linux中的常用工具 |
/usr | 内核启动相关的代码 |
/virt | 内核虚拟机相关的代码 |
/Kbuild | Kbuild是kernel build的意思,就是内核编译的意思。这个文件就是linux内核特有的内核编译体系需要用到的文件 |
/Makefile | 这个是linux内核的总makefile,整个内核工程是用这个Makefile来管理的 |
1.2 内核修改
1.3 内核编译
1.4 内核启动流程
参考链接
2. Linux 目录结构
在 Linux 系统中,所有内容都是以文件的形式保存和管理的,即「一切皆文件」。普通文件是文件,目录(Windows 下称为文件夹)是文件,硬件设备(键盘、监视器、硬盘、打印机)是文件,就连套接字(socket)、网络通信等资源也都是文件。
linux只有一个根目录,而且文件和目录被组织成一个单根倒置树结构,此结构最上层是根目录,用“/”表示根文件系统(rootfs):root filesystem 标准Linux文件系统(如:ext4),如下图:
关于目录结构:
-
系统启动必须项:
- /boot:这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。如kernel,grub(引导装载程序)等
- /etc:etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。更改目录下的文件可能会导致系统不能启动。
- /etc/resolv.conf linux系统DNS客户端配置文件,DNS(Domain Name System)在网站的运行中起到了至关重要的作用,其主要负责将网站域名解析为对应的IP地址。
- /etc/hostname 主机名配置文件 hostnamectl set-hostname itlaoxin 这个命令会直接修改配置文件
- /etc/hosts 设定用户IP与名字(或域名)的对应解析表,相当于本地(局域网内)的DNS解析文件,Linux系统下的这个/etc/hosts类似于C:\WINDOWS\system32\drivers\etc\hosts文件
- /etc/fstab:配置开机设备自动挂载的文件
- /etc/inittab:系统启动时设定运行级别等配置的文件
- /etc/profile及/etc/bashrc:配置系统的环境变量/别名等的文件
- /etc/profile.d:用户登录后执行的脚本所在的目录
- /etc/init.d:软件启动程序所在的目录(centos7之前),centos7之后这个目录已经不用了。
- /etc/motd:配置用户登录系统之后显示提示内容的文件
- /etc/redhat-release:查看Red Hat版本号和名称信息的文件
- /etc/sysctl.conf:Linux内核参数设置文件
- /lib:lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。
- /sys:这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
-
运行过程中要用:
- /var:var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。mysql: /var/lib/mysql,vsftpd: /var/ftp,mail: /var/spool/mail,cron: /var/spool/cron
- /var/log:记录系统及软件运行信息文件所在的目录
- /var/log/secure:用户登录信息日志文件
- /var/log/dmesg:记录硬件信息加载情况的日志文件
- /var/tmp:临时文件 (主要是程序产生的临时文件)
- /proc:proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件。这个目录是一个虚拟的目录,它是系统内存的映射,反映出来的是内核,进程信息或实时状态,我们可以通过直接访问这个目录来管理内存空间、获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
- /proc/cpuinfo 当前cpu相关的信息
- /proc/meminfo 当前内存信息
- /proc/loadavg 当前平均负载相关的信息
- /proc/mounts 当前挂载相关的信息
- /var:var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。mysql: /var/lib/mysql,vsftpd: /var/ftp,mail: /var/spool/mail,cron: /var/spool/cron
-
账户:
- /root:
该目录为系统管理员,也称作超级权限者的用户主目录。 - /home:用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
- /usr:usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。
- /usr/local:相当于C:\Program
- /usr/bin:系统用户使用的应用程序。
- /usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序。
- /usr/src:内核源代码默认的放置目录。
指令集和:
- /bin:bin 是 Binaries (二进制文件) 的缩写,这个目录存放着最经常使用的命令。/bin、/usr/bin 是给系统用户使用的指令(除 root 外的通用用户),而/sbin, /usr/sbin 则是给 root 使用的指令。
- /sbin:s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。
- /root:
-
外部文件管理:
- /dev:dev 是 Device(设备) 的缩写,该目录下存放的是 Linux 的外部设备。如 /dev/sda,/dev/tty1,dev/tty2,/dev/pts/1等。在 Linux 中访问设备的方式和访问文件的方式是相同的。
- /media:linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。
- /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。misc automount进程挂载,net automount进程挂载
临时文件: - /run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
- /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
- /tmp:tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。
-
扩展用的:
- /opt:opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的
- /srv:该目录存放一些服务启动之后需要提取的数据。(不用服务器就是空)
- /selinux:这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
3. Linux 命令总结
-
关机/重启/注销
-
关机
shutdown -h now // 即刻关机 shutdown -h 10 // 10分钟后关机 shutdown -h 11:00 // 11:00关机 shutdown -h +10 // 预定时间关机(10分钟后) shutdown -c // 取消指定时间关机 init 0 // 立刻关机 telinit 0 // 关机 poweroff // 立刻关机 halt // 关机
-
重启
shutdown -r now // 重启 shutdown -r 10 // 10分钟之后重启 shutdown -r 11:00 // 定时重启 reboot // 重启 init 6 // 重启
-
注销
logout // 退出登录Shell
-
buff数据同步到磁盘
sync // buff数据同步到磁盘
-
-
系统信息和性能查看
-
查看内核/CPU等信息
uname -a // 查看内核/OS/CPU信息 uname -r // 查看内核版本 uname -m // 查看处理器架构 arch // 查看处理器架构 cat /proc/cpuinfo // 查看CPU信息
-
查看内存信息
grep MemTotal /proc/meminfo // 查看内存总量 grep MemFree /proc/meminfo // 查看空闲内存量 free -m // 查看内存⽤量和交换区⽤量
-
查看系统信息
hostname // 查看计算机名 cat /proc/version // 查看linux版本信息 env // 查看系统的环境变量 lsusb -tv // 查看系统USB设备信息 lspci -tv // 查看系统PCI设备信息 lsmod // 查看已加载的系统模块 date // 显示系统⽇期时间 cal 2021 // 显示2021⽇历表 cat /proc/interrupts // 查看中断 cat /proc/loadavg // 查看系统负载 uptime // 查看系统运⾏时间、⽤户数、负载
-
进程
ps -ef // 查看所有进程 ps -ef | grep <key> // 过滤出你需要的进程 kill -s <name> // kill指定名称的进程 kill -s <pid> // kill指定pid的进程
-
查看系统动态信息
top // 动态显示cpu/内存/进程等情况 vmstat 1 20 // 每1秒采⼀次系统状态,采20次 iostat // 查看io读写/cpu使⽤情况 sar -u 1 10 // 查询cpu使⽤情况(1秒⼀次,共10次) sar -d 1 10 // 查询磁盘性能
-
-
⽹络管理
-
查看网络信息
ifconfig // 查看⽹络接⼝属性 ifconfig eth0 // 查看某⽹卡的配置 iptables -L // 查看iptables规则 host www.codesheep.cn // 解析主机名 nslookup www.codesheep.cn // 查询DNS记录,查看域名解析是否正常 netstat -lntp // 查看所有监听端⼝ netstat -antp // 查看已经建⽴的TCP连接 netstat -lutp // 查看TCP/UDP的状态信息 route -n // 查看路由表
-
管理网络
ifconfig eth0 192.168.1.1 netmask 255.255.255.0 // 配置ip地址 ifup eth0 // 启⽤eth0⽹络设备 ifdown eth0 // 禁⽤eth0⽹络设备 dhclient eth0 // 以dhcp模式启⽤eth0 route add -net 0/0 gw Gateway_IP // 配置默认⽹关 route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 // 配置静态路由到达⽹络'192.168.0.0/16'
-
-
磁盘和分区
-
查看磁盘及分区
fdisk -l // 查看所有磁盘分区 swapon -s // 查看所有交换分区 df -h // 查看磁盘使⽤情况及挂载点 du -sh /dir // 查看指定某个⽬录的⼤⼩ du -sk * | sort -rn // 从⾼到低依次显示⽂件和⽬录⼤⼩
-
挂载磁盘
mount /dev/hda2 /mnt/hda2 // 挂载hda2盘 mount -t ntfs /dev/sdc1 /mnt/usbhd1 // 指定⽂件系统类型挂载(如ntfs) mount -o loop xxx.iso /mnt/cdrom // 挂载iso⽂件 mount /dev/sda1 /mnt/usbdisk // 挂载usb盘/闪存设备 umount -v /dev/sda1 // 通过设备名卸载 umount -v /mnt/mymnt // 通过挂载点卸载 fuser -km /mnt/hda1 // 强制卸载(慎⽤)
-
-
⽤户和⽤户组
-
查看用户信息
who // 显示当前登录系统的⽤户 who am i // 显示登录时的⽤户名 whoami // 显示当前⽤户名
-
创建用户和用户组
useradd <user_name> // 创建⽤户 groupadd <group_name> // 创建⽤户组
-
修改用户和用户组
usermod -g <group_name> <user_name> // 修改⽤户的组 usermod -aG <group_name> <user_name> // 将⽤户添加到组 usermod -s /bin/ksh -d /home/codepig –g dev codesheep // 修改⽤户codesheep的登录Shell、主⽬录以及⽤户组 passwd // 修改⼝令 passwd <user_name> // 修改某⽤户的⼝令 groupmod -n <new_name> <old_name> // 重命名⽤户组
-
查看用户和用户组
groups <user_name> // 查看user_name⽤户所在的组 w // 查看活动⽤户 id <user_name> // 查看指定⽤户codesheep信息 last // 查看⽤户登录⽇志 crontab -l // 查看当前⽤户的计划任务 cut -d: -f1 /etc/passwd // 查看系统所有⽤户 cut -d: -f1 /etc/group // 查看系统所有组
-
删除用户和用户组
userdel -r <user_name> // 删除⽤户 groupdel <group_name> // 删除⽤户组
-
切换用户
su - <user_name> // 完整切换到⼀个⽤户环境
-
-
系统服务命令
-
查看服务
chkconfig --list // 列出系统服务 service <service_name> status // 查看某个服务 systemctl status <service_name> // 查看某个服务
-
启动服务
service <service_name> start // 启动某个服务 systemctl start <service_name> // 启动某个服务
-
终止服务
service <service_name> stop // 终⽌某个服务 systemctl stop <service_name> // 终⽌某个服务
-
重启服务
service <service_name> restart // 重启某个服务 systemctl restart <service_name> // 重启某个服务
-
服务自启动
systemctl enable <service_name> // 开启⾃启动 systemctl disable <service_name> // 关闭⾃启动
-
-
⽂件和⽬录操作
-
切换目录
cd <dir_name> // 进⼊某个⽬录 cd // 进个人主⽬录 cd - // 回上一步所在的⽬录
-
查看目录和文件
pwd // 显示当前路径 ls // 查看⽂件⽬录列表 ls -F // 查看⽬录中内容(显示是⽂件还是⽬录) ls -l // 查看文件和目录的详情列表 ls -a // 查看隐藏文件 ls -lh // 查看文件和目录的详情列表(增强文件大小易读性) ls -lSr // 查看文件和目录的树形结构
-
创建目录和文件
mkdir <dir> // 创建目录 mkdir <dir1> <dir2> // 同时创建两个目录 mkdir -p </dir1/dir2> // 创建目录树
-
移除目录和文件
rm -f <file1> // 删除file1文件 rmdir <dir1> // 删除dir1目录 rm -rf <dir1> // 删除dir1目录及其内容 rm -rf <dir1> <dir2> // 同时删除多个目录及其内容
-
移动/复制目录和文件
mv <old_dir> <new_dir> // 重命名/移动目录 cp <file1> <file2> // 复制文件 cp -a <dir1> <dir2> // 复制目录
-
建立链接
ln -s <file1> <link1> // 创建指向文件/目录的软链接 ln <file1> <link1> // 创建指向文件/目录的物理链接
-
查找文件
find / -name <file1> // 从根目录开始搜索文件/目录 find / -user <user1> // 从根目录开始搜索用户user1的文件/目录 find /dir -name *.bin // 在目录/dir中搜索带有.bin后缀的文件 locate <file> // 快速定位文件 locate*.mp4 // 寻找.mp4结尾的文件 whereis <file> // 显示某二进制文件/可执行文件的路径 which <file> // 查找系统目录下某二进制文件
-
修改目录和文件的权限属性
chmod ugo+rwx <dir1> // 设置目录所有者(u)、群组(g)及其他人(o)的读(r)写(w)执行(x)权限 chmod go-rwx <dir1> // 移除群组与其他人对目录的读写执行权限 chown <user1> <file1> // 改变文件的所有者属性 chown -R <user1> <dir1> // 改变目录的所有者属性 chgrp <group1> <file1> // 改变文件群组 chown <user1>:<group1> <file1> // 改变文件的所有人和群组
-
查看文件内容
cat <file> // 查看文件内容 cat -n <file> // 查看内容并标示行数 cat <file> | awk 'NR%2==1' // 查看文件的奇数行 tac <file> // 从最后一行开始反看文件内容 more <file> // 查看一个长文件内容 less <file> // 类似more命令,但允许反向操作 head -2 <file> // 查看文件前两行 tail -2 <file> // 查看文件后两行 tail -f <file> // 实时查看添加到文件中的内容
-
在文件中查找内容
grep <key> <file> // 在文件中查找关键词 grep ^<key> <file> // 在文件中查找以<key>开头的内容 grep [0-9] <file> // 在文件中查找所有包含数字的行
-
修改文件中的内容
linux中三剑客:grep(过滤文本)、sed(修改文本)、awk(处理文本)
sed 's/s1/s2/g' <file> // 将文件中的s1替换成s2 sed '/^$/d' <file> // 从文件中删除所有空白行 sed '/ *#/d;/^$/d' <file> // 从文件中删除所有注释和空白行 sed -e '1d' <file> // 从文件中排除第一行 sed -n '/s1/p' <file> // 查看只包含关键词's1'的行 sed -e 's/ *$//' <file> // 删除每一行最后的空白字符 sed -e 's/s1//g' <file> // 从文件中删除词汇s1 sed -n '1,5p;5q' <file> // 查看文件从第一行到第五行内容 sed -n '5p;5q' <file> // 查看文件第五行 paste <file1> <file2> // 合并两个文件或两栏内容 paste -d '+' <file1> <file2> // 合并两个文件或两栏内容,中间用'+'区分 sort <file1> <file2> // 排序两个文件的内容 sort <file1> <file2> | uniq // 排序两个文件的内容,删除重复行 sort <file1> <file2> | uniq -u // 排序两个文件的内容,仅显示出现一次的行列 sort <file1> <file2> | uniq -d // 排序两个文件的内容,仅显示重复出现的行列 comm -1 <file1> <file2> // 比较两个文件的内容(去除file1所含内容) comm -2 <file1> <file2> // 比较两个文件的内容(去除file2所含内容) comm -3 <file1> <file2> // 比较两个文件的内容(去除两个文件共有部分)
-
-
打包和解压
-
zip
zip <xxx>.zip <file> // 压缩至zip包 zip -r <xxx>.zip <file1> <file2> <dir> // 将多个文件+目录压成zip包 unzip <xxx>.zip // 解压zip包
-
tar
tar -cvf <xxx>.tar <file> // 创建非压缩tar包 tar -cvf <xxx>.tar <file1> <file2> <dir> // 将多个文件+目录打tar包 tar -tf <xxx>.tar // 查看tar包内容 tar -xvf <xxx>.tar // 解压tar包 tar -xvf <xxx>.tar -C /<dir> // 将tar包解压至指定目录
-
gzip
tar -cvfz <xxx>.tar.gz <dir> // 创建gzip压缩包 tar -zxvf <xxx>.tar.gz // 解压gzip压缩包 gunzip <xxx>.gz // 解压gzip压缩包 gzip <file> // 压缩文件 gzip -9 <file> // 最大程度压缩
-
bz2
tar -cvfj <xxx>.tar.bz2 <dir> // 创建bz2压缩包 tar -jxvf <xxx>.tar.bz2 // 解压bz2压缩包 bunzip2 <xxx>.bz2 // 解压bz2压缩包 bzip2 <file> // 压缩文件
-
-
软件/安装包管理
-
RPM包管理命令
rpm -qa // 查看已安装的rpm包 rpm -q <pkg_name> // 查询某个rpm包 rpm -q --whatprovides <xxx> // 显示xxx功能是由哪个包提供的 rpm -q --whatrequires <xxx> // 显示xxx功能被哪个程序包依赖的 rpm -q --changelog <xxx> // 显示xxx包的更改记录 rpm -qi <pkg_name> // 查看一个包的详细信息 rpm -qd <pkg_name> // 查询一个包所提供的配置文件 rpm -ql <pkg_name> // 查看一个包安装了哪些文件 rpm -qf <file> // 查看某个文件属于哪个包 rpm -qR <pkg_name> // 查询包的依赖关系 rpm -ivh xxx.rpm // 安装rpm包 rpm -ivh --test xxx.rpm // 测试安装rpm包 rpm -ivh --nodeps xxx.rpm // 安装rpm包时忽略依赖关系 rpm -e <xxx> // 卸载程序包 rpm -Fvh <pkg_name> // 升级确定已安装的rpm包 rpm -Uvh <pkg_name> // 升级rpm包(若未安装则会安装) rpm -V <pkg_name> // RPM包详细信息校验
-
YUM包管理命令
yum repolist enabled // 显示可用的源仓库 yum search <pkg_name> // 搜索软件包 yum install <pkg_name> // 下载并安装软件包 yum install --downloadonly <pkg_name> // 只下载不安装 yum list // 显示所有程序包 yum list installed // 查看当前系统已安装包 yum list updates // 查看可以更新的包列表 yum check-update // 查看可升级的软件包 yum update // 更新所有软件包 yum update <pkg_name> // 升级指定软件包 yum deplist <pkg_name> // 列出软件包依赖关系 yum remove <pkg_name> // 删除软件包 yum clean all // 清除缓存 yum clean packages // 清除缓存的软件包 yum clean headers // 清除缓存的header
-
DPKG包管理命令
dpkg -c xxx.deb // 列出deb包的内容 dpkg -i xxx.deb // 安装/更新deb包 dpkg -r <pkg_name> // 移除deb包 dpkg -P <pkg_name> // 移除deb包(不保留配置) dpkg -l // 查看系统中已安装deb包 dpkg -l <pkg_name> // 显示包的大致信息 dpkg -L <pkg_name> // 查看deb包安装的文件 dpkg -s <pkg_name> // 查看包的详细信息 dpkg -unpack <xxx>.deb // 解开deb包的内容
-
APT软件⼯具
apt-cache search <pkg_name> // 搜索程序包 apt-cache show <pkg_name> // 获取包的概览信息 apt-get install <pkg_name> // 安装/升级软件包 apt-get purge <pkg_name> // 卸载软件(包括配置) apt-get remove <pkg_name> // 卸载软件(不包括配置) apt-get update // 更新包索引信息 apt-get upgrade // 更新已安装软件包 apt-get clean // 清理缓存
-