Skip to content

LinuxBase

kcp edited this page Nov 21, 2020 · 4 revisions

title: Linux基础 date: 2018-12-15 11:11:23 tags: - 基础 categories: - Linux

目录 start

  1. Linux系统
    1. 用户管理
      1. 用户
      2. 用户组
      3. sudo
      4. 终端和登录
    2. 环境变量
    3. 系统资源管理
      1. ulimit
    4. 进程
      1. 信号量
      2. 孤儿进程和僵死进程
        1. 孤儿进程
        2. 僵死进程
      3. 守护进程
      4. 线程
      5. 文件描述符 FD
    5. 时间
    6. 服务管理
      1. init进程
      2. systemd 方式服务管理
      3. service 方式管理
      4. update-rc.d 方式管理
  2. 硬件信息
    1. 内存
      1. 虚拟内存
      2. 交换内存
  3. 终端快捷键
    1. Delete
    2. Convert
    3. Jump
    4. Search
    5. Control
  4. 常见对比
    1. 文件系统对比
    2. 桌面环境对比
    3. 窗口管理器对比
    4. 文件管理器对比
    5. 包管理
  5. Tips
    1. 一行执行多条命令
    2. 让命令在后台运行
    3. 修改主机名
    4. 文件类型默认打开方式 MIME
    5. 熵池

目录 end|2020-11-01 17:43|


Linux系统

新手的话 特别注意不要随意 root权限 直接更改配置文件,容易导致系统crash(除非你明确的知道这个更改操作的作用, 即使如此也需要先备份原文件)


用户管理

用户

  • 添加用户 test1 sudo adduser test1

    • 注意 useradd 只新建用户不会创建对应的主目录
  • 删除用户以及对应的home目录:sudo deluser username --remove-home

  • 切换用户 su

  • su -l username 当前用户的环境下登录用户(当成一个程序一样可以退出登录)

  • 修改密码 passwd

    • passwd user
    • echo "root:caishi" | chpasswd 如果是普通用户就是 sudo chpasswd
  • 修改相关信息 usermod

verb long verb comment
-d --home HOME_DIR 用户的新主目录
-e --expiredate EXPIRE_DATE 设定帐户过期的日期为 EXPIRE_DATE
-f --inactive INACTIVE 过期 INACTIVE 天数后,设定密码为失效状态
-g --gid GROUP 强制使用 GROUP 为新主组
-G --groups GROUPS 新的附加组列表 GROUPS
-a --append GROUP 将用户追加至上边 -G 中提到的附加组中,并不从其它组中删除此用
-l --login LOGIN 新的登录名称
-L --lock 锁定用户帐号
-m --move-home 将家目录内容移至新位置 (仅于 -d 一起使用)
-p --password PASSWORD 将加密过的密码 (PASSWORD) 设为新密码
-R --root CHROOT_DIR chroot 到的目录
-s --shell SHELL 该用户帐号的新登录 shell
-U --unlock 解锁用户帐号

所有参数说明


  • passwd 选项 用户名 更改口令(密码)
    • -l 锁定口令,禁用账号 -u 口令解锁 -d 账号无口令 -f 强迫用户下次登录时修改口令
    • 当前用户 passwd 就是修改当前用户口令 超级用户就可以命令后接用户名,修改任意用户

  • pwcov 注:同步用户从/etc/passwd 到/etc/shadow
  • pwck 注:pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整;
  • pwunconv 注:是pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件;
  • finger 注:查看用户信息工具
  • id 注:查看用户的UID、GID及所归属的用户组
  • chfn 注:更改用户信息工具
  • visudo 注:visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的;
  • who /var/log/wtmp 查看登录记录

用户组

相关 博客

  • 修改用户至指定组 sudo usermod -G 用户组 用户

  • 显示用户所在组 groups

    • 缺省是当前用户, 若指定即输出指定用户的用户组
  • 添加用户组 groupadd

    • 缺省参数 就是新建用户组
    • -g GID 指定新用户组的组标识号GID
    • -o 一般和g共用 表示新用户组的GID可以与系统已有用户组的GID相同。
  • 删除用户组 groupdel

  • groupmod 选项 用户组

    • -g GID 为用户组指定新的组标识号。
    • -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
    • -n 新用户组 将用户组的名字改为新名字
  • grpck 检查/etc/group文件是否正确

  • grpconv 注:通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建;

  • 注:通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件

sudo

  • 添加用户 test1 到sudo组 注意: 将用户加入sudo组,debian系有效 alpine无效 只能改文件
    1. 将用户 testUser 加入 sudo 组 sudo gpasswd -a test1 sudo 或者 usermod -G sudo test1
    2. 或者:使用修改文件的方式:(不推荐)
      • chmod 777 /etc/sudoers 然后直接 sudo visudo就是调用vi来打开文件的简写
      • 添加一行 Debian: test1 ALL=(ALL:ALL)ALL 注意 Centos:test1 ALL=(ALL) ALL
      • chmod 440 /etc/sudoers

终端和登录

参考: linux终端相关概念解释及描述
参考: 终端基本概念&终端登录过程详解

  1. tty 终端设备的统称
    • 通常使用tty来简称各种类型的终端设备
  2. pty 虚拟终端
    • 远程登录,图形化终端模拟器等操作使用
    • pts(pseudo-terminal slave)是pty的实现方法,与ptmx(pseudo-terminal master)配合使用实现pty。

通常Linux平台的终端模拟器新建tab时都是新建 pty, 但是Mac平台上则是新建tty


环境变量

zsh 环境变量

.zshenv → [.zprofile if login] → [.zshrc if interactive] → [.zlogin if login] → [.zlogout sometimes].

Bash 环境变量加载顺序

  1. /etc/profile
  2. $HOME/.bash_profile
  3. $HOME/.bashrc
  4. $HOME/.bash_login
  5. $HOME/.profile

千万别混淆 Bash/Zsh 的四种运行模式
ssh连接远程主机执行脚本的环境变量问题


系统资源管理

ulimit

参考: Linux下设置最大文件打开数nofile及nr_open、file-max

注意 ulimit命令只对当前终端(tty)生效


进程

参考 深入理解计算机系统 书籍

  1. pid_t来表示一个进程的pid,因此能表示的进程的范围一定不会超过pid_t类型的大小
    • 查看 pid 范围 cat /proc/sys/kernel/pid_max

doc: fork
wiki: fork bomb

参考: linux常见进程与内核线程0 1 2 等内核进程

信号量

进程通信的一种标准化的方式

/bin/kill -L 可查看所有信号量

 1 HUP      2 INT      3 QUIT     4 ILL      5 TRAP     6 ABRT     7 BUS
 8 FPE      9 KILL    10 USR1    11 SEGV    12 USR2    13 PIPE    14 ALRM
15 TERM    16 STKFLT  17 CHLD    18 CONT    19 STOP    20 TSTP    21 TTIN
22 TTOU    23 URG     24 XCPU    25 XFSZ    26 VTALRM  27 PROF    28 WINCH
29 POLL    30 PWR     31 SYS

编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。
不可靠信号和可靠信号的区别在于前者不支持排队,只是负责发送, 不负责存储和接收, 可能会造成信号丢失,而后者不会。

参考

常用信号

  • 1 HUP
    • 终端关闭,Session 退出时会发出的信号
  • 2 INT
    • interrupt 中断信号
  • 9 KILL
    • kill 进程不可忽略该信号
  • 15 TERM
    • terminate 终止信号

孤儿进程和僵死进程

参考: 孤儿进程与僵死进程[总结]

孤儿进程

一个父进程退出,而它的子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

注意, 也有意外, 并不总是被 init 进程收养 Ubuntu15.04 删除/sbin/upstart与孤儿进程收养的问题

僵死进程

一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中, 这种进程称之为僵死进程。
因为直到父进程结束后, 该僵死子进程会成为孤儿进程且是僵死进程, 会被 init 收养, 从而被回收, 但是如果父进程一直没有结束, 僵死子进程会一直存在

  • 危害:
    • 占用系统内存 pid等资源, 无法被回收

常规解决方案 Github: 代码示例

  1. 处理信号: 子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵死进程。
  2. fork两次: 原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵死进程。

暴力方案: 直接 kill 掉父进程, 父进程和僵死状态的子进程就一起被回收了

守护进程

参考: 守护进程

线程

  1. 查看创建一个线程占用内存大小 ulimit -s

文件描述符 FD

参考: Linux下 文件描述符(fd)与 文件指针(FILE*)

每一个进程在PCB(Process Control Block)即进程控制块中都保存着一分文件描述符表,文件描述符就是这个表的索引文件,描述符表中每个表项都有一个指向已打开文件的指针。
现在我们明确一下:已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体。

  • 每个进程默认FD有 0 标准输入 1 标准输出 2 错误输出

时间

同步Linux服务器时间

  • /etc/timezone 时区, /etc/localtime 时区及时间

同步时间

  1. 修改时区 cp -y /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  2. 同步时间 /usr/sbin/ntpdate -u cn.pool.ntp.org | 没有就先安装 ntpdate
  3. 查看硬件时间 hwclock -r
    • 如果不同步就需要写入时间 hwclock -w 因为系统重启是参考硬件时间的

自动同步时间

  1. 配置开机自动校验 vim /etc/rc.d/rc.local
    • /usr/sbin/ntpdate -u cn.pool.ntp.org> /dev/null 2>&1; /sbin/hwclock -w
  2. 配置定时任务 crontab -e
    • 00 10 * * * root /usr/sbin/ntpdate -u cn.pool.ntp.org > /dev/null 2>&1; /sbin/hwclock -w

服务管理

init进程

参考: 服务相关命令

systemd 方式服务管理

Arch Doc: systemd

  • systemctl start/stop/restart/reload/edit serviceName 例如 sshd docker 等服务
command 作用
start/stop 启动/停止服务
enable/disable 开机启用/禁用
restart 如果服务在运行中,则重启服务,若不在运行中,则将会启动
try-restart 只在服务已存在运行的状态下启动服务
reload 重新加载配置文件
edit 修改服务配置
status 查看运行状态

系统电源管理

systemctl 命令 作用
systemctl poweroff 关闭系统
systemctl reboot 重启系统
systemctl suspend 进入待机模式
systemctl hibernate 进入休眠模式
systemctl hybrid-sleep 进入混合休眠模式

service 方式管理

/etc/init.d/ 是服务的存放目录

  1. 列出所有服务的状态 service --status-all
  2. 启动/关闭服务 service ssh start/stop

update-rc.d 方式管理

  1. 移除MySQL的自启 sudo update-rc.d -f mysql remove
  2. 设置MySQL随机启动 sudo update-rc.d mysql defaults
  3. 设定MySQL启动顺序 update-rc.d mysql defaults 90 数字越小, 启动顺序越前
  • sysv-rc-conf 略微图形化的管理服务的开机自启
  • chkconfig 简单的输出服务自启状态

系统运行级别

    0        系统停机状态
    1        单用户或系统维护状态
    2~5      多用户状态
    6        重新启动 

硬件信息

  • 查看系统PCI设备:lspci
  • 查看CPU信息:more /proc/cpuinfo
    • 查看物理CPU数:cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
    • 查看每个物理CPU中的内核的个数:cat /proc/cpuinfo | grep "cpu cores"
    • 查看系统所有逻辑CPU个数:cat /proc/cpuinfo | grep "processor" | wc -l
  • 查看系统内存信息:more /proc/meminfo
  • 查看磁盘分区信息:df -l

内存

虚拟内存

参考: What does Virtual memory size in top mean?

参考: The Right Way to Monitor Virtual Memory on Linux

交换内存

swapon, swapoff - enable/disable devices and files for paging and swapping


终端快捷键

  • 鼠标中键 粘贴鼠标左键已选择的文本 VSCode中也适用
  • !num history 中第 num 条命令
  • !! 上一条命令
  • ls !$ 执行命令ls,并以上一条命令的参数为其参数
  • !?string? 执行含有string字符串的最新命令
  • Ctrl L 清屏等价于clear,清除所有这个 shell 提示屏幕中显示的数据。 Mysql也适用
  • reset 刷新 shell 提示屏幕。如果字符不清晰或乱码的话,在 shell 提示下键入这个命令会刷新屏幕。
  • Ctrl ; 显示最近五条剪贴板内容
  • Ctrl Alt Backspace : 杀死你当前的 X 会话。杀死图形化桌面会话,把你返回到登录屏幕。如果正常退出步骤不起作用,你可以使用这种方法。
  • Ctrl Alt Delete : 关机和重新引导 Red Hat Linux。关闭你当前的会话然后重新引导 OS。只有在正常关机步骤不起作用时才使用这种方法。
  • Ctrl Alt Fn: 切换屏幕。 根据默认设置,从 [F1] 到 [F6] 是 shell 提示屏幕, [F7] 是图形化屏幕。但是deepin是F1为图形化

Delete

Controller Key comment
Ctrl D 删除光标后字符,等价于Delete键(命令行若无任何字符,则相当于exit;处理 多行标准输入时也表示EOF)
Ctrl H 退格删除一个字符,相当于通常的Backspace键
Ctrl U 删除光标之前到 行首 的字符 (Zsh中是删除整行)
Esc W 删除光标之前到 行首 的字符
Ctrl K 删除光标之前到 行尾 的字符
Ctrl W 删除光标之前的一个单词
Alt D 删除光标之后的一个单词
Ctrl Y 粘贴上次删除的所有字符
Ctrl _ 撤销修改 等价于 Ctrl x u

Convert

Controller Key comment
Ctrl T 互换当前字符,光标后移
Alt T 互换当前单词与前一个单词,光标后移 等价于 Esc T
Alt D 将当前单词全部转为大写,光标后移
Alt C 将当前单词首字母转为大写,光标后移
Alt L 将当前单词全部转为小写,光标后移(zsh无效)

Jump

Controller Key comment
Ctrl C 取消运行当前行输入的命令,相当于Ctrl + Break
Ctrl A 光标移动到行首(Ahead of line),相当于通常的Home键
Ctrl E 光标移动到行尾(End of line)
Ctrl F 光标向前(Forward)移动一个字符位置
Ctrl B 光标往回(Backward)移动一个字符位置
Alt F 光标向前(Forward)移动一个单词位置
Alt B 光标往回(Backward)移动一个单词位置
Esc F 光标向前(Forward)移动到当前单词的头部
Esc B 光标往回(Backward)移动到当前单词的尾部

Search

Controller Key comment
Ctrl P 调出命令历史中的前一条(Previous)命令,相当于通常的上箭头
Ctrl N 调出命令历史中的下一条(Next)命令,相当于通常的下箭头
Ctrl O 运行上翻下翻出来的命令, 并且自动将下一条命令填入
Ctrl R 向上搜索相关命令(reverse-i-search)继续按 Ctrl R 则继续搜索上一条
Ctrl S 与 Ctrl R 类似, 但是是向下搜索

Control

Controller Key comment
Ctrl Z 暂停程序
Ctrl S 停止回显当前Shell
Ctrl Q 恢复回显当前Shell

常见对比

文件系统对比

参考: 如何选择文件系统:EXT4、Btrfs 和 XFS

目前 Linux 大多采用 ext3,往 ext4 过渡

桌面环境对比

Arch Doc: desktop environment 参考: Linux下15款桌面环境

  1. gnome 占用资源中等,个人对该桌面不感冒
  2. xfce 占用资源少,操作类似于xp
  3. kde 功能强大,占用资源中等
  4. dde deepin设计的桌面环境,小bug略多,但是美观操作方便

X窗口系统的协议和架构 Arch Doc: Xorg

窗口管理器对比

Arch Doc: window manager


文件管理器对比

有单窗口,双列,命令,简洁轻量,笨重完整 各种各样的选择

  • nautilus Gnome默认 挺好用,但是不能自动挂载分区

  • deepin-filemanager deepin默认,较为方便,但是打开手机会卡根本打不开

  • pcmanfm 左边侧栏目录树 会同步nautilus的配置

  • rox-filer 特别小,单击打开,迅速定位文件,适合找东西用

  • thunar 解决了nautilus的缺点,内存也很省

  • dolphin 多标签页,目录树方式查看

  • nemo mint默认的,功能齐全,会同步nautilus的配置,同样有目录树而且是两边都有

  • tuxcmd Tux Commander 双列,小,直接的目录树,学习成本高点

  • ranger 命令行内文件浏览和操作

包管理


Tips

man help 后接使用的命令,就可以得到用户手册和帮助文档

一行执行多条命令

  • && 第2条命令只有在第1条命令成功执行之后才执行 根据命令产生的退出码判断是否执行成功(0成功,非0失败)

  • || 执行不成功(产生了一个非0的退出码)时,才执行后面的命令

  • ; 顺序执行多条命令,当;号前的命令执行完(不管是否执行成功),才执行;后的命令。

  • & 并行执行命令,没有顺序

  • tty 虚拟终端等概念

  • Centos上which并不是命令, 而是别名!

    • which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

让命令在后台运行

参考 Linux 技巧:让进程在后台可靠运行的几种方法

  • 命令后接 & (只是让进程成为job并在当前终端的后台执行 hup信号仍然能影响到)

运行的命令不因 用户注销,网络中断等因素而中断 nohup, disown, screen, setid

  • 让进程对 hang up 信号免疫:
    • nohup, disown
  • 让进程的父进程改为1号进程:
    • setid 或者 (command &)
  • screen

示例

  1. 使用nohup就能屏蔽hup信号,标准输出会输出到当前目录下的nohup.out文件. nohup 命令 &
    1. 将标准输出重定向到空设备 并将错误输出重定向到标准输出 nohup 命令>/dev/null 2>&1
  2. 例如 在当前目录后台打开文件管理器 (dde-file-manager . &) >/dev/null 2>&1

修改主机名

  • sudo hostname linux 重启终端即可看到修改
  • 但是重启电脑会恢复原有名字修改如下文件永久: sudo gedit /etc/hostname 也许需要更改/etc/hosts
  • 立即生效,也要重新登录 hostname -F /etc/hostname

文件类型默认打开方式 MIME

xdg-open 命令


熵池

参考: Linux下熵池大小导致的一些问题

机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测,以此作为熵池来源。

查看当前熵池大小 cat /proc/sys/kernel/random/entropy_avail 熵池最大值 cat /proc/sys/kernel/random/poolsize

当熵池不够时,会导致 gpg tomcat 等应用出现阻塞

可使用 rng-tools Github进行补充熵池

  • 但是 rng 项目的实现原理呢

Summary

Clone this wiki locally