zoukankan      html  css  js  c++  java
  • Linux学习笔记

    作者:Grey

    原文地址:Linux学习笔记

    说明

    本文中Linux基于CentOS 7,主要是日常学到的一些笔记,所以内容相对零散。

    /目录下文件夹主要作用

    [root@linux /]# ll /
    total 16
    lrwxrwxrwx.   1 root root    7 Aug 17 02:40 bin -> usr/bin
    dr-xr-xr-x.   5 root root 4096 Sep 13 22:03 boot
    drwxr-xr-x.  20 root root 3200 Sep 13 21:58 dev
    drwxr-xr-x.  74 root root 8192 Sep 13 22:03 etc
    drwxr-xr-x.   2 root root    6 Apr 11  2018 home
    lrwxrwxrwx.   1 root root    7 Aug 17 02:40 lib -> usr/lib
    lrwxrwxrwx.   1 root root    9 Aug 17 02:40 lib64 -> usr/lib64
    drwxr-xr-x.   2 root root    6 Apr 11  2018 media
    drwxr-xr-x.   2 root root    6 Apr 11  2018 mnt
    drwxr-xr-x.   2 root root    6 Apr 11  2018 opt
    dr-xr-xr-x. 109 root root    0 Sep 13 21:58 proc
    dr-xr-x---.   2 root root  151 Sep 13 21:59 root
    drwxr-xr-x.  25 root root  740 Sep 13 22:03 run
    lrwxrwxrwx.   1 root root    8 Aug 17 02:40 sbin -> usr/sbin
    drwxr-xr-x.   2 root root    6 Apr 11  2018 srv
    dr-xr-xr-x.  13 root root    0 Sep 13 21:58 sys
    drwxrwxrwt.   8 root root  172 Sep 13 22:58 tmp
    drwxr-xr-x.  13 root root  155 Aug 17 02:40 usr
    drwxr-xr-x.  19 root root  267 Aug 17 02:45 var
    

    其中:

    /boot

    系统启动相关的文件,如内核,initrd,以及grub(bootloader)

    /dev

    设备文件

    /etc

    配置文件

    /home

    用户的家目录,每一个用户的家目录通常默认为:/home/USERNAME

    /root

    管理员的家目录

    /lib

    库文件

    /media

    挂载点目录,移动设备

    /mnt

    挂载点目录,额外的临时文件系统

    /opt

    可选目录,第三方程序的安装目录

    /proc

    伪文件系统,内核映射文件

    /sys

    伪文件系统,跟硬件设备相关的属性映射文件

    /tmp

    临时文件,/var/tmp

    /var

    可变化的文件,比如:日志文件,数据文件

    /bin

    可执行文件,用户命令

    /sbin

    管理命令

    文件系统相关命令

    df 显示磁盘的使用情况

    du 显示文件系统的使用情况

    ls 显示目录

    Linux中的文件类型

    - 普通文件

    d 目录文件

    b 块设备文件(block)

    c 字符设备文件

    l 符号链接文件(symbolic link file)

    p 命令管道文件(pipe)

    s 套接字文件(socket)

    文件基本信息说明

    image

    image

    挂载/卸载

    /boot目录的加载和卸载
    在/下:

    umount /dev/sda1
    mount /dev/sda1 /boot
    

    通过挂载实验来演示块设备

    第一步,通过以下命令生成100m的空img文件,其中dd命令可以用于硬盘的互相拷贝。

    dd if=/dev/zero of=mydisk.img bs=1048576 count=100
    

    第二步,使用losetup将磁盘镜像文件虚拟成块设备

    losetup /dev/loop0 mydisk.img 
    

    第三步,通过mke2fs命令用于建立ext2文件系统。

    mke2fs /dev/loop0
    

    第四步,挂载

    mkdir /mnt/myos
    
    mount -t ext2 /dev/loop0 /mnt/myos
    

    查看/dev/loop0信息,它就是一个块设备

    [root@linux /]# ll /dev/loop0
    brw-rw----. 1 root disk 7, 0 Sep 14 01:15 /dev/loop0
    

    继续完善/mnt/myos目录,首先,拷贝bash到myos的bin目录中

    mkdir /mnt/myos/bin
    
    cd /mnt/myos
    
    cp /bin/bash ./bin
    

    查看bash需要的依赖

    ldd /mnt/myos/bin/bash
    
    linux-vdso.so.1 =>  (0x00007ffd88ba5000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fb19c6ca000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fb19c4c6000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fb19c0f8000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fb19c8f4000)
    

    模拟bash的依赖结构,我们建立好对应的依赖存放目录

    mkdir /mnt/myos/lib64
    

    将系统中bash的所有依赖拷贝到这个目录

    cp /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /mnt/myos/lib64/
    

    启动myos下的bash

    cd /mnt/myos
    
    chroot ./
    

    注:chroot 命令把根目录换成指定的目的目录。

    使用echo和重定向测试bash

    [root@linux myos]# chroot ./
    bash-4.2# echo "d" > /abc.txt
    

    退出bash,并在/mnt/myos目录下,

    [root@linux myos]# cat /mnt/myos/abc.txt
    d
    

    文件描述符操作实验

    第一步,创建一个文件,并写入一些内容。

    vi abc.txt
    

    写入一些内容

    dfasdfasdfasdfa1
    asdfasdfasd2
    sadfasdfasd3
    

    将abc.txt读入4号文件描述符

    exec 4< abc.txt
    

    查看当前进程所有文件描述符

    ll /proc/$$/fd
    
    [root@linux data]# ll /proc/$$/fd
    total 0
    lrwx------. 1 root root 64 Sep 14 02:44 0 -> /dev/pts/0
    lrwx------. 1 root root 64 Sep 14 02:44 1 -> /dev/pts/0
    lrwx------. 1 root root 64 Sep 14 02:44 2 -> /dev/pts/0
    lrwx------. 1 root root 64 Sep 14 02:46 255 -> /dev/pts/0
    lr-x------. 1 root root 64 Sep 14 02:46 4 -> /data/abc.txt
    

    查看当前进程打开的文件

    lsof -p $$
    
    [root@linux data]# lsof -p $$
    COMMAND  PID USER   FD   TYPE DEVICE  SIZE/OFF     NODE NAME
    ....
    bash    1252 root    4r   REG  253,0        84 34172896 /data/abc.txt
    ....
    

    将abc.txt第一行读出来

    [root@linux data]# read a 0<& 4
    [root@linux data]# echo $a
    sdfasdfasdfasdfasdfasdfasdfasd
    

    文件偏移量实验

    每个进程的偏移量互不影响,每个fd会单独维护一个seek(指针)
    查看文件偏移量

    lsof -op $$
    

    可以看到,一开始偏移量(OFFSET字段):0t31

    [root@linux data]# lsof -op $$
    COMMAND  PID USER   FD   TYPE DEVICE OFFSET     NODE NAME
    ....
    bash    1252 root    4r   REG  253,0   0t31 34172896 /data/abc.txt
    ....
    

    重新打开一个,并再次查看文件偏移量,0t0。

    exec 4< /data/abc.txt 
    
    [root@linux data]# lsof -op $$
    COMMAND  PID USER   FD   TYPE DEVICE OFFSET     NODE NAME
    ....
    bash    1252 root    4r   REG  253,0    0t0 34172896 /data/abc.txt
    ....
    

    模拟socket实验

    模拟和baidu建立tcp连接

    cd /proc/$$/fd && exec 8<> /dev/tcp/www.baidu.com/80
    
    [root@linux fd]# ll
    total 0
    lrwx------. 1 root root 64 Sep 14 05:54 0 -> /dev/pts/0
    lrwx------. 1 root root 64 Sep 14 05:54 1 -> /dev/pts/0
    lrwx------. 1 root root 64 Sep 14 05:54 2 -> /dev/pts/0
    lrwx------. 1 root root 64 Sep 14 05:55 255 -> /dev/pts/0
    lrwx------. 1 root root 64 Sep 14 05:58 8 -> socket:[21649]
    

    可以看到建立了一个socket连接

    使用lsof查看对应的文件描述符信息

    [root@linux fd]# lsof -op $$
    COMMAND  PID USER   FD   TYPE DEVICE OFFSET     NODE NAME
    ....
    bash    1275 root    8u  IPv4  21834    0t0      TCP 192.168.118.136:40794->183.232.231.172:http (ESTABLISHED)
    ....
    

    标准输入/输出/错误输出,以及重定向

    设备 设备名 文件描述符 类型
    键盘 /dev/stdin 0 标准输入
    显示器 /dev/stdout 1 标准输出
    显示器 /dev/stderr 2 标准错误输出

    输入重定向符号: <

    read var < /path/to/a/file
    

    输出重定向 >   >> 2> &>

    清空输入

    echo 123 > /path/to/a/file  
    

    追加

    echo 123 >> /path/to/a/file
    

    错误输入

    echo 12343 2> /path/to/a/file 
    

    全部输入

    echo 122 &> /path/to/a/file 
    

    示例1:其中/asdfasdfasdf目录不存在,所以执行ls会报错

    [root@sec ~]# ls ./ /asdfasdfasdf 1>ls01.out
    ls: cannot access '/asdfasdfasdf': No such file or directory
    [root@sec ~]# cat ls01.out 
    ./:
    abc.txt
    anaconda-ks.cfg
    cat.out
    ls01.out
    ls.out
    

    由于1表示标准输出,所以ls01.out中只记录了非错误的信息,即ls ./的内容

    如果要保存错误信息,可以通过如下方式:

    [root@sec ~]# ls ./ /asdfasdfasdf 1>ls01.out 2>ls03.out
    [root@sec ~]# cat ls03.out 
    ls: cannot access '/asdfasdfasdf': No such file or directory
    
    # 或者这样
    [root@sec ~]# ls ./ /asdfasdfasdf 1> ls04.out 2>& 1
    [root@sec ~]# cat ls04.out 
    ls: cannot access '/asdfasdfasdf': No such file or directory
    ./:
    a
    abc.txt
    anaconda-ks.cfg
    cat.out
    ls01.out
    ls02.out
    ls03.out
    ls04.out
    ls.out
    

    父子进程

    当前进程的id号

    echo $$ 
    

    父进程PID是1275

    再启动一个bash

    /bin/bash
    

    再次查看当前进程号

    echo $$ 
    

    子进程PID为1820

    在子进程中查看父子进程关系, 先安装pstree

    yum install psmisc -y 
    

    用pstree指令可以查看进程的父子关系

    image

    也可以通过

    ps -ef |grep 1275
    

    查看父子进程的关系

    image

    父进程中定义的变量和子进程中定义的变量是互相隔离的,如果需要子进程访问父进程的变量,父进程要执行export命令。

    管道

    示例1:查询abc.txt中的第五行数据

    head -5 abc.txt | tail -1
    

    示例2:管道会开辟两个子进程,并且左边输出衔接到右边输入,所以a=9是在子进程中执行的,父进程中a还是等于1

    image

    $$的优先级比管道高
    $BASHPID优先级比管道低

    [root@linux /]# { echo $BASHPID; read x; } | { cat; echo $BASHPID; read y;}
    1953
    

    1953是子进程ID

    [root@linux /]# { echo $$; read x; } | { cat; echo $$; read y;}
    1275
    

    1275是父进程ID

    Linux中的内部命令和外部命令

    什么是Shell?

    bash shell,就是一个程序,就是Linux系统安装的一个软件,用户通过用户名密码登录操作系统后,直接进入bash shell软件

    如果平时退出不了某个程序,可以复制一个ssh对话,用ps -ef找到那个进程,用kill -9 退出即可

    Shell 命令分为外部命令和内置命令:

    比较 内置命令 外部命名
    定义 Bash Shell 自带的命令 Linux 系统中的应用程序
    执行效率
    执行过程 调用当前 Shell 进程的一个函数 触发磁盘 I/O,fork 出一个单独的进程,执行完成后退出

    内部命令(Shell自带的命令)

    查看cd命令

    type cd
    

    显示:cd is a shell builtin

    说明cd命令是shell自带的命令

    通过

    help -d
    

    可以查看所有内置命令

    外部命令(不是Shell自带的命令,由用户安装的)

    比如ifconfig命令

    type ifconfig
    

    显示:ifconfig is /usr/sbin/ifconfig

    使用file命令查看命令是一个什么类型的文件

    file /usr/sbin/ifconfig
    

    显示:

    /usr/sbin/ifconfig: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=22d5b3be8d3ce3c71cad5b982581ede262397b56, stripped
    

    使用whereis查看某个命令在哪个位置

    whereis ifconfig
    

    显示

    ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
    

    此外:

    1. 内部命令的帮助用help指令,外部命令的帮助用man指令

    2. bash shell在执行命令的时候,做了两步优化:1. 通过PATH来(echo $PATH) 2. 通过hash来,hash查看,hash -r(清空hash)

    编写脚本时候, 如需要执行,要赋予该文件执行权限chmod u+rx filename

    如果bash执行,不需要赋予执行权限

    bash ./filename.sh
    ./filename.sh
    

    以上两种执行方式都是新开一个进程

    source ./filename.sh
    .filename.sh
    

    这种方式执行不会产生新的子进程

    变量赋值

    a=123
    
    let a=10+2
    
    l=ls
    
    let c=$(ls -l /etc) 
    let c=`ls -l /etc`
    

    变量值有空格等特殊字符可以包括在"" 或 ``中

    可以通过echo ${变量名}查看变量的值

    变量的导出使用export命令,让子进程获得父进程的变量值

    变量的删除使用unset命令

    stat和touch 组合使用,可以增量监控数据改变的时间

    详见:linux命令系列 stat & touch

    Linux的进程优先级

    Linux采用了两种不同的优先级范围,一种是用nice值,它的范围从-20 ~ +19, 默认为0;越大的nice值意味着更低的优先级,在Mac OS X中,进程的nice值代表分配给进程的时间片的绝对值;而Linux系统中,nice则代表时间片的比例。ps el命令中的NI列就是该进程的nice值。

    另一种范围是实时优先级,其值是可以配置的,默认情况下它的变化范围是从0到99,与nice值相反,越高的实时优先级数值意味着优先级越高。任何实时进程的优先级都高于普通进程。可以通过ps -eo state,uid,ppid,rtprio,time,comm查看,RTPRIO列即为实时优先级,如果显示-,则说明它不是实时进程。

    时间同步

    第一步,安装ntpdate工具

    yum -y install ntp ntpdate
    

    第二步,设置时间为阿里服务器的时间

    ntpdate ntp1.aliyun.com
    

    第三步,将系统时间写入硬件时间

    hwclock –systohc
    

    使用screen

    Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。

    新建一个叫yourname的session

    screen -S yourname
    

    列出当前所有的session

    screen -ls
    

    回到yourname这个session

    screen -r yourname
    

    远程detach某个session

    screen -d yourname 
    

    结束当前session并回到yourname这个session

    screen -d -r yourname
    

    软硬链接

    硬链接

    ln /data/x.txt /data/b.txt
    

    通过stat查看两个文件的信息:

    stat x.txt
    stat b.txt
    

    Innode号一致,修改任何一个,另外一个都可以同步修改,删掉任何一个,不会影响另外那个

    软连接

    ln -s /data/x.txt /data/b.txt
    

    Innode号不一致,删掉x.txt个,b.txt的链接会丢失

    拒绝用户登录

    Linux用户管理之使用/bin/false和/usr/sbin/nologin拒绝用户登录及其功能分析(转)

    参考资料

    linux下的exec命令

    Linux命令行大全

    Linux就该这么学

    Linux预习资料 提取码:7w30

    CentOS6.x升级到CentOS7.x的注意事项视频 提取码: yhfd

    Linux内核设计与实现

    极客时间-Linux实战技能100讲

    Linux文件权限详解

    Linux losetup 命令

    linux 输入、输出重定向的概念和用法详解(Day01)

    Shell内置命令

  • 相关阅读:
    poj2240
    poj1135
    poj1062
    poj3278
    2218 补丁vs错误
    必做: 1041、1024、1077、2218、1183(较难)
    poj2828
    poj3253
    洛谷P1122 最大子树和
    1074 食物链
  • 原文地址:https://www.cnblogs.com/greyzeng/p/14779862.html
Copyright © 2011-2022 走看看