Linux基础

发布于 2021-04-01  100 次阅读


目录结构

img image-20210401104250826

系统启动:

  • /boot:存放启动Linux 时使用的内核文件,包括连接文件以及镜像文件
  • /etc:存放所有的系统需要的配置文件子目录列表,更改目录下的文件可能会导致系统不能启动
  • /lib:存放基本代码库(比如c++库),其作用类似于Windows里的DLL文件 几乎所有的应用程序都需要用到这些共享库
  • /sys: 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中

指令集合:

  • /bin:存放着最常用的程序和指令
  • /sbin:只有系统管理员能使用的程序和指令

外部文件管理:

  • /dev :Device(设备)的缩写, 存放的是Linux的外部设备。注意:在Linux中访问设备和访问文件的方式是相同的
  • /media:类windows的其他设备,例如U盘、光驱等等,识别后linux会把设备放到这个目录下
  • /mnt:临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了

临时文件:

  • /run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run
  • /lost+found:一般情况下为空的,系统非法关机后,这里就存放一些文件
  • /tmp:这个目录是用来存放一些临时文件的

账户:

  • /root:系统管理员的用户主目录
  • /home:用户的主目录,以用户的账号命名的
  • /usr:用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录
  • /usr/bin:系统用户使用的应用程序与指令
  • /usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序
  • /usr/src:内核源代码默认的放置目录

运行过程:

  • /var:存放经常修改的数据,比如程序运行的日志文件(/var/log 目录下)
  • /proc:管理内存空间!虚拟的目录,是系统内存的映射,我们可以直接访问这个目录来,获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件来做修改

扩展:

  • /opt:默认是空的,我们安装额外软件可以放在这个里面
  • /srv:存放服务启动后需要提取的数据(不用服务器就是空)

文件属性

img

文件类型及权限

左边第一部分的10个字符 表示文件的类型及执行权限

  • 第一个字符:代表这个文件的类型
    • d 目录
    • - 文件
    • l 链接文档(link file)
    • b 装置文件里面的可供储存的接口设备(可随机存取装置)
    • c 装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)
  • 接下来的字符:以三个一组分成三组,用 r、w、x 三个参数的组合表示,位置不会改变
    • r 可读(read)
    • w可写(write)
    • x可执行(execute)
    • - 没有权限
  • 前3个字符:文件的所有者对文件的权限 owner
  • 中间三个字符:所有者的同组用户对文件的权限 group
  • 后三个字符:其他用户对文件的权限 others

权限的数字表示

Linux文件属性有两种设置方法,一种是符号,另一种是数字

Linux 文件的基本权限有九个 分别是 owner/group/others(拥有者/组/其他) 三种身份各有自己的 read/write/execute 权限

因为每种权限只有两种状态 有或者没有,所以权限就可以使用二进制表示

数字表示就是用三种权限的数字和 代表该组的权限,其中

  • r = 4 (100)
  • w = 2 (10)
  • x = 1 (1)
  • rwx = 7 (111)

特殊权限

除了rwx-外 有时候在执行权限的位置上 还会出现s或者t字符

s权限和t权限的说明:

  • s:用户执行这个文件时将以文件 所有者/所属组 的身份执行
  • S:同s,但原先文件没有x权限(显然不能执行)
  • t:普通用户只能删除自己创建的文件/目录,而不能删除不属于自己的文件/目录
  • T:同t,但原先文件没有x权限

与rwx相对,特殊权限也分为三种:

  • SetUID(s权限,4)
  • SetGID(s权限,2)
  • SetBID也叫Sticky(t权限,1)

SetUID

占用 所有者的x权限位

设置 SetUID:

chmod u+s 文件名
#采用数字赋权时 在原先权限前加一个4
chmod 4777 文件名

取消 SetUID:

chmod u-s 文件名
#赋予原权限即可
chmod 777 文件名

SetGID

占用 用户组的x权限位

目录下创建的所有文件和子目录的所属组 都会继承该目录所属组的属性

设置 SetGID

chmod g+s 文件名
#采用数字赋权时 在原先权限前加一个2
chmod 2777 文件名

取消 SetGID

chmod g-s 文件名
#赋予原权限即可
chmod 777 文件名

Sticky

Stick Bit,粘滞位

占用 其他(others)的x权限位

设置 SBIT

chmod o+t 文件名
#采用数字赋权时 在原先权限前加一个1
chmod 1777 文件名

取消 SBIT

chmod o-t 文件名
#赋予原权限即可
chmod 777 文件名

特殊属性

让root用户 也不能做任何操作 的属性

使用 lschattr命令查看 chattr命令赋予(详见Linux常用命令)

文件存储

文件的存储 分为内容 和 元数据两部分

其中内容 放在数据块(block)中 元数据放在(inode)中(除了文件名)

inode的结构:

image

说明:

  • iNumber是文件的唯一标识
  • Linux中一切皆文件
  • 文件的文件名 保存的目录的block中
  • 目录block的内容:文件名,inode编号

链接

Linux链接分两种 一种被称为硬链接(Hard Link) 另一种被称为符号链接(软链接)(Symbolic Link)

默认情况下,ln命令产生硬链接

硬链接:

  • 多个文件名指向同一个inode编号 即为硬链接
  • 创建硬链接仅仅是在目录block中 新增一条数据:文件名,链接文件inode编号
  • 特点:
    • 不占用实际空间
    • 只能对已存在的文件创建(不允许对目录)
    • 只能在同一个文件系统中才能创建
    • 删除原文件 不影响链接使用
    • 换言之,删除文件指的是删除文件所有的硬链接

软链接:

  • 文件数据块(block)中存放的内容是另一文件的路径名的指向 该文件即软链接
  • 特点:
    • 以路径的形式存在 类似于Windows操作系统中的快捷方式
    • 可以跨文件系统
    • 可以对一个不存在的文件进行链接
    • 可以对目录进行链接
    • 删除原文件 影响链接

注意:

  • 无论什么链接,改动了一处,其它的文件都会发生相同的变化
  • ln指令,同时指定多个文件或目录,如果最后的目的地是不是一个已经存在的目录,则会出现错误信息
  • 否则会把前面指定的所有文件或目录复制到该目录中

挂载

将设备文件中的顶级目录连接到 Linux 根目录下的某一目录的过程称为 挂载

为什么需要挂载?

  • Linux中一切皆文件,所有文件都放置树形目录结构中
  • 任何硬件设备也都是文件,但问题是 它们有各自的一套文件系统(文件目录结构)
  • 如果不挂载,通过Linux系统中的图形界面系统可以查看找到硬件设备,但命令行方式无法找到
  • 只有挂载后,硬件设备才能为我们所用,访问挂载目录就等同于访问设备文件

注意:

  • 挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点
  • 设备文件在/deb/目录下会显示 但它不是目录 不能ls
    • 它是一个类似指针的东西,指向这个分区的原始数据块
    • mount前,系统并不知道这个数据块哪部分数据代表文件,如何对它们操作
  • 插入CD,系统自动执行了 mount /dev/cdrom /media/cdrom
    • 所以可以直接在/media/cdrom中对CD中的内容进行管理。

信号

是由用户、系统或者进程发送给目标进程的信息,以通知目标进程 某个状态改变或系统异常

信号列表:

image

编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),也叫标准信号、阻塞信号

编号为34 ~ 64的信号是后来扩充的,称做可靠信号(实时信号)

标准信号的局限性:

  • 信号可能会丢失 当一个信号阻塞时,这个信号即使多次发送给进程,也只被执行一次
  • 信号交付没有携带与信号有关信息 接受到信号的进程无法区分同种信号的不同情况,也不知道信号从何而来
  • 信号的交付没有优先级 当有多个信号悬挂与一个进程时,交付的顺序不确定

实时信号的特点:

  • 实时信号和标准信号不一样,他没有明确的含义,而是由使用者自己来决定如何使用
  • 进程可以接受多个同样的实时信号,而标准信号不能,在标准信号没有得到处理的时候,多个标准信号会被合为一个
  • 实时信号使用sigqueue发送的时候,可以携带附加的数据(int或者pointer)
  • 实时信号有时间顺序的概念,所以同样的实时信号会按次序被处理
  • 信号实质上是软中断,中断有优先级,信号也有优先级。实时信号具有优先的概念,数值越低的信号其优先级越高,也就是数值低的实时信号优先得到处理。实时信号和标准信号的优先级,在posix中是未定义的,一般来说会优先处理标准信号
  • 实时信号的默认行为都是结束当前的进程

标准信号的作用

  • SIGHUP 信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件
    • 登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也能继续下载
  • SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程
  • SIGKILL 用来立即结束程序的运行 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号
  • SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间 alarm函数使用该信号
  • SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL
  • SIGCHLD 子进程结束时, 父进程会收到这个信号
    • 如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程来接管)
  • SIGCONT 让一个停止(stopped)的进程继续执行 本信号不能被阻塞 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作 例如, 重新显示提示符
  • SIGSTOP 停止(stopped)进程的执行 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行 本信号不能被阻塞, 处理或忽略
  • SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号
  • SIGURG 有"紧急"数据或out-of-band数据到达socket时产生

程序不可捕获、阻塞或忽略的信号有:SIGKILL,SIGSTOP

SIGCONT信号 在进程挂起时是继续,否则是忽略,不能被阻塞

ctrl+c ctrl+d ctrl+z的区别

  • Ctrl+c 发出SIGINT信号(2) 中断程序的执行
  • Ctrl+z 发出SIGTSTP信号(20) 是将任务中止(暂停的意思)
    • 此时任务并没有结束,仍然在进程中他只是维持挂起的状态
    • 用户可以使用fg/bg操作继续前台或后台的任务
    • fg命令重新启动前台被中断的任务
    • bg命令把被中断的任务放在后台执行
  • Ctrl+d 不是发送信号,而是表示一个特殊的二进制值EOF
    • 在shell中,ctrl+d表示退出当前shell
    • 退出shell 会发送SIGHUP信号(1)

捕捉信号

trap命令 可以在shell脚本运行时 根据接收的信号做相应处理

命令格式:

trap [参数] [执行的命令或函数] [信号]

参数说明:

  • -l 打印编号1-64编号信号名称
  • -p 打印与指定信号相关联的trap命令

发送信号

kill命令,详见Linux常用命令

管道

Linux 使用竖线|连接多个命令,这被称为管道符

使管道符|左边命令的输出成为右边命令的输入

语法格式:

command1 | command2 [ | commandN ]

注意:

  • command1 必须有正确输出,而 command2 必须可以处理 command1 的输出结果
  • command2 只能处理 command1 的标准输出,不能处理 command1 的错误输出

其他符号:

  • && 前面命令成功,则后一条之心
  • || 前面命令失败,则后一条执行

编码转换

windows换行符转linux换行符

sed -i 's/\r//' filename

vim中设置编码

:edit ++enc=utf8

shell iconv命令

iconv --list 列出iconv支持的编码列表

命令格式:

iconv -f 原编码 -t 新编码 filename -o newfile

参数说明:

  • -f 来源编码
  • -t 转换后新编码
  • -c 忽略无效字符
  • -s 忽略警告
  • -o file 保留源文件

运行jar包

  • 直接运行主类:java -jar xxx.jar
  • 运行其他类:java -classpath xxx.jar:yyy.jar xxx(类)

注意:如果包含同包同名的类,哪个在前面加载哪个