title: Linux基础
date: 2018-12-15 11:11:23
tags:
- 基础
categories:
- Linux
💠
💠 2024-05-19 23:35:07
含大量运维干货
非理性言论?
Linux命令教程
各种技术学习 文档资源
新手的话 特别注意不要随意 root权限 直接更改配置文件,容易导致系统crash(除非你明确的知道这个更改操作的作用, 即使如此也需要先备份原文件)
在线Linux终端
有浏览器虚拟化,以及远程主机多种类型的实现
安装和启动Linux
Ventoy
无需烧录,复制ISO进U盘即可使用
GNU GRUB GRand Unified Bootloader
set prefix=(hd0,msdos7)/grub
insmod normal
normal
sudo adduser test1
useradd
只新建用户不会创建对应的主目录sudo deluser username --remove-home
su
su -l username
当前用户的环境下登录用户(当成一个程序一样可以退出登录)sudo su -
相比于 sudo su 会加载root用户环境变量,切换到HOME工作目录su & su -
passwd
passwd user
echo "root:caishi" | chpasswd
如果是普通用户就是 sudo chpasswdusermod
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 | 解锁用户账号 |
less /etc/passwd
查看全部用户及其用户组passwd 选项 用户名
更改口令(密码)
-l 锁定口令,禁用账号
-u 口令解锁
-d 账号无口令
-f 强迫用户下次登录时修改口令
passwd
就是修改当前用户口令 超级用户就可以命令后接用户名,修改任意用户visudo
注:visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的;who /var/log/wtmp
查看登录记录添加用户组 groupadd
-g GID
指定新用户组的组标识号GID-o
一般和g共用 表示新用户组的GID可以与系统已有用户组的GID相同。显示用户所在组 groups [user]
缺省是当前用户, 或输出指定用户的用户组
修改用户组 sudo usermod -G 用户组 用户
删除用户组 groupdel
groupmod 选项 用户组
gpasswd -a user group
grpck 检查 /etc/group
文件是否正确
grpconv 注:通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建;
注:通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件
sudo gpasswd -a test1 sudo
或者 usermod -G sudo test1
chmod 777 /etc/sudoers
然后直接 sudo visudo
就是调用vi来打开文件的简写test1 ALL=(ALL:ALL)ALL
注意 Centos:test1 ALL=(ALL) ALL
test1 ALL=(ALL) NOPASSWD: ALL
chmod 440 /etc/sudoers
绝对路径执行shell报错无权限 环境:
原因:
方案:逐级排查shell所有父目录对于 sudo指定用户
是否有执行权限
sudo: 没有终端存在,且未指定 askpass 程序
通常Linux平台的终端模拟器新建tab时都是新建 pty, 但是Mac平台上则是新建tty
.zshenv → [.zprofile if login] → [.zshrc if interactive] → [.zlogin if login] → [.zlogout sometimes].
Bash 环境变量加载顺序
alpine 里的sh和ash 默认是不登录shell 需要使用 sh -l 或者 ash -l 才会加载对应的文件
进程是由多个线程(至少有一个)以及持有资源的组合体, 线程可以理解为进程的执行单元
参考 深入理解计算机系统 书籍
cat /proc/sys/kernel/pid_max
参考: 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
的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,只是负责发送, 不负责存储和接收, 可能会造成信号丢失,而后者不会。
常用信号
一个父进程退出,而它的子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
注意, 也有意外, 并不总是被 init 进程收养 Ubuntu15.04 删除/sbin/upstart与孤儿进程收养的问题
一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中, 这种进程称之为僵死进程。 因为直到父进程结束后, 该僵死子进程会成为孤儿进程且是僵死进程, 会被 init 收养, 从而被回收, 但是如果父进程一直没有结束, 僵死子进程会一直存在
常规解决方案 Github: 代码示例
处理信号
: 子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵死进程。fork两次
: 原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵死进程。暴力方案: 直接 kill 掉父进程, 父进程和僵死状态的子进程就一起被回收了
wikipedia: File descriptor
参考: Linux下 文件描述符(fd)与 文件指针(FILE*)
每一个进程在PCB(Process Control Block)即进程控制块中都保存着一分文件描述符表.
文件描述符就是这个表的索引文件,描述符表中每个表项都有一个指向已打开文件的指针。现在我们明确一下:已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体。
FD方式管理的范畴
问题
无法查看创建时间
,但是/proc/pid的目录时间是对的
ulimit -s
ps -T pid
cat /proc/sys/kernel/threads-max
默认值 256287/usr/sbin/ntpdate -q cn.pool.ntp.org
查看差异同步时间
cp -y /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
/usr/sbin/ntpdate -u cn.pool.ntp.org
| 没有就先安装 ntpdatehwclock -r
hwclock -w
因为系统重启后用硬件时间初始化的
自动同步时间
vim /etc/rc.d/rc.local
/usr/sbin/ntpdate -u cn.pool.ntp.org> /dev/null 2>&1; /sbin/hwclock -w
crontab -e
00 10 * * * root /usr/sbin/ntpdate -u cn.pool.ntp.org > /dev/null 2>&1; /sbin/hwclock -w
command | 作用 |
---|---|
start/stop | 启动/停止服务 |
enable/disable | 开机启用/禁用 |
restart | 如果服务在运行中,则重启服务,若不在运行中,则将会启动 |
try-restart | 只在服务已存在运行的状态下启动服务 |
reload | 重新加载配置文件 |
edit | 修改服务配置 |
status | 查看运行状态 |
系统电源管理
systemctl 命令 | 作用 |
---|---|
systemctl poweroff | 关闭系统 |
systemctl reboot | 重启系统 |
systemctl suspend | 进入待机模式 |
systemctl hibernate | 进入休眠模式 |
systemctl hybrid-sleep | 进入混合休眠模式 |
/etc/init.d/ 是服务的存放目录
service --status-all
service ssh start/stop
sudo update-rc.d -f mysql remove
sudo update-rc.d mysql defaults
update-rc.d mysql defaults 90
数字越小, 启动顺序越前系统运行级别
0 系统停机状态
1 单用户或系统维护状态
2~5 多用户状态
6 重新启动
lspci
more /proc/cpuinfo
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
cat /proc/cpuinfo | grep "cpu cores"
cat /proc/cpuinfo | grep "processor" | wc -l
more /proc/meminfo
df -l
查看某进程limit状态 cat /proc/xxxpid/limits
执行ulimit修改命令只对当前终端(tty)生效
持久化修改设置: /etc/security/limits.conf 文件中添加,注销或重启后生效
* soft nofile 4096
* hard nofile 4096
Usage 和 Load 的区别, 使用率针对于Cpu 时间,负载针对于等待和进行中的线程
使用uptime、top或者 cat /proc/loadavg
都可以看到CPU的load 1 5 15 分钟的负载。
运行进程
和正在等待CPU
的进程,状态为R
注意: 一个逻辑核且负载为1时表示有线程一直在等待或运行(满载),四个逻辑核且负载为4时表示四个核心都一直有线程在等待或运行(满载)
lscpu 展示CPU信息
taskset 将任务绑定在指定cpu核心上
对于Linux来说, 有内存就去分配使用, 只有内存不够申请的大小,才会去释放 buffer或cache, 对于服务器来说, 交换内存会带来性能的明显下降 一般是不会配置的
内存组成
空闲内存, 已使用, buffers, cached
Virtual Memory 虚拟内存
Resident Memory 持久内存
Shared Memory 共享内存(多进程间共享)
查看内存大页设置 cat /sys/kernel/mm/transparent_hugepage/enabled
关闭内存大页 echo never > /sys/kernel/mm/transparent_hugepage/enabled
内核参数: vm.overcommit_memory
cat /proc/meminfo | grep commit
当操作系统认为内存不足时,会选择分数值较高的进程kill掉(用户进程,非内核进程)
参考: 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
交换内存分析 VIRT = SWAP + RES or equal SWAP = VIRT - RES
grep -i VmSwap /proc/*/status
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less
smem
Report memory usage with shared memory divided proportionally鼠标中键
粘贴鼠标左键已选择的文本 VSCode中也适用
!num
history 中第 num 条命令!!
上一条命令ls !$
执行命令ls,并以上一条命令的参数为其参数!?string?
执行含有string字符串的最新命令Ctrl L
清屏等价于clear,清除所有这个 shell 提示屏幕中显示的数据。 Mysql也适用
reset
刷新 shell 提示屏幕。如果字符不清晰或乱码的话,在 shell 提示下键入这个命令会刷新屏幕。Ctrl ;
显示最近五条剪贴板内容但是deepin是F1为图形化
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
|
Controller | Key | comment |
---|---|---|
Ctrl | T | 互换当前字符,光标后移 |
Alt | T | 互换当前单词与前一个单词,光标后移 等价于 Esc T
|
Alt | D | 将当前单词全部转为大写,光标后移 |
Alt | C | 将当前单词首字母转为大写,光标后移 |
Alt | L | 将当前单词全部转为小写,光标后移(zsh无效) |
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)移动到当前单词的尾部 |
Controller | Key | comment |
---|---|---|
Ctrl | P | 调出命令历史中的前一条(Previous)命令,相当于通常的上箭头 |
Ctrl | N | 调出命令历史中的下一条(Next)命令,相当于通常的下箭头 |
Ctrl | O | 运行上翻下翻出来的命令, 并且自动将下一条命令填入 |
Ctrl | R | 向上搜索相关命令(reverse-i-search)继续按 Ctrl R 则继续搜索上一条 |
Ctrl | S | 与 Ctrl R 类似, 但是是向下搜索 |
Controller | Key | comment |
---|---|---|
Ctrl | Z | 暂停程序 |
Ctrl | S | 停止回显当前Shell |
Ctrl | Q | 恢复回显当前Shell |
目前 Linux 大多采用 ext4, Btrfs
Btrfs 的快照功能很适合 Arch 系统,滚动更新挂掉的话可以通过历史快照恢复回来
gnome mutter
设计的桌面环境,小bug略多,而且渲染会占用较多资源,容易卡顿,但是美观操作方便
dde-kwin
,流畅了一些,但是窗口顶部有个大的Title 隐藏Deppin大标题栏
有单窗口,双列,命令,简洁轻量,笨重完整 各种各样的选择
nautilus
Gnome默认 挺好用,但是不能自动挂载分区deepin-filemanager
deepin默认,较为方便,但是打开手机会卡根本打不开pcmanfm
左边侧栏目录树 会同步nautilus的配置rox-filer
特别小,单击打开,迅速定位文件,适合找东西用thunar
解决了nautilus的缺点,内存也很省dolphin
多标签页,目录树方式查看nemo
mint默认的,功能齐全,会同步nautilus的配置,同样有目录树而且是两边都有tuxcmd
Tux Commander 双列,小,直接的目录树,学习成本高点ranger
命令行内文件浏览和操作snap
flatpak
AppImage
man help 后接使用的命令,就可以得到用户手册和帮助文档
&&
第2条命令只有在第1条命令成功执行之后才执行 根据命令产生的退出码判断是否执行成功(0成功,非0失败)
||
执行不成功(产生了一个非0的退出码)时,才执行后面的命令
;
顺序执行多条命令,当;号前的命令执行完(不管是否执行成功),才执行;后的命令。
&
并行执行命令,没有顺序
Centos上which并不是命令, 而是别名!
which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
运行的命令不因 用户注销,网络中断等因素而中断 nohup, disown, screen, setid
(command &)
示例
nohup
就能屏蔽hup信号,标准输出会输出到当前目录下的nohup.out文件. nohup 命令 &
nohup 命令>/dev/null 2>&1
(dde-file-manager . &) >/dev/null 2>&1
1 -> /dev/pts/10 (deleted)
strace -e write -p pid
(但局限于echo printf pwd等命令的输出,其他命令的输出不会被trace)sudo hostname linux
重启终端即可看到修改sudo gedit /etc/hostname
也许需要更改 /etc/hosts
hostname -F /etc/hostname
xdg-open 命令
机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测,以此作为熵池来源。
查看当前熵池大小 cat /proc/sys/kernel/random/entropy_avail 熵池最大值 cat /proc/sys/kernel/random/poolsize
当熵池不够时,会导致 gpg tomcat 等应用出现阻塞
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。