Contents

操作系统-linux-个人笔记

ubuntu官方文档

ubuntu 18.04 server官方文档

linux265

文件权限

菜鸟教程 Linux 文件基本属性

12位四列,每列3位

第一列标记文件类型

  • -:普通文件
  • d:目录文件
  • b:块设备
  • c : 字符设备
  • l :符号链接文件
  • p:管道文件pipe
  • s:套接字文件socket

后面3列分为文件所有者权限,文件所属组用户(所有者可以不在所属组中)权限和其他用户权限

每个用户可以设置r读,w写和x执行权限

Ubuntu无gui配置ip

CSDN 白帽菜菜

CSDN zgrjddd

  1. 配置静态ip
1
vim /etc/network/interfaces
1
2
3
4
5
6
auto eth0
iface eth0 inet static
address 192.168.126.114
netmask 255.255.255.0
gateway 192.168.126.2
broadcast 192.168.126.255
  1. 配置DNS解析器
1
vim /etc/resolv.conf
1
2
nameserver 8.8.8.8
nameserver 114.114.114.114
  1. 重启网络
1
sudo /etc/init.d/networking restart

Ubuntu配置清华镜像源

见清华镜像源官网

验证ca证书出错时的解决办法

51CTO ubuntu 18.04换清华镜像源证书错误

  1. /etc/apt/sources.list配置源从https改为http
  2. apt update+apt install apt-transport-https ca-certificates
  3. 将配置改回来

wireshark

监听某个网卡上的数据包,lo是回环地址

添加过滤器:选择表达式,设置你要过滤的字段和过滤值,或者直接在过滤栏里面输入ip.src之类的字段,条件之间使用逻辑运算符连接&&、||、!

图形化界面

CSDN antdz

CSDN 丘上人

duoluosb

  • ubuntu几种运行级:# 0 - 停机(千万不能把initdefault 设置为0 )# 1 - 单用户模式 # 2 - 多用户,没有 NFS # 3 - 完全多用户模式(标准的运行级) # 4 - 没有用到 # 5 - X11 (xwindow) # 6 - 重新启动 (千万不要把initdefault 设置为6 )
  • 多用户字符模式下有6个默认tty,使用ctrl+alt+Fn切换,init 5会默认占用一个tty进行登录(通常时F1的tty),当登录一个用户时再占用另一个tty
  • Linux本身没有图形界面,Linux现在的图形界面系统只是Linux下的应用程序
  • X是协议,不是具体的某个软件,它用于实现图形化界面,X协议主要由X应用程序和X服务器组成,X应用程序告诉服务器如何在屏幕上画图,XFree86是X服务器程序
  • WM(Window Manager,窗口管理器)的作用就是窗口的最大化、最小化、移动、关闭等。而这些不是X服务器来负责完成的。WM有GNOME和KDE。
  • X客户端程序
http://hi.csdn.net/attachment/201107/9/0_1310222074XOX4.gif
X客户端程序
  • KDE、GNOME、QT和GTK直接关系:QT基础上实现的窗口管理器叫KDE,在GTK基础上实现的窗口管理器叫GNOME。KDE和GNOME并不只是窗口管理器,同时提供了桌面、菜单等等

命令:

  • init n:以n启动级重启主机
  • startx:打开默认窗口管理器
  • xinit:打开图形化界面,基于X server
  • twm,gnome-session,startkde:分别启动X服务器自带的twm窗口管理器、gnome窗口管理器或KDE窗口管理器
  • systemctl set-default xxx:设置默认启动级,graphical.target对应5,multi-user.target对应3

systemctl是systemd命令组的主命令,systemd是为了取代传统init的启动方式,详见linux常见命令systemd

开机启动脚本

CSDN 土豆西瓜大芝麻

三种开机启动设置方法

  1. /etc/rc.d/rc.local文件将会在开机时运行,所以可以在这个文件里面运行你要运行的脚本
  2. crontab添加@reboot时间标记的条目
  3. systemd方式,在/etc/systemd/system/中添加Unit配置文件比如命名为auto_run_script.service,并编辑
1
2
3
4
5
6
7
8
9
[Unit]
Description=Run a Custom Script at Startup
After=default.target
 
[Service]
ExecStart=/home/ok/auto_run_script.sh
 
[Install]
WantedBy=default.target

然后运行命令

1
2
3
4
# 加载添加的unit配置
systemctl daemon-reload
# 激活unit配置
systemctl enable auto_run_script.service

ubuntu卸载firefox,安装chrome

CSDN broadview_java

卸载firefox

1
2
3
4
# 检查firefox安装的相关软件
dpkg --get-selections |grep firefox
# 卸载相关的软件,remove会保留配置文件,purge不保留配置文件
sudo apt-get purge firefox firefox-locale-en firefox-locale-zh-hans

安装chrome

去官网下载或者直接wget deb包,然后dpkg -i安装

1
2
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
dpkg -i google-chrome-stable_current_amd64.deb

chrome不支持自动更新,如果要升级则把安装chrome步骤再做一遍

IO模型

源码笔记

阻塞与非阻塞

阻塞:调用方等待被调用方响应

非阻塞:不等待

同步与异步

同步:被调用方处理完后才响应

异步:被调用方收到请求后先返回已收到,处理完后通过回调方式通知调用方

5种IO模型

  • 阻塞IO
  • 非阻塞IO:轮询
  • (阻塞同步)IO复用
  • (非阻塞异步)信号驱动IO
  • (非阻塞异步)异步IO

select,poll和epoll

简书 VictorHong

IO多路复用的三种方式

select poll epoll
操作方式 遍历 遍历 回调
底层实现 数组 链表 哈希表
IO效率 每次调用都进行线性遍历,时间复杂度为O(n) 每次调用都进行线性遍历,时间复杂度为O(n) 事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪fd放到rdllist里面。时间复杂度O(1)
最大连接数 1024(x86)或 2048(x64) 无上限 无上限
fd拷贝 每次调用select,都需要把fd集合从用户态拷贝到内核态 每次调用poll,都需要把fd集合从用户态拷贝到内核态 调用epoll_ctl时拷贝进内核并保存,之后每次epoll_wait不拷贝

配置代理

linux265

分为用户代理和所有用户的代理配置

用户代理通常是在用户主目录里面添加配置文件,所有用户代理通常是在etc目录里面修改配置文件

ubuntu配置代理

.bashrc

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
export charles_socks_port="8888"
export charles_http_port="8889"
export charles_https_port="8889"

export v2ray_socks_port="10808"
export v2ray_http_port="10809"
export v2ray_https_port="10809"

export http_proxy="http://${proxy_addr}:${charles_http_port}"
export https_proxy="http://${proxy_addr}:${charles_https_port}"
export all_proxy="http://${proxy_addr}:${charles_socks_port}"

另外安装完证书后,系统设置里面也要使用你宿主机的地址和代理端口号

注意主机防火墙的问题

对于连接到charles的虚拟机还需要安装证书

CSDN 滋滋ɷ

当配置的代理服务器需要身份验证时配置为以下形式:

1
export HTTPS_PROXY="http://user:password@host"

kali

kali使用proxychains4或者proxychains,仅需要配置proxychains4.conf即可。

使用代理运行程序时将命令放到proxychains4后面即可。

1
proxychains msfconsole

输入法切换快捷键

win+space

启动主机转发功能

开启Linux系统路由转发功能 实现多网段电脑共享上网

仅对本次开机开启

1
echo "1" >/proc/sys/net/ipv4/ip_forward

长期开启

修改/etc/sysctl.conf中net.ipv4.ip_forward为1

配置环境变量

百家号 Docker中文社区

基本都是在配置文件中添加:export PATH=$PATH:xxx

  • 用户级别环境变量定义文件:~/.bashrc~/.profile(部分系统为:~/.bash_profile
  • 系统级别环境变量定义文件:/etc/bashrc/etc/profile (部分系统为:/etc/bash_profile)、/etc/environment

job和进程

博客园 jean zhang

job相对于shell,进程相对于操作系统

shell执行的命令就是job,一个job就是一个进程,但是该进程可能有多个子进程,子进程不属于job且不能被当前shell看见,所以一个job对应一个进程组

job分为后台作业和前台作业(占用输入输出)

作业的操作:

  • ctl+z:暂停前台(终端窗口中)正在运行job
  • ctl+c:终止前台(终端窗口中)正在运行job
  • jobs: 显示当前所有的job,包括正在运行的和暂停的
  • fg+N : 让暂停的job在前台运行,N=jobs 命令查询的的job号
  • bg+N : 让暂停的job在后台运行,N=jobs 命令查询的的job号
  • kill %N : 终止job(与kill 进程不一样,这里有%),N=jobs 命令查询的的job号

僵尸进程和孤儿进程

CSDN 张维鹏

僵尸进程:fork后,子进程结束,父进程没有调用wait或waitpid来获取子进程状态信息,子进程的进程描述符仍保存在系统中,会占用进程号

孤儿进程:fork后,父进程结束,子进程成为孤儿进程且被init进程收养,孤儿进程没有什么危害

解决僵尸进程的方法

  • 父进程wait或waitpipd
  • 子进程结束时给父进程发送信号,父进程信号处理函数中调用wait或waitpid

/proc/stat

linux里一切皆文件

这个目录的文件存储进程信息,top就是通过读取该文件夹的文件来显示进程信息

将已经运行的程序添加到nohup

将进程添加到nohup可以在退出当前shell后继续运行

stackoverflow 如何将已经运行的进程置于 nohup 下?

有两种方式

  • bash下:disown -h [job-spec],需要提前使用ctrl+z将进程放到后台
  • unix下:nohup -p pid

查看进程的信号处理

1
cat /proc/pid/status

linux namespace

Unweaving the Web

命名空间和cgroups是软件容器化(想想 Docker)新趋势所依赖的两种主要内核技术

  • cgroups是一种计量和限制机制,它们控制您可以使用多少系统资源(CPU、内存)
  • 另一方面,命名空间限制了可以看到的内容

Linux 内核提供了 6 种命名空间:pid、net、mnt、uts、ipc和user。本文只关注网络命名空间。

网络命名空间

网络命名空间为命名空间内的所有进程提供全新的网络堆栈。这包括网络接口、路由表和iptables 规则。

创建命名空间:ip netns add ns1,创建命名空间后,ip 命令会在/var/run/netns下为其添加一个绑定挂载点。

列出系统中可用的命名空间:ls /var/run/netnsip netns

命名空间中执行命令:ip netns exec ns1 [command]

命名空间中的接口可以启动和关闭:ip link set dev lo upip link set dev lo down

通过veth 对将命名空间与根命名空间进行通信。创建一个veth 对。接口v-eth1将保留在根网络命名空间内,而其对等节点v-peer1将移至ns1命名空间

1
2
ip link add v-eth1 type veth peer name v-peer1
ip link set v-peer1 netns ns1

为两个接口设置 IPv4 地址并启动它们

1
2
3
4
5
6
7
8
# Setup IP address of v-eth1.
ip addr add 10.200.1.1/24 dev v-eth1
ip link set v-eth1 up

# Setup IP address of v-peer1.
ip netns exec ns1 ip addr add 10.200.1.2/24 dev v-peer1
ip netns exec ns1 ip link set v-peer1 up
ip netns exec ns1 ip link set lo up

修改路由表,将根命名空间作为默认路由

1
ip netns exec ns1 ip route add default via 10.200.1.1

主机启动ipv4转发并修改防火墙iptable

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# Share internet access between host and NS.

# Enable IP-forwarding.
echo 1 > /proc/sys/net/ipv4/ip_forward

# Flush forward rules, policy DROP by default.
iptables -P FORWARD DROP
iptables -F FORWARD

# Flush nat rules.
iptables -t nat -F

# Enable masquerading of 10.200.1.0.
iptables -t nat -A POSTROUTING -s 10.200.1.0/255.255.255.0 -o eth0 -j MASQUERADE

# Allow forwarding between eth0 and v-eth1.
iptables -A FORWARD -i eth0 -o v-eth1 -j ACCEPT
iptables -A FORWARD -o eth0 -i v-eth1 -j ACCEPT

之后命名空间ns1就可以ping通外网了

结论

网络命名空间以及 Linux 内核提供的其他容器化技术是一种轻量级的资源隔离机制。附加到网络名称空间的进程可以看到自己的网络堆栈,同时不会干扰系统网络堆栈的其余部分。

系统log

/var/log/messages,系统调用的log

查看系统信息

1
cat /proc/version

启动程序和自动恢复程序

启动程序有两种方式

  1. 新建子shell来非阻塞启动程序:sh xxx.sh
  2. 直接调用阻塞式启动程序:./xxx.sh

将一个程序写到一个死循环shell里面,由于是阻塞式调用,程序死后会自动重启

1
2
3
4
While true
Do
  ./xxx
Done

查看进程信息

1
ls -l /proc/pid

-l查看软连接的dst

CPU负载load和CPU利用率usage

知乎 浪里说

这两个值都是定期采样(sample)统计得到的。在某个时间点,cpu状态是离散的,要么是忙,要么是闲,不可能是32%程度的忙,所以只能是一个时间段内,采样统计得到这样的值。

  • cpu usage:采样点(忙) / 总采样点(忙+闲) * 100%
  • cpu load:(runnable process等待队列长度 + 正在被执行的process)在采样时间内的平均值
 |