Linux学习笔记(1)

213 阅读17分钟

1. 各硬件设备在Linux中的文件名

设备设备在Linux内的文件名
SCSI/SATA/USB硬盘机/dev/sd[a-p]
USB闪存盘/dev/sd[a-p] ( 与SATA相同)
VirtI/O界面/dev/vd[a-p] ( 用于虚拟机内)
软盘机/dev/fd[0-7]
打印机/dev/lp[0-2] ( 25针打印机) /dev/usb/lp[0-15] ( USB 接口)
鼠标/dev/input/mouse[0-15] ( 通用) /dev/psaux ( PS/2界面) /dev/mouse ( 当前鼠标)
CDROM/DVDROM/dev/scd[0-1] ( 通用) /dev/sr[0-1] ( 通用, CentOS 较常见) /dev/cdrom ( 当前 CDROM)
磁带机/dev/ht0 ( IDE 界面) /dev/st0 ( SATA/SCSI界面) /dev/tape ( 当前磁带)
IDE硬盘机/dev/hd[a-d] ( 旧式系统才有)

例题: 如果你的PC上面有两个SATA磁盘以及一个USB磁盘, 而主板上面有六个SATA的插 槽。 这两个SATA磁盘分别安插在主板上的SATA1, SATA5插槽上, 请问这三个磁盘在Linux中 的设备文件名为何? 答: 由于是使用侦测到的顺序来决定设备文件名, 并非与实际插槽代号 有关, 因此设备的文件名如下:

  1. SATA1插槽上的文件名: /dev/sda
  2. SATA5插槽上的文件名: /dev/sdb
  3. USB磁盘( 开机完成后才被系统捉到) : /dev/sdc

那么对硬盘分区后呢,分区在linux系统中的设备文件名如下所示(这个数字与该分区所在的位置有关)
P1:/dev/sda1
P2:/dev/sda2
P3:/dev/sda3
P4:/dev/sda4

2. linux目录配置-FHS(Filesystem Hierarchy Standard)

根据FHS的标准文件指出,他们的主要目的是希望让使用者可以了解到已安装软件通常放
置于那个目录下, 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的
使用者,都能够遵循FHS的标准。 也就是说, FHS的重点在于规范每个特定的目录下应该要
放置什么样子的数据而已。 这样做好处非常多,因为Linux操作系统就能够在既有的面貌下
(目录架构不变)发展出开发者想要的独特风格。
  • 根目录 | 目录 | 应放置文件内容 | | --- | --- | | /bin | 系统有很多放置可执行文件的目录, 但/bin比较特殊。 因为/bin放置的是在 单人维护模式下还能够被操作的指令。 在/bin下面的指令可以被root与一般 帐号所使用, 主要有: cat, chmod, chown, date, mv, mkdir, cp, bash等等常 用的指令。 | | /boot | 这个目录主要在放置开机会使用到的文件, 包括Linux核心文件以及开机菜 单与开机所需配置文件等等。 Linux kernel常用的文件名为: vmlinuz, 如果 使用的是grub2这个开机管理程序, 则还会存在/boot/grub2/这个目录喔! | | /dev | 在Linux系统上, 任何设备与周边设备都是以文件的型态存在于这个目录当 中的。 你只要通过存取这个目录下面的某个文件, 就等于存取某个设备啰 ~ 比要重要的文件有/dev/null, /dev/zero, /dev/tty, /dev/loop, /dev/sd等等 | | /etc | 系统主要的配置文件几乎都放置在这个目录内, 例如人员的帐号密码档、 各种服务的启始档等等。 一般来说, 这个目录下的各文件属性是可以让一般 使用者查阅的, 但是只有root有权力修改。 FHS建议不要放置可可执行文件 ( binary) 在这个目录中喔。 比较重要的文件有: /etc/modprobe.d/, /etc/passwd, /etc/fstab, /etc/issue 等等。 另外 FHS 还规范几个重要的目录 最好要存在 /etc/ 目录下喔: /etc/opt( 必要) : 这个目录在放置第三方协力 软件 /opt 的相关配置文件 /etc/X11/( 建议) : 与 X Window 有关的各种配 置文件都在这里, 尤其是 xorg.conf 这个 X Server 的配置文件。 /etc/sgml/ ( 建议) : 与 SGML 格式有关的各项配置文件 /etc/xml/( 建议) : 与 XML 格式有关的各项配置文件 | | /lib | 系统的函数库非常的多, 而/lib放置的则是在开机时会用到的函数库, 以及 在/bin或/sbin下面的指令会调用的函数库而已。 什么是函数库呢? 你可以将 他想成是“外挂”, 某些指令必须要有这些“外挂”才能够顺利完成程序的执行 之意。 另外 FSH 还要求下面的目录必须要存在: /lib/modules/: 这个目录 主要放置可抽换式的核心相关模块( 驱动程序) 喔! | | /media | media是“媒体”的英文, 顾名思义, 这个/media下面放置的就是可移除的设 备啦! 包括软盘、 光盘、 DVD等等设备都暂时挂载于此。 常见的文件名 有: /media/floppy, /media/cdrom等等。 | | /mnt | 如果你想要暂时挂载某些额外的设备, 一般建议你可以放置到这个目录中。 在古早时候, 这个目录的用途与/media相同啦! 只是有了/media之后, 这个 目录就用来暂时挂载用了。 | | /opt | 这个是给第三方协力软件放置的目录。 什么是第三方协力软件啊? 举例来 说, KDE这个桌面管理系统是一个独立的计划, 不过他可以安装到Linux系 统中, 因此KDE的软件就建议放置到此目录下了。 另外, 如果你想要自行 安装额外的软件( 非原本的distribution提供的) , 那么也能够将你的软件安 装到这里来。 不过, 以前的Linux系统中, 我们还是习惯放置在/usr/local目 录下呢! | | /run | 早期的 FHS 规定系统开机后所产生的各项信息应该要放置到 /var/run 目录 下, 新版的 FHS 则规范到 /run 下面。 由于 /run 可以使用内存来仿真, 因 此性能上会好很多! | | /srv | srv可以视为“service”的缩写, 是一些网络服务启动之后, 这些服务所需要 取用的数据目录。 常见的服务例如WWW, FTP等等。 举例来说, WWW服 务器需要的网页数据就可以放置在/srv/www/里面。 不过, 系统的服务数据 如果尚未要提供给网际网络任何人浏览的话, 默认还是建议放置到 /var/lib 下面即可。 | | /tmp | 这是让一般使用者或者是正在执行的程序暂时放置文件的地方。 这个目录 是任何人都能够存取的, 所以你需要定期的清理一下。 当然, 重要数据不可 放置在此目录啊! 因为FHS甚至建议在开机时, 应该要将/tmp下的数据都 删除唷! | | /usr | 第二层 FHS 设置, 后续介绍 | | /var | 第二曾 FHS 设置, 主要为放置变动性的数据, 后续介绍 | | /home | 这是系统默认的使用者主文件夹( home directory) 。 在你新增一个一般使 用者帐号时, 默认的使用者主文件夹都会规范到这里来。 比较重要的是, 主文件夹有两种代号喔: ~: 代表目前这个使用者的主文件夹 ~dmtsai : 则 代表 dmtsai 的主文件夹! | | /lib | 用来存放与 /lib 不同的格式的二进制函数库, 例如支持 64 位的 /lib64 函数 库等 | | /root | 系统管理员( root) 的主文件夹。 之所以放在这里, 是因为如果进入单人维 护模式而仅挂载根目录时, 该目录就能够拥有root的主文件夹, 所以我们会 希望root的主文件夹与根目录放置在同一个分区中。 | /lost+found | 这个目录是使用标准的ext2/ext3/ext4文件系统格式才会产生的一个目录, 目的在于当文件系统发生错误时, 将一些遗失的片段放置到这个目录下。 不过如果使用的是 xfs 文件系统的话, 就不会存在这个目录了!| | /proc | 这个目录本身是一个“虚拟文件系统( virtual filesystem) ”喔! 他放置的数 据都是在内存当中, 例如系统核心、 行程信息( process) 、 周边设备的 状态及网络状态等等。 因为这个目录下的数据都是在内存当中, 所以本身 不占任何硬盘空间啊! 比较重要的文件例如: /proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/* 等等。 | | /sys | 这个目录其实跟/proc非常类似, 也是一个虚拟的文件系统, 主要也是记录 核心与系统硬件信息较相关的信息。 包括目前已载入的核心模块与核心侦 测到的硬件设备信息等等。 这个目录同样不占硬盘容量喔! |

  • /usr (usr=Unix Software Resource)

目录应放置文件内容
第一部份: FHS 要求必须 要存在的目录
/usr/bin/所有一般用户能够使用的指令都放在这里! 目前新的 CentOS 7 已经将 全部的使用者指令放置于此, 而使用链接文件的方式将 /bin 链接至此! 也就是说, /usr/bin 与 /bin 是一模一样了! 另外, FHS 要求在此目录 下不应该有子目录!
/usr/lib/基本上, 与 /lib 功能相同, 所以 /lib 就是链接到此目录中的!
/usr/local/系统管理员在本机自行安装自己下载的软件( 非distribution默认提供 者) , 建议安装到此目录, 这样会比较便于管理。 举例来说, 你的 distribution提供的软件较旧, 你想安装较新的软件但又不想移除旧版, 此时你可以将新版软件安装于/usr/local/目录下, 可与原先的旧版软件 有分别啦! 你可以自行到/usr/local去看看, 该目录下也是具有bin, etc, include, lib...的次目录喔!
/usr/sbin/非系统正常运行所需要的系统指令。 最常见的就是某些网络服务器软件 的服务指令( daemon) 啰! 不过基本功能与 /sbin 也差不多, 因此目 前 /sbin 就是链接到此目录中的。
/usr/share/主要放置只读架构的数据文件, 当然也包括共享文件。 在这个目录下放 置的数据几乎是不分硬件架构均可读取的数据, 因为几乎都是文字文 件嘛! 在此目录下常见的还有这些次目录: /usr/share/man: 线上说明 文档 /usr/share/doc: 软件杂项的文件说明 /usr/share/zoneinfo: 与时 区有关的时区文件
第二部份: FHS 建议可以 存在的目录
/usr/games/与游戏比较相关的数据放置处
/usr/include/c/c++等程序语言的文件开始( header) 与包含档( include) 放置处, 当我们以tarball方式 ( *.tar.gz 的方式安装软件) 安装某些数据时, 会 使用到里头的许多包含档喔!
/usr/libexec/某些不被一般使用者惯用的可执行文件或脚本( script) 等等, 都会放 置在此目录中。 例如大部分的 X 窗口下面的操作指令, 很多都是放在 此目录下的。
/usr/lib/与 /lib/功能相同, 因此目前 /lib 就是链接到此目录中
/usr/src/一般源代码建议放置到这里, src有source的意思。 至于核心源代码则 建议放置到/usr/src/linux/目录下。
  • /var 目录 | 应放置文件内容 | | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 第一部 份: FHS 要求必须 要存在的 目录 | | | /var/cache/ | 应用程序本身运行过程中会产生的一些暂存盘; | | /var/lib/ | 程序本身执行的过程中, 需要使用到的数据文件放置的目录。 在此目录下 各自的软件应该要有各自的目录。 举例来说, MySQL的数据库放置 到/var/lib/mysql/而rpm的数据库则放到/var/lib/rpm去! | | /var/lock/ | 某些设备或者是文件资源一次只能被一个应用程序所使用, 如果同时有两 个程序使用该设备时, 就可能产生一些错误的状况, 因此就得要将该设备 上锁( lock) , 以确保该设备只会给单一软件所使用。 举例来说, 烧录机 正在烧录一块光盘, 你想一下, 会不会有两个人同时在使用一个烧录机烧 片? 如果两个人同时烧录, 那片子写入的是谁的数据? 所以当第一个人在 烧录时该烧录机就会被上锁, 第二个人就得要该设备被解除锁定( 就是前 一个人用完了) 才能够继续使用啰。 目前此目录也已经挪到 /run/lock 中! | | /var/log/ | 重要到不行! 这是登录文件放置的目录! 里面比较重要的文件 如/var/log/messages, /var/log/wtmp( 记录登陆者的信息) 等。 | | /var/mail/ | 放置个人电子邮件信箱的目录, 不过这个目录也被放置到/var/spool/mail/ 目录中! 通常这两个目录是互为链接文件啦! | | /var/run/ | 某些程序或者是服务启动后, 会将他们的PID放置在这个目录下喔! 至于 PID的意义我们会在后续章节提到的。 与 /run 相同, 这个目录链接到 /run 去了! | | /var/spool/ | 这个目录通常放置一些伫列数据, 所谓的“伫列”就是排队等待其他程序使 用的数据啦! 这些数据被使用后通常都会被删除。 举例来说, 系统收到新 信会放置到/var/spool/mail/中, 但使用者收下该信件后该封信原则上就会 被删除。 信件如果暂时寄不出去会被放到/var/spool/mqueue/中, 等到被 送出后就被删除。 如果是工作调度数据( crontab) , 就会被放置 到/var/spool/cron/目录中! |

3. Linux文件

3.1 文件属性与权限

```
    root@maoxh-pc:/# ll
    总用量 2097256
    drwxr-xr-x  24 root root       4096 5  26 11:27 ./
    drwxr-xr-x  24 root root       4096 5  26 11:27 ../
    drwxrwxrwx   4 root root       4096 6   1 21:04 app/
    lrwxrwxrwx   1 root root          7 5  14 01:49 bin -> usr/bin/
    drwxr-xr-x   4 root root       4096 6  18 06:54 boot/
    lrwxrwxrwx   1 root root         10 5  14 01:49 libx32 -> usr/libx32/
    drwx------   2 root root      16384 5  14 01:48 lost+found/
    dr-xr-xr-x 324 root root          0 5  15 13:38 proc/
    drw-------   2 root root       4096 5  26 11:27 .Recycle_bin/
    drwxr-xr-x  35 root root       1120 6  19 16:04 run/
    lrwxrwxrwx   1 root root          8 5  14 01:49 sbin -> usr/sbin/
    drwxr-xr-x   9 root root       4096 2  23 16:54 snap/
    -rw-------   1 root root 2147483648 5  14 01:49 swapfile
    dr-xr-xr-x  13 root root          0 5  15 13:38 sys/
    ...
    ...
```
  • 第一栏代表 这个文件的类型和权限\
    1. 第一个字符代表这个文件是“目录、 文件或链接文件等等”:
      1. 当为[ d ]则是目录, 例如上表文件名为“.config”的那一行
      2. 当为[ - ]则是文件, 例如上表文件名为“initial-setup-ks.cfg”那一行
      3. 若是[ l ]则表示为链接文件( link file)
      4. 若是[ b ]则表示为设备文件里面的可供储存的周边设备( 可随机存取设备)
      5. 若是[ c ]则表示为设备文件里面的序列埠设备, 例如键盘、 鼠标( 一次性读取设备)
    2. 后面的字符中,以三个为一组,且均为rwx的三个参数组合。r=可读。w=可写。x=可执行.如果没有权限则会显示-
      1. 其中第一组为‘文件拥有者具备的权限’
      2. 其中第二组为‘加入此群组之帐号的权限’
      3. 其中第三组为‘非本人且没有加入本群组之其他帐号的权限’
  • 第二栏表示有多少文件名链接到此节点
  • 第三栏表示这个文件的拥有者
  • 第四栏表示文件的所属群组
  • 第五栏为文件的容量大小,默认单位是Bytes
  • 第六栏为文件的创建or修改日期
  • 最后一栏就是文件名

3.2 改变文件属性与权限

groupadd : 新增一个组
chgrp : 改变文件所属群组
chown : 改变文件拥有者
chmod : 改变文件的权限

  1. 新增一个组 groupadd my-test-group 新增完后,我们可以 cat /etc/group查看

     ```
     root@maoxh-pc:/test# groupadd my-test-group
     root@maoxh-pc:/test# cat /etc/group
     root:x:0:
     daemon:x:1:
     ...
     ...
     mysql:x:134:
     www:x:1001:
     my-test-group:x:1002:
     ```
    

    /etc/group文件格式 由四个部分组成

    • 第一字段(group_name):用户组名称。
    • 第二字段(passwd):用户组密码。
    • 第三字段:GID。
    • 第四字段(user_list):用户列表,每个用户之间用,号分割;本字段可以为空;如果字段为空表示用户组为GID的用户名
  2. 改变文件组 chgrp -R 代表递归持续变更

    root@maoxh-pc:/test# chgrp -R my-test-group a.txt 
    root@maoxh-pc:/test# ll
    总用量 12
    drwxr-xr-x  3 root root          4096 6月  19 17:22 ./
    drwxr-xr-x 25 root root          4096 6月  19 17:22 ../
    -rw-r--r--  1 root my-test-group    0 6月  19 17:22 a.txt
    drwxr-xr-x  2 root root          4096 6月  19 17:22 bbb/
    
  3. 改变文件拥有者 chown

    root@maoxh-pc:/test# chown -R maoxh bbb
    root@maoxh-pc:/test# ll
    总用量 12
    drwxr-xr-x  3 root  root          4096 6月  19 17:22 ./
    drwxr-xr-x 25 root  root          4096 6月  19 17:22 ../
    -rw-r--r--  1 root  my-test-group    0 6月  19 17:22 a.txt
    drwxr-xr-x  2 maoxh root          4096 6月  19 17:22 bbb/
    
  4. 改变文件权限 chmod

    root@maoxh-pc:/test# chmod 755 a.txt
    root@maoxh-pc:/test# ll
    总用量 12
    drwxr-xr-x  3 root  root          4096 6月  19 17:22 ./
    drwxr-xr-x 25 root  root          4096 6月  19 17:22 ../
    -rwxr-xr-x  1 root  my-test-group    0 6月  19 17:22 a.txt*
    drwxr-xr-x  2 maoxh root          4096 6月  19 17:22 bbb/
    

    三个数字755分别代表拥有者,组,其他的权限
    它是以二进制来转化的。7 = 111,也就是可读可写可执行。5 = 101,也就是可读可执行

  5. 默认权限 umask

    maoxh@maoxh-pc:~$ umask
    0002
    maoxh@maoxh-pc:~$ umask -S
    u=rwx,g=rwx,o=rx
    

    umask的值代表的是“该默认值需要减掉的权限”,比如r,w,x分别代表4,2,1。那么002代表 其他组减去写的权限,也如 umask -S所展示的那样

    maoxh@maoxh-pc:/tmp/test$ umask 022
    maoxh@maoxh-pc:/tmp/test$ umask
    0022
    maoxh@maoxh-pc:/tmp/test$ touch txt1
    maoxh@maoxh-pc:/tmp/test$ mkdir txt2
    maoxh@maoxh-pc:/tmp/test$ ll -d txt*
    -rw-r--r-- 1 maoxh maoxh    0 622 22:56 txt1
    drwxr-xr-x 2 maoxh maoxh 4096 622 22:56 txt2/
    

    我们修改默认权限为022。

    • 创建文件则默认没有x的权限,也就是权限值是666,对应的-rw-rw-rw-,所以减去022,得到的权限是-rw-r--r--.(减去了其他权限)
    • 创建目录,默认权限值是777,对应的drwxrwxrwx,所以减去022,得到的权限是drwxr-xr-x.(减去了其他权限)
  6. 文件隐藏属性(chattr lsattr

    chattr [+-=] [属性] 文件或目录名
    

    一些常见的属性如下

    属性选项功能
    i如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据; 如果对目录设置 i 属性,那么只能修改目录下文件中的数据,但不允许建立和删除文件;
    a如果对文件设置 a 属性,那么只能在文件中増加数据,但是不能删除和修改数据; 如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除文件;
    u设置此属性的文件或目录,在删除时,其内容会被保存,以保证后期能够恢复,常用来防止意外删除文件或目录。
    s和 u 相反,删除文件或目录时,会被彻底删除(直接从硬盘上删除,然后用 0 填充所占用的区域),不可恢复。
    root@maoxh-pc:/tmp/test# chattr +a txt1
    root@maoxh-pc:/tmp/test# lsattr txt1
    -----a--------e----- txt1
    
  7. 观察文件类型 file

    root@maoxh-pc:/tmp/test# file ~/.bashrc
    /root/.bashrc: ASCII text
    root@maoxh-pc:/tmp/test# file txt1
    txt1: empty
    root@maoxh-pc:/tmp/test# file /usr/bin/passwd 
    /usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=6af93256cb810d90b2f96fc052b05b43b954f5b2, for GNU/Linux 3.2.0, stripped
    

3.3 文件与目录相关操作

  1. 常见的处理目录的指令
    • cd: 变换目录
    • pwd: 显示目前的目录
    • mkdir: 创建一个新的目录
    • cp : 复制文件或者目录
    • rm : 移除文件或目录
    • mv : 移动文件与目录, 或更名
  2. 文件内容检阅
    • cat 由第一行开始显示文件内容
    • tac 从最后一行开始显示, 可以看出 tac 是 cat 的倒着写
    • nl 显示的时候, 顺道输出行号
    • more 一页一页的显示文件内容
    • less 与 more 类似, 但是比 more 更好的是, 他可以往前翻页
      空白键 : 向下翻动一页
      [pagedown]: 向下翻动一页
      [pageup] : 向上翻动一页
      /字串 : 向下搜寻“字串”的功能
      ?字串 : 向上搜寻“字串”的功能
      n : 重复前一个搜寻 ( 与 / 或 ? 有关! )
      N : 反向的重复前一个搜寻 ( 与 / 或 ? 有关! )
      g : 前进到这个数据的第一行去
      G : 前进到这个数据的最后一行去 ( 注意大小写) 
      q : 离开 less 这个程序
      
    • head 只看头几行
    • tail 只看尾巴几行
    • od 以二进制的方式读取文件内容

3.4 指令与文件的搜索

  • 通过which来搜索“可执行文件”

    用法: which [-a] [command]

     root@maoxh-pc:/tmp/test# which -a ls
     /usr/bin/ls
     /bin/ls
     root@maoxh-pc:/tmp/test# which ls
     /usr/bin/ls
     root@maoxh-pc:/tmp/test# which nginx
     /usr/bin/nginx
     root@maoxh-pc:/tmp/test# which mkdir
     /usr/bin/mkdir
    
  • 通过whereis 从一些特定的目录中寻找文件名

    通常情况下,我们优先使用whereis或者locate来搜索。它们的检索效率很快速。因为whereis只找系统中某些特定目录的文件,locate则是利用数据库来搜索文件名。 可以通过whereis -l来查看检索哪些目录

  • locate 通过数据库来搜寻
    locate查询速度特别快的原因是它是基于数据库来搜索的。如果你是刚刚创建的数据 可能会搜索不到。数据库默认是每天刷新一次,当然也可以通过updatedb来手动刷新。

     maoxh@maoxh-pc:~$ locate -i nacos
     /data/nacos
     /data/nacos-server-2.0.4.zip
     /data/nacos/LICENSE
     /data/nacos/NOTICE
     /data/nacos/bin
     ...
    

    选项与参数:
    -i : 忽略大小写
    -c : 机算数量
    -l : 输出几行。 -l 5
    -S : 输出locate所使用的数据库文件的相关信息
    -r : 后面可接正则表达式

  • find 强大的搜索指令

    find [path] [option] [action]

    1. 找出/etc下面,文件日期比/etc/passwd新的 find /etc -newer /etc/passwd\
    2. 找出文件名是 passwd的文件
      find / -name passwd\
    3. 找出文件名包含passwd关键字的文件
      find / -name "*passwd*"\
    4. 找出/run目录下,文件类型是Socket的文件名 find /run -type s

    搜索文件类型是TYPE的,类型主要有:一般文件(f),设备文件(b,c),目录(d),链接文件(l),socket(s),以及FIFO(p)等属性

    1. 找出 文件大小 大于1MB的文件 find / -size +1M