iic/i2c通讯数据格式

以下是来源于一款iic产品,但其iic标准格式代表了大部分的iic产品数据格式。

所以如果你拿到一款iic产品,但是没有现成的驱动,想自己写驱动,就可以参考这个格式来实现,或者验证已有实现。

主要关注:address,启停标识,读写时序的对齐:
iic 数据格式

如何修改已经创建docker的运行参数

update 命令

eg:

docker container update --restart=always 容器名字

修改container的配置文件

  • 先停止容器
  • 停止docker: systemctl stop docker
  • 修改配置文件,配置文件路径为/var/lib/docker/containers/容器ID,对应的配置文件为hostconfig.json和config.v2.json
  • 启动docker: systemctl start docker
  • 启动容器

注意,重启docker很重要,否则修改完的配置文件,重启容器后会被还原

Failed to get D-Bus connection: Operation not permitted

在docker中启用systemd时,过程中出现:
Failed to get D-Bus connection: Operation not permitted

原因

systemd维护系统服务程序,它需要特权去会访问Linux内核。而容器并不是一个完整的操作系统,只有一个文件系统,而且默认启动只是普通用户这样的权限访问Linux内核,也就是没有特权,所以自然就用不了!

解决

添加授权:
docker run -d -name centos7 --privileged=true centos:7 /usr/sbin/init

增加授权会提高风险,需要仔细评估具体的运行脚本和命令,避免对宿主造成安全风险

为什么有必要在docker中使用systemd

为什么要在docker中使用systemd

根据Walsh所说,容器中没有systemd最大的问题是它“退回到了使用初始化脚本之前。”每个镜像作者都在容器内创建自己的疯狂的启动脚本,而不是使用软件包作者精心制作的启动脚本。他演示了在具有systemd的容器内,服务初始化是何尝的简单,创建一个运行Apache httpd服务器的容器,其Dockerfile只有三行:

FROM fedora
RUN yum -y install httpd; yum clean all; systemctl enable httpd;
CMD [ "/sbin/init" ]

参考:
1. https://lwn.net/Articles/676831/ http://dockone.io/article/1093 (翻译)

APP和dev后缀域名强制https的问题

因为想要做多个域名cname到同一页面,所以不能用https,只能用http,但是发现在chrome和火狐中怎么也不成功,只有ie可以。反复验证和排查网站设置都无果,同样chrome访问别的http域名也是可以的,并不是所有的都不行,但是我的就是不行。后面通过搜索大概发现了问题的线索:https://stackoverflow.com/questions/50258202/how-does-google-force-https-on-their-app-tld

因为我弄的正好是app后缀的域名,所以无论如何尝试,chrome和火狐都会自己跳转到https,而我没有部署证书,导致无法正常显示。

所以这个问题基本是无望了,只能取消多域名cname同一个页面的想法了,为每一个域名实现独立的https页面了。

vsftpd虚拟用户配置

网上有很多文章,如果你简单照着配置,大概率是不行的,因为每个人的软件和系统环境都有所差异,所以本文不是告诉你一步一步怎么配置,而是把过程中的要点记录下来,便于排查问题。

虚拟用户归属的系统用户

我们也称为虚拟用户的宿主用户,这里我们一般建议直接使用ftp账户:

ftp:x:104:107:ftp daemon,,,:/srv/ftp:/bin/false

guest_enable=YES
guest_username=ftp

虚拟用户chroot目录

一般我们使用虚拟用户,每个虚拟用户都配置成拥有自己专有的目录和权限。目录配置如下:

user_config_dir=/etc/vsftpd/vusers
user_sub_token=$USER
local_root=/home/virtual/$USER

虚拟用户权限

经过实际验证,主要是配置anon_umask来控制文件权限,通过anon_xxx来配置动作行为。

pam配置

网上的文章大部分是基于db4工具db_load 下的pam_userdb.so 的pam配置,并没全场景通过,有待后继进一步确认。在实际的验证中,测试实际通过使用的的是pwdfile库:

auth required pam_pwdfile.so pwdfile /etc/vsftpd/vsftpd.passwd
account required pam_permit.so

这个库的对应账号数据不是通过db_load,而是openssl工具:

openssl passwd -1 "$VSFTPD_USER_PASS"

文件夹及目录权限

经过配置,如果你发现,所有的账户还是不能达到预期的权限控制和可达性,请结合 anon_umask 来确认用户的chroot 目录及所操作文件的实际权限

SELinux

需要进行相应的ftp权限配置,或者关闭

参考配置

vsftpd.conf

###
# Config file for vsftpd
###

# Daemon options
listen=YES
listen_ipv6=NO
session_support=NO

# Log In Options and Access Controls
anonymous_enable=YES
anon_root=/home/virtual/share 
ftpd_banner=Wellcom to iTransCloud ftp server!
local_enable=YES

# pam
pam_service_name=vsftpd

# Local User Options
chmod_enable=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
guest_enable=YES
guest_username=ftp
local_umask=0022
anon_umask=0222
user_config_dir=/etc/vsftpd/vusers
user_sub_token=$USER
local_root=/home/virtual/$USER

# ascii 
ascii_upload_enable=YES
ascii_download_enable=YES

# Directory Options
dirlist_enable=YES
dirmessage_enable=NO
force_dot_files=NO
hide_ids=NO
ls_recurse_enable=NO
use_localtime=YES

# File Transfer Options
download_enable=YES
chown_uploads=NO
write_enable=YES

# Logging Options
dual_log_enable=NO
log_ftp_protocol=NO
syslog_enable=NO
vsftpd_log_file=/var/log/vsftpd/vsftpd.log
xferlog_enable=YES
xferlog_std_format=NO

# Network Options
connect_from_port_20=YES
listen_port=21
pasv_enable=YES
pasv_address=changeme
pasv_min_port=changeme
pasv_max_port=changeme
pasv_promiscuous=NO
port_enable=YES

# Connection Options
tcp_wrappers=YES
max_clients=10
max_per_ip=5
max_login_fails=3

# Tweak
seccomp_sandbox=NO
allow_writeable_chroot=YES

虚拟用户配置文件

这里给出的是一个读写全权限的配置,其他组合自行修改

anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_upload_enable=YES
anon_umask=0022

匿名用户

在支持虚拟用户的支持,是可以实现支持匿名访问的,实现的要点也是,关注配置和被访问文件夹以及被访问文件的权限设置,设置正确,就可以支持了。

echo命令行和网页方式下base64编码不一致问题

发现的问题

同样的测试内容:chabctimes
在centos7下面:

# echo "chabctimes"|base64
Y2hhYmN0aW1lcwo=

在线测试平台 https://tool.oschina.net/encrypt?type=3 测试如下:

Y2hhYmN0aW1lcw==

根据第三方的验证,下面的内容是通过验证可以正常用的,上面的不行。从对比看,下面跟上面的结果比较,末尾倒数第2个字符一个是=一个是o

分析

一阵g搜索,再结合只有尾部一个字符差异,而且所有内容都是倒数第二个差异,所以初步猜测可能是尾部回车换行的差异导致。
经过不同内容的验证,基本确认以上的猜测:在linux环境下echo命令行的模式,比在线的方式多一个尾部的回车换行。
再就回车换行问题进一步进行确认,因为是1个字符也会多回车换行,还不是经典的76字符回车换行问题,所以怀疑是echo的问题,经搜索,确认是echo的问题。

解决

在echo中增加参数-n 去掉结尾回车换行,验证OK:

echo -n "chabctimes"|base64

centos下privoxy安装及使用

下载

###下载安装文件
wget http://www.privoxy.org/sf-download-mirror/Sources/3.0.26%20%28stable%29/privoxy-3.0.26-stable-src.tar.gz
tar -zxvf privoxy-3.0.26-stable-src.tar.gz
cd privoxy-3.0.26-stable

privoxy-3.0.26-stable 是目前最新的稳定版,建议在下载前去 Privoxy 官网下载页 检查一下版本。

新建用户

Privoxy 强烈不建议使用 root 用户运行,所以我们使用 useradd privoxy 新建一个用户.

安装

autoheader && autoconf
./configure
make && make install

配置

```vi /usr/local/etc/privoxy/config```

找到以下两句,确保没有注释掉

listen-address 127.0.0.1:8118   # 8118 是默认端口,不用改,下面会用到
forward-socks5t / 127.0.0.1:0 . # 这里的端口写 shadowsocks 的本地端口(注意最后那个 . 不要漏了)

启动

privoxy --user privoxy /usr/local/etc/privoxy/config

开启系统代理

配置 /etc/profile

vi /etc/profile

添加下面两句:

export http_proxy=http://127.0.0.1:8118       #这里的端口和上面 privoxy 中的保持一致
export https_proxy=http://127.0.0.1:8118

运行以下:

source /etc/profile

测试生效

curl www.google.com

返回一大堆 HTML 则说明 shadowsocks 正常工作了。

CentOS 7 安装 shadowsocks libev 客户端

installation

download yum repo on Fedora Copr and put it inside /etc/yum.repos.d/. The release Epel is for RHEL and its derivatives.

Then, install shadowsocks-libev via dnf:

su -c 'dnf update'
su -c 'dnf install shadowsocks-libev'

config

shadowsocks-libev 默认读取位于 /etc/shadowsocks-libev/config.json 的配置文件,我们可以根据需要参考以下配置文件进行修改:

{
    "server": "example.zzz.buzz",
    "server_port": 10443,
    "local_port": 1080,
    "password": "zzz.buzz",
    "method": "aes-256-cfb",
    "mode": "tcp_and_udp",
    "timeout": 600
}

"server": 必填,填入要连接的 shadowsocks 服务器域名或 IP。

"server_port": 必填,填入服务器上 shadowsocks 所监听的端口。

"local_port": 必填,填入本地 shadowsocks 客户端 SOCKS5 代理要监听的端口。

"password": 必填,密码,需与 shadowsocks 服务器端配置一致。

"method": 必填,加密方法,需与 shadowsocks 服务器端配置一致。

"mode": 选填,默认 "tcp_only"。

shadowsocks 所要监听的协议,可填 "tcp_only", "udp_only" 和 "tcp_and_udp"。
填入 "tcp_and_udp" 相当于命令行上提供 -u 参数;填入 "udp_only" 相当于命令行上提供 -U 参数。

"timeout": 选填,不活动连接的保持时间。

默认 60 秒,设置较长时间有助于保持 HTTP 长连接等。设置时间过长则会导致不必要地占用过多 shadowsocks 服务器资源。

对于配置客户端,完成以上几项配置就足够了。

如果想要变更默认的配置文件,或者提供其他命令行参数,我们可以修改 /etc/sysconfig/shadowsocks-libev:

# Configuration file
CONFFILE="/etc/shadowsocks-libev/config.json"

# Extra command line arguments
DAEMON_ARGS="-u"

其中 CONFFILE 指定了 shadowsocks-libev 所读取的配置文件;DAEMON_ARGS 则指定了额外的命令行参数,此处的 "-u" 表示启用 UDP 协议。

需要注意的是,命令行参数 DAEMON_ARGS 比配置文件 CONFFILE 中指定的选项优先级要更高一些。

start

systemctl enable --now shadowsocks-libev-local