TLS

TLS全称:Transport Layer Security——安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性。

该协议由两层组成:TLS记录协议(TLS Record)和TLS握手协议(TLS Handshake)。较低的层为TLS记录协议,位于某个可靠的传输协议(如TCP)上面。

TLS的最大优势在于:TLS是独立于应用协议。高层协议可以透明地分布在TLS协议上面。

Ubuntu 20.04 Ngnix TLS

TLSv1.0

TLSv1.0是于1996年发布的老版本协议,使用的是弱加密算法和系统。比如SHA-1和MD5,这些算法和系统十分脆弱,存在重大安全漏洞,容易受到降级攻击的严重影响。

建议生产环境使用TLS的高版本协议,避免遭受漏洞攻击等,如TLSv1.2。

问题

在ubuntu 20.04下配置nginx ssl时不支持tls1.0/1.1,是因为ubuntu 20.04/openssl 1.1.1默认禁用了不安全的tls协议,可以修改openssl配置文件开启。

启用TLSv1.0


# openssl.cnf首部添加
sed -i '1i openssl_conf = default_conf' /etc/ssl/openssl.cnf

# openssl.cnf尾部添加
cat >> /etc/ssl/openssl.cnf << EOF
[default_conf]
ssl_conf = ssl_sect
 
[ssl_sect]
system_default = system_default_sect
 
[system_default_sect]
MinProtocol = TLSv1
CipherString = DEFAULT:@SECLEVEL=1
EOF

# 使用openssl测试是否支持tls1.0和1.1
openssl s_client -connect www.haiyun.me:443 -tls1_1
openssl s_client -connect www.haiyun.me:443 -tls1

# 重启nginx
service nginx restart

# 如果还没有生效,检查nginx的ssl_protocols和ssl_ciphers配置
ssl_protocols	TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers	ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers	on;

Linux I2C Tools

本文基于RockPi 4A Debian系统介绍i2c设备的调试工具i2c-tools。

i2c-tools的相关命令常用于linux系统读写i2c设备寄存器的在线调试。

安装命令:


apt-get update
apt-get install i2c-tools

linux版本代码下载路径:


https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/

一、i2cdetect

1、命令


root@vxworks:/# i2cdetect
Error: No i2c-bus specified!
Usage: i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]
       i2cdetect -F I2CBUS
       i2cdetect -l
  I2CBUS is an integer or an I2C bus name
  If provided, FIRST and LAST limit the probing range.

2、用法



## 列出i2c总线
root@vxworks:/# i2cdetect -l
i2c-0   i2c             rk3x-i2c                                I2C adapter
i2c-1   i2c             rk3x-i2c                                I2C adapter
i2c-9   i2c             DesignWare HDMI                         I2C adapter
## 列出某个i2c总线上的i2c设备
root@vxworks:/# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: UU UU -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@vxworks:/# 

RockPi 4A原理图中,I2C0总线挂载I2C设备地址如下:

Linux I2C Tools

二、i2cdump

1、命令


root@vxworks:~# i2cdump
Error: No i2c-bus specified!
Usage: i2cdump [-f] [-y] [-r first-last] I2CBUS ADDRESS [MODE [BANK [BANKREG]]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x03 - 0x77)
  MODE is one of:
    b (byte, default)
    w (word)
    W (word on even register addresses)
    s (SMBus block)
    i (I2C block)
    c (consecutive byte)
    Append p for SMBus PEC

2、用法


## 显示I2C 0号总线上0x1b设备的寄存器值。MODE为byte,可省略。
root@vxworks:~# i2cdump -f -y 0 0x1b b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 12 50 08 21 01 13 01 00 00 00 00 01 01 00 00 00    ?P?!???....??...
10: 80 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ??..............
20: 01 17 00 6f ff 00 00 00 10 00 ff 0f ff 02 19 0f    ??.o....?..?.???
30: 00 00 19 07 00 00 02 03 00 00 09 00 00 00 00 0a    ..??..??..?....?
40: 00 0c 00 0c 00 07 00 01 00 0c 00 00 00 5f 00 03    .?.?.?.?.?..._.?
50: 06 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ??..............
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: 00 cf 03 00 28 00 0c 1c 80 19 00 34 12 00 71 00    .??.(.????.4?.q.
80: 10 50 1f ac 00 40 10 01 40 00 08 00 09 09 00 00    ?P??.@??@.?.??..
90: 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    U...............
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................

三、i2cget

1、命令


root@vxworks:~# i2cget
Usage: i2cget [-f] [-y] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x03 - 0x77)
  MODE is one of:
    b (read byte data, default)
    w (read word data)
    c (write byte/read byte)
    Append p for SMBus PEC

2、用法



## 显示I2C 0号总线上0x1b设备0x0和0x1寄存器地址,按字节读取
root@vxworks:~# i2cget -f -y 0 0x1b 0x0
0x12
root@vxworks:~# i2cget -f -y 0 0x1b 0x1
0x50
## 按字读取
root@vxworks:~# i2cget -f -y 0 0x1b 0x0 w
0x5012

四、i2cset

1、命令


root@vxworks:~# i2cset
Usage: i2cset [-f] [-y] [-m MASK] [-r] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x03 - 0x77)
  MODE is one of:
    c (byte, no value)
    b (byte data, default)
    w (word data)
    i (I2C block data)
    s (SMBus block data)
    Append p for SMBus PEC

2、用法


root@vxworks:/sys/rk8xx# i2cget -f -y 0 0x1b 0x10
0x80
root@vxworks:/sys/rk8xx# i2cset -f -y 0 0x1b 0x10 0x0
root@vxworks:/sys/rk8xx# i2cget -f -y 0 0x1b 0x10
0x00

注:RK808-D 是PMIC芯片,如果没有芯片手册,建议慎重使用i2cset命令设置RK808-D寄存器的值。

五、i2ctransfer

i2c-tools-4.0及以后版本添加了i2ctransfer命令。

i2cget和i2cset可以读写的i2c设备的寄存器地址小于0xff,即寄存器是8位地址。

如果i2c设备寄存器是16位地址,可使用i2ctransfer命令,该命令同样可用在寄存器地址是8位的设备。

1、命令


"Usage: i2ctransfer [-f] [-y] [-v] [-V] [-a] I2CBUS DESC [DATA] [DESC [DATA]]...\n"
"  I2CBUS is an integer or an I2C bus name\n"
"  DESC describes the transfer in the form: {r|w}LENGTH[@address]\n"
"    1) read/write-flag 2) LENGTH (range 0-65535, or '?')\n"
"    3) I2C address (use last one if omitted)\n"
"  DATA are LENGTH bytes for a write message. They can be shortened by a suffix:\n"
"    = (keep value constant until LENGTH)\n"
"    + (increase value by 1 until LENGTH)\n"
"    - (decrease value by 1 until LENGTH)\n"
"    p (use pseudo random generator until LENGTH with value as seed)\n\n"
"Example (bus 0, read 8 byte at offset 0x64 from EEPROM at 0x50):\n"
"  # i2ctransfer 0 w1@0x50 0x64 r8\n"
"Example (same EEPROM, at offset 0x42 write 0xff 0xfe ... 0xf0):\n"
"  # i2ctransfer 0 w17@0x50 0x42 0xff-\n");

2、用法


## 从i2c 4号总线0x38设备的0x3a01寄存器开始读16个字节的数据,w2:表示寄存器0x3a01的长度为2个字节
i2ctransfer -y -f 4 w2@0x38 0x3a 0x01 r16
## 向i2c 4号总线0x38设备的0x3a01寄存器写0x10,w3:表示寄存器0x3a01和写入值0x10的长度为3字节
i2ctransfer -y -f 4 w3@0x38 0x3a 0x01 0x10

准备

首先在gcp创建实例

1. 设置当前用户的新密码


$ sudo passwd ${whoami} // 下面以 user 代替 ${whoami}
# 输入新密码

2. 设置下 root 的新密码


$ sudo passwd root
# 输入新密码

3. 在本地生成私钥和公钥


$ cd ~/.ssh
$ ssh-****** -f myKey
或者
$ ssh-keygen -t rsa -f ~/.ssh/my-ssh-key -C [USERNAME]

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): ( 按enter键即可)
Enter same passphrase again: ( 按enter键即可)
Your identification has been saved in myKey.
Your public key has been saved in myKey.pub.
The key fingerprint is:
SHA256:EW7ow1aaaaaf8mNvk 该 Email 地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。
The key's randomart image is:
+---[RSA 2048]----+
|=.o+= o .        |
|o+.o+= + .       |
|o.o..oo *        |
|..o+ +o+ o       |
|.oo+  =+S o      |
| o. * o. = o     |
| ..o =  . =      |
|. o.. .    E     |
| . .o.           |
+----[SHA256]-----+
# 此时会生成 公钥 myKey.pub 和 私钥 myKey

1.sudo!!:忘记用 sudo 运行命令?您无需重新编写整个命令,只需键入 sudo!!最后一个命令将使用sudo运行。

2.python -m SimpleHTTPServer:通过端口 8000 为当前工作目录创建一个简单的网页。

3.mtr命令是 ping 和traceroute命令的组合。

4.Ctrl+x+e:这个组合键会立即启动,终端中的编辑器。

5.nl:输出行编号的文本文件的内容。

6.shuf:把输入行按随机顺序输出到标准输出。

7.ss:输出套接字统计信息。

8.last:想知道上次登录用户的历史记录?这个命令来拯救这里。

9.curl json.im:显示机器的外部 IP 地址。

10.tree:以树状方式递归打印文件和文件夹。

一、定时器的实现原理

定时器的实现,依赖的是CPU时钟中断;时钟中断的精度,决定了定时器精度的极限。那么,一个时钟中断源如何实现多个定时器呢?

对于内核,简单来说就是用特定的数据结构管理众多的定时器,在时钟中断处理中判断哪些定时器超时,然后执行超时处理动作。而用户空间程序不直接感知CPU时钟中断,通过感知内核的信号、IO事件、调度,间接依赖时钟中断。

用软件来实现动态定时器常用数据结构有:时间轮、最小堆和红黑树。下面就是一些知名的实现:

  • Linux内核的 Hierarchy 时间轮算法
  • Asio C++ Library最小堆定时器实现
  • nginx 使用红黑树结构管理定时器事件

下面,介绍一下Linux内核定时器的一些相关代码。

内核启动注册时钟中断: