systemd

http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

systemctl

systemd的control cli

  1. systemctl enable nginx.service
  2. systemctl disable nginx.service
  3. systemctl start nginx.service
  4. systemctl restart nginx.service
  5. systemctl list-units --type=service # 查看所有服务

/proc/pid

  • linux以文件系统的访问方式提供了各个进程状态的访问
    1. readlink -e /proc/pid/cwd // 获取进程的cwd 等价于 lsof -p pid | grep cwd

建立服务

vim /usr/lib/systemd/system/nginx.service

  1. [Unit]
  2. Description=nginx - high performance web server
  3. After=network.target remote-fs.target nss-lookup.target
  4. [Service]
  5. Type=forking
  6. ExecStart= /www/server/nginx /sbin/nginx -c /www/server/nginx /conf/nginx.conf
  7. ExecReload= /www/server/nginx /sbin/nginx -s reload
  8. ExecStop= /www/server/nginx /sbin/nginx -s stop
  9. [Install]
  10. WantedBy=multi-user.target

Type
  • Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
  • Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes使得systemd在服务进程退出之后仍然认为服务处于激活状态
  • Type=notify:与 Type=simple相同,但约定服务会在就绪后向systemd发送一个信号。这一通知的实现由 libsystemd-daemon.so提供。
  • Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪

ssh

使用的协议为SSL/TLS,先使用非对称加密进行协商,之后使用对称加密进行数据的传输
使用上一步生成的shared key 以及非对称加密进行authentification
每一次链接的shared key都不一样,但是用于authentification的key是一样的
所以才可以免密登录,将客户端的pub_key写到服务端的authorized_keys中
~/.ssh/known_hosts 中记录的链接过的服务端的pub_key
~/.ssh/authorized_keys 中记录了无需密码验证的客户端的pub_key

  • 服务端:每次有客户端链接的时候会先查询authorized_keys中有无记录,如果有记录的话验证通过,不再需要密码输入以及互传pub_keys
  • 客户端:每次链接服务端的时候,会查询服务端的pub_key是否存在于known_hosts中,如果不存在,用户需要输入YES讲服务端的pub_key保存到known_hosts中
    命令
    ```bash /etc/init.d/sshd restart # 启动ssh服务端

debug

$(which sshd) -Ddp 10222

配置服务端

vim /etc/ssh/sshd_config

修改端口

Port 23

禁止Root用户ssh登录

PermitRootLogin no

客户端

ssh -f -o no -p 23 name@ip command -o no #可以自动将服务端的pub_key加入到known_host中,而无需输入yes -f #无需等待服务端的命令执行完毕,让其后台运行。 -p #指定端口,默认是22

执行命令

ssh adm@$host \ “if [ ! -d ~/.ssh ]; then ssh-keygen -t rsa -P ‘’; fi “

传输数据并执行命令

cat ~/.ssh/id_rsa.pub | ssh adm@$host \ “cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys”

  1. <a name="FYBes"></a>
  2. ##### SFTP
  3. 使用SSH进行文件的传输,交互式<br />
  4. <a name="6O6NT"></a>
  5. ##### SSH通道加密无加密的服务
  6. wait
  7. <a name="pTDzp"></a>
  8. # apt
  9. <a name="GsclK"></a>
  10. ##### 添加源后apt update报key认证的错
  11. - 需要手动向服务器申请认证
  12. ```bash
  13. apt install xxx // error
  14. # The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8
  15. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8
  16. apt install xxx // ok

screen

A terminal multiplexer.

  1. screen -S name // create a session
  2. -ls // list all sessions
  3. -r name // attach this session

nprsh

execute commands in multiple nodes in parallele

  1. mprsh -on node1..12 uptime

pscp

  1. pscp -h client_list /etc/password /etc/password

iftop

top for networks

  • B denotes bytes, are used in storage area
  • b denotes bits, are used in networking area
    • for example: we say 10G nc, it’s 10 000 Mbps, when converted to what we talk in storage area, it’s 10G/8 = 1.25GB/s
  • RX/TX denotes receive and transmit respectively.

ethtool

configure nic devices

  • wake on lan
  • speed
    • Note that the nic would be down when we changed the speed, we need to use ifup to bring it up. ```bash

      wol means wake on lan

      ethtool -s eno1 speed 1000 duplex full autoneg on wol g ethtool -p eno1 # make the physical nic blink

permanent

vim /etc/network/interfaces

post-up ethtool -s eno1 xxxxxx

or

ETHTOOL_OPTS=”speed 1000 duplex full autoneg on”

  1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/714716/1596369413098-5f947acc-3cdc-4c69-bedf-095a5a741e62.png#height=504&id=ZcPT8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1008&originWidth=1068&originalType=binary&ratio=1&size=165324&status=done&style=none&width=534)
  2. <a name="AAePj"></a>
  3. # Raid
  4. <a name="kFFyU"></a>
  5. ### RAID 0
  6. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/714716/1591927348974-f6daf4e7-be54-469d-b565-322f291f2de7.png#height=290&id=V2eHQ&margin=%5Bobject%20Object%5D&name=image.png&originHeight=290&originWidth=398&originalType=binary&ratio=1&size=74868&status=done&style=none&width=398)<br />数据分块在不同磁盘中<br />利用率100%<br />读写:N<br />冗余无
  7. <a name="1gAIZ"></a>
  8. # RAID 1
  9. 数据做镜像备份<br />利用率50%<br />读: 1 写: < 1<br />冗余:有,只要存在镜像盘就可重建
  10. <a name="0KGaO"></a>
  11. ### RAID 5
  12. 最少3块盘,可以加热备盘,这样<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/714716/1591927059222-0651247b-92f2-46e4-885f-83947d5b8432.png#height=238&id=lvqah&margin=%5Bobject%20Object%5D&name=image.png&originHeight=238&originWidth=367&originalType=binary&ratio=1&size=90256&status=done&style=none&width=367)<br />数据分块,存在奇偶校验,奇偶校验与数据存在不同的盘里,一块盘损坏,可以用其他盘奇偶校验重建<br />利用率: (N-1)/N<br />读: N -1 写: <1<br />冗余:只能损坏一块盘,多加N热备盘,则总共可以损失N个盘(坏后重建后再坏),注意重建必须要要有新的空盘(热备盘或者重新插入的健康盘),如果没有新盘的话,虽然数据没损失,但不存在冗余了。另外,可以强制将RAID重新分配,这样就可以不需要新盘了,但耗费时间且须停机。
  13. <a name="tjo1E"></a>
  14. ### RAID6
  15. RAID5相比新增另一奇偶校验块,可同时损坏两块盘
  16. <a name="oWrdE"></a>
  17. ### RAID10 1+0
  18. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/714716/1591927335266-1e39f2f5-d2eb-4699-9ea8-b1a7dd0b1127.png#height=402&id=IoZ8v&margin=%5Bobject%20Object%5D&name=image.png&originHeight=402&originWidth=380&originalType=binary&ratio=1&size=105827&status=done&style=none&width=380)<br />使用RAID0的分块,RAID1的镜像备份<br />磁盘利用率: 50%<br />读写: N/2<br />冗余:只要存在镜像盘就可重建
  19. <a name="wXzTt"></a>
  20. # 分布式存储系统
  21. hdfs是将多个节点组合在一起,而raid是在单机上实现的
  22. <a name="x0yno"></a>
  23. ## sar
  24. ```bash
  25. sar -q load avrage
  26. -u cpu
  27. -r history memory usage

Send messages to users

  1. wall "Message" // will send this message to all logged users
  2. // pts/15 is the tty opened by the user, can be feteched by ps aux
  3. write username pts/15 [Enter] messages [Ctrl + D]

SAN and NAS

  • san: 存储设备通过光纤通道Fibre Channel与客户机使用FCP协议传输SCSI协议进行通信,block level storage
    • 直接使用IO线路进行通信
  • nas: 通过以太网与客户机使用TCP/IP进行通信, file level storage

block level storage

可以通过SCSI(FCP)/iSCSI(TCP)/SRP(IB)/iSER(TCP, RDMA)协议与远端主机通信,远端主机再使用 SCSI协议与真正的硬盘通信,这使得客户机就好像在与真正的硬盘进行通信,可访问磁盘的各个扇区
如果要使用文件系统的话,每个客户机都需要有自己的(可以不一样)文件系统
比如某些数据库公司(oracle)的产品为了提高速率(减少中间层),会直接访问硬盘,而不是访问文件系统

file level storage

通过远程主机提供的客户端使用其文件系统,客户端driver/软件通过TCP/IP,IB,ROCE,iWrap等协议与远程主机的文件系统服务端通信
文件系统只安装在远端主机,远端主机内部也是通过SCSI或者其他协议访问本地/远端block level storage
每个客户机只需要安装文件系统提供的客户端driver并挂载该文件系统即可,并不包含真正的文件系统
与block level的区别是,除非使用了RDMA技术,否则,服务器存储设备的文件需要经过SCSI总线,PCIE总线,系统总线,再拷贝到内存中,之后再原路返回到网卡中,期中还需要cpu参与拆解包,而block level不需要cpu参与,网卡通过PCIE总线直接发送SCSI命令到SCSI总线,再到存储设备,获取数据后直接返回。
System Management - 图1

存储的层次

hard drive -> raid -> disk subsystem ——scsi——> filesystem —-local or remote—-> opearting system

File system

比如FAT32/ext4等文件系统
文件系统相比于block level的好处是由于文件都是有组织形式的,可以准确快速的prefetch file,提高读速率

Protocols

image.png

FCP

与FC线,交换机,路由,网卡共同工作的传输协议,上层通过安装驱动以封装SCSI和IP接口,使得计算机把通过FCP连接的设备当做是正常的SCSI设备或者以太网设备
FCP SAN中就是使用FCP协议传输的SCSI命令

iSCSI

通过驱动的形式,封装SCSI接口,让SCSI协议通过TCP/IP进行传输,但是封装iSCSI和解包TCP/IP协议会占用cpu资源,所以有的主板还有专门的的iSCSI HBA卡/TOE卡,可以专门处理iSCSI和TCP/IP之间的转换,减轻CPU负担,或者有的主板上
无盘系统可以使用该协议进行启动
(注:TOE网卡还能处理一些TCP/IP协议栈的拆解包,比如原本在内核处理的IP分片、TCP分段、重组、checksum校验)

iFCP

定义了FCP与TCP/IP的映射,常用于网关上连接FCP网络和IP网络

mFCP

使用的是UDP/IP传输协议

FCIP

一种隧道协议,使用TCP/IP传输FCP协议,用与使用以太网连接两个FCP网络

FCOE

Fibre Channel over ethernet
与iSCI类似,定义的是FCP与ethernet的mapping,将FCP帧包在以太网帧中,而FCP和以前一样一般用于传输SCSI命令
使得内部网,存储网和以太网整合在同一线路上
注意与FCIP和iSCSI的区别是,FCIP使用的是TCP协议包装,而FCOE直接使用以太网帧,减少了IP/TCP拆解包,与之相反的是由于不是IP/TCP包装,FCOE不能被路由,用于本地的LAN

IPoIB

ip over ib, 这也是为什么ib卡可以配置一个ipv4的地址,且可以使用ping进行ping通的原因

DMA

https://zhuanlan.zhihu.com/p/55142557
Direct memory access
允许计算机主板上的设备(DMA Engine)直接把数据移动到内存中,无需CPU参与

RDMA

即多个计算机之间可以通过网络直接访问其他计算机的内存,即直接在内存空间进行数据传输,该技术的实施就是一套相关的API,不同主机间通信还需要传输层协议进行传输

  • zero-copy 数据不会经过TCP/IP网络协议栈各层
  • kernel bypass 应用直接在用户态传输数据,无需内核态和用户态上下文切换
  • 无需CPU干预(比如拷贝buffer,复制等)
  • 与TCP/IP发送字节流不同,RDMA操作消息队列

支持该技术的传输协议

  • ifniniBand,物理连接层协议,需要专门的网卡和交换机
    • SRP 定义了SCSI与RDMA的mapping,可以使用RDMA传输协议传输SCSI命令
  • RDMA over Ethernet,UDP传输IB帧,需要网卡支持RoCE
  • RDMA over TCP,可以硬件支持(支持iWARP的网卡)或者软件支持
    • SDP or iWARP,封装了TCP/IP接口,内部调用RDMA OVER TCP技术,NFS/CIFS等使用TCP/IP的技术无需改动就可以享受到RMDA技术的优点
      • 可以硬件支持或者软件支持,但是软件支持并不能提高bandwith,只能减少接收双方的负载
    • iSER iSESI的拓展,使用TCP传输SCSI命令,且支持RDMA技术

infiniband

https://blog.csdn.net/swingwang/article/details/72887367
是一种传输协议
与TCP/IP一样,也是分层协议,但是传输层,网络层,链路层都通过网卡进行操作
传输层上有各种上层协议

  • SDP 允许传输TCP/IP
  • SRP 传输SCSI命令
  • iSER 存储协议

System Management - 图3

计算机设备

https://zhuanlan.zhihu.com/p/54029324

PCIE

System Management - 图4
新一代IO总线接口标准(旧称3GIO),也包含相应的协议
PCIE可以接显卡,网卡,SCSI卡等。。。

SATA

Serial ATA 用于存储设备的总线接口

SCSI

总线接口和协议,用于与外部存储设备进行通信
SCSI协议可以使用多种传输协议进行传输

SAS

Serial SCSI ,串行SCSI总线接口标准,兼容SATA接口设备

SDRAM

同步动态随机存取内存
System Management - 图5

SRAM

静态随机访问存储器,常作为CPU的高速缓存,现一般继承于CPU中

BIOS

存在于主板闪存中的程序

MBR

硬盘第一个扇区,称为主引导扇区,存储了分区表

UEFI

用于替代BIOS的软件,使用GPT取代MBR(但MBR区还在),存储了分区表的位置信息(而MBR模式下分区信息直接存在在MBR区)

查看存储

  1. # 查看文件系统以及挂载点
  2. file -Ls /dev/sda1
  3. df -T
  4. # 查看block level设备,以及各自的扇区,磁道等数量
  5. lsblk

Beegfs

System Management - 图6

Management server

  • 需要两个分区,一个mgmtd和meta,使用ext4系统,使用beegfs-setup-mgmtd和beegfs-setup-meta进行初始化这两目录
  • 开启beegfs-mgmtd和beegfs-meta服务

    Storage node

  • 存储为xfs系统,挂在后使用beegfs-setup-storage -p /beegfs_ost01 -s 1 -i 101 -m ibmds01 -f分别指示storage目录和manager节点,之后会自动寻找management节点

  • 开启beegfs-storage服务

    Client node

  • build客户端内核(如果使用以太网会自动build),开启beegfs-helperd和beegfs-client服务

所有节点都是都会自动寻找manage节点,然后client和storage server再与Metadata server进行通信

tune

https://www.beegfs.io/wiki/TuningAdvancedConfiguration

rstudio server docker

  1. docker run -d -p 8787:8787 -p 3838:3838 -e ROOT=TRUE -v /store:/store -e ADD=shiny rocker/rstudio
  2. # rocker/rstudio:4.0.0
  3. docker exec ID -it /bin/bash
  4. apt update && apt install -y rpcbind nis
  5. echo domain NIS_DOMAIN server NIS_SERVER_IP >> /etc/yp.conf
  6. vim /etct/nsswitch.conf # add nis to back of each line
  7. #
  8. # start.sh
  9. docker container start 426e41dc7d4e
  10. docker exec 426e41dc7d4e rpcbind
  11. docker exec 426e41dc7d4e ypbind
  12. crontab -e
  13. @reboot /root/start_rstudio_server_docker.sh