ssh-keygen 基本用法

Linux SSH ssh-keygen 基本用法 ssh 公钥认证是 ssh 认证的方式之一。通过公钥认证可实现 ssh 免密码登陆,git 的 ssh 方式也是通过公钥进行认证的。 在用户目录的 home 目录下,有一个 .ssh 的目录,和当前用户 ssh 配置认证相关的文件,几乎都在这个目录下。 ssh-keygen 可用来生成 ssh 公钥认证所需的公钥和私钥文件。 使用 ssh-keygen 时,请先进入到 ~/.ssh 目录,不存在的话,请先创建。并且保证 ~/.ssh 以及所有父目录的权限不能大于 711。 生成的文件名和文件位置 使用 ssh-kengen 会在 ~/.ssh/ 目录下生成两个文件,不指定文件名和密钥类型的时候,默认生成的两个文件是: id_rsa id_rsa.pub 第一个是私钥文件,第二个是公钥文件。 生成 ssh key 的时候,可以通过 -f 选项指定生成文件的文件名,如下: [huqiu@101 .ssh]$ ssh-keygen -f test -C "test key" ~~文件名 ~~~~ 备注 如果没有指定文件名,会询问你输入文件名: [huqiu@101 .ssh]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/huqiu/.ssh/id_rsa): /home/huqiu/.ssh/test 你可以输入你想要的文件名,这里我们输入test。 ...

SSHPASS 的使用

Linux SSH SSHPASS 的使用 如果是常规使用 ssh 登陆到服务器上,要么是通过密码,要么是通过配置公密钥的适配来做到免密登陆。现在有个新的场景,你想通过 ssh 登陆到某台节点并执行一条指令,但不想因为这么简单的事而将公钥上传过去,同时也不想通过 expect 或者 EOF 的方式来模拟操作(我们假定在一个脚本中),这时候就需要 sshpass 的帮助了。 sshpass 是一个简单、轻量级的命令行工具,通过它我们能够向命令提示符本身提供密码(非交互式密码验证),它直接使用 TTY 访问,以确保密码是用户键盘输入的。 sshpass 在专门的 tty 中运行 ssh,以误导 ssh 相信它是从用户接收到的密码。 重要:使用 sshpass 是不安全的,但新版本的 sshpass 做得足够好了。 安装 RedHat/CentOS 安装 $ yum install sshpass $ dnf install sshpass [Fedora 22 及以上版本] Debian/Ubuntu 和它的衍生版 $ sudo apt-get install sshpass MacOSX 安装 截止 2019.8.13 日,最新版是 1.06,未来可能更新,下面的指令,Cellar位置可能不确定。 $ brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb $ cd /usr/local/bin $ ln -s sshpass ../Cellar/sshpass/1.06/bin/sshpass 源码安装 $ wget http://sourceforge.net/projects/sshpass/files/latest/download -O sshpass.tar.gz $ tar -xvf sshpass.tar.gz $ cd sshpass-1.06 $ ./configure $ sudo make install 使用 sshpass 与 ssh 一起使用。先通过 -h 参数看下 sshpass 能做什么。 ...

StorCLI 的使用

Linux [[RAID]] StorCLI 的使用 目前 LSI RAID 卡使用的配置工作主要有:Megaraid Storage Manager(MSM,图形环境)、MegaCLI(字符界面)、StorCLI(字符界面)。其中 StorCLI 整合了 LSI 和原来 3ware 的产品支持,相对 MegaCLI 命令更加简洁,并且兼容 MegaCLI 的命令,估计不久的将来两者会统一。 StorCLI 在命令行的直接输出更直观,适合直接观看,不适合解析,好在有个特性,在结尾加上 J 可以获得 json 格式输出。 安装 登录BROADCOM网站上RAID卡的页面。 在 “DOWNLOADS” 页签中单击 “Management Software and Tools”。 打开管理软件和工具列表。 下载最新版本的 “MegaRAID Storcli” 工具。 解压后得到适用于不同操作系统的工具包。 rpm -ivh StorCLIxxx.rpm 使用 rpm 命令安装完成后,64 位系统命令的绝对路径为:/opt/MegaRAID/storcli/storcli64,32 位系统命令的绝对路径为:/opt/MegaRAID/storcli/storcli。 在测试的机器 xxx.x 上和 xxx.y 上都已经有了该工具,且版本为 Ver 1.23.02 Mar 28, 2017。 测试过程及基础说明 ip raid卡型号 芯片组 StorCLI能否使用 megacli能否使用 xx.xx.xxx.x PERC H730P Adapter SAS 3108 不能 可以 xx.xx.xxx.y AVAGO MR9361-8i UNKNOWN 可以 可以 有上述表格内容,可以看出,StorCLI 虽然是后起之秀,但在某些卡上,megacli 却能够输出结果。(通过对 Dell PowerEdge RAID Controller H730P的查看,简单的猜测 dell 定制的卡,无法被 storcli 管理)。在该文章中提到「Dell的产品 用PERC Cli」。即How to use the PowerEdge RAID Controller (PERC) Command Line Interface (CLI) utility to manage your RAID controller。 ...

storcli 的进阶使用

Linux RAID storcli 的进阶使用 基础信息 查看磁盘管理基础信息 $ storcli64 show Status Code = 0 Status = Success Description = None Number of Controllers = 1 Host Name = amd7302asus Operating System = Linux4.15.0-55-generic System Overview : =============== ------------------------------------------------------------------------------------- Ctl Model Ports PDs DGs DNOpt VDs VNOpt BBU sPR DS EHS ASOs Hlth ------------------------------------------------------------------------------------- 0 LSIMegaRAIDSAS9270CV-8i 8 24 1 0 1 0 Msng On 1&2 Y 4 Opt ------------------------------------------------------------------------------------- 从上述结果分析,有一块型号为 LSIMegaRAIDSAS9270CV-8i 的 RAID 卡。它是 8 通道的,挂载了 24 块物理盘,有 1 个磁盘组(DG),有 1 个虚拟磁盘(VD),没有电池。 ...

supervisord 与 worker 的应用

Linux Supervisor supervisord 与 worker 的应用 首先,目前使用 nohup 的方式启动,比较难托管,日志也是个问题,好处是方便灵活,同时只能通过 node_exporter 的 text-collector 或者 process_exporter 的方式进行进程监控。 换个思路,使用 supervisord 对 worker 进程进行托管,所有的环境变量都可以配置在 conf 文件中,版本变更,只需要更新二进制文件即可,启动过程直接 stop 或者 restart,同时可以添加预检测脚本。node_exporter 有一个 flag 即可检测 supervisourd 服务。 以 127.0.0.1 作为测试机器,已经测通。可以实现任务启动,日志重定输出,自动重启,进程监控。 首先给出 worker.conf 的配置。 # /etc/supervisor/conf.d/worker.conf [program:lotus-worker] command=/opt/cache/lotus-worker run --address=127.0.0.1:6969 directory=/opt/cache autorstart=true autorestart=true user=Development stopsignal=QUIT redirect_stderr = true stdout_logfile_backups = 10 stdout_capture_maxbytes = 100MB stdout_logfile=/opt/cache/log/%(program_name)s_log.log stderr_logfile_backups = 10 stderr_capture_maxbytes = 100MB stderr_logfile=/opt/cache/log/%(program_name)s_error.log environment = PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games", NLS_LANG=".AL32UTF8", IP=127.0.0.1, LOTUS_PATH=/opt/cache/repo, LOTUS_STORAGE_PATH=/opt/cache/lotusstorage, WORKER_PATH=/opt/cache/worker-path, FIL_PROOFS_PARAMETER_CACHE=/opt/lotus/v28-proof/, TMPDIR=/opt/cache, FIL_PROOFS_MAXIMIZE_CACHING=1, FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1, FIL_PROOFS_PARENT_CACHE=/opt/cache/filecoin-parent/, MIN_AVAILABLE_MEMORY=640, SDR_WAIT_TIME=90, IPFS_GATEWAY="https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/", FIL_PROOFS_USE_GPU_TREE_BUILDER=1, RUST_LOG=Debug, STORAGE_API_INFO=xxxyy:/ip4/10.0.0.1/tcp/10002/http 这里面会提到IP指定,所以需要依赖于 ansible 做模版,使用 ansible_facts[‘default_ipv4’][‘address’] 作为key。 ...

systemd service 配置 ulimit 限制

Linux systemd service 配置 ulimit 限制 在 bash 中,有个 ulimit 命令,提供了对 shell 及该 shell 启动的进程的可用资源控制。主要包括打开文件描述符数量、用户的最大进程数量、coredump 文件的大小等。 在 CentOS 5/6 等版本中,资源限制的配置可以在 /etc/security/limits.conf 设置,针对 root/user 等各个用户或者 * 代表所有用户来设置。 当然,/etc/security/limits.d/ 中可以配置,系统是先加载 limits.conf 然后按照英文字母顺序加载 limits.d 目录下的配置文件,后加载配置覆盖之前的配置。 一个配置示例如下: soft nofile 100000 * hard nofile 100000 * soft nproc 100000 * hard nproc 100000 * soft core 100000 * hard core 100000 不过,在 CentOS 7 or RHEL 7 的系统中,使用 Systemd 替代了之前的 SysV,因此 /etc/security/limits.conf 文件的配置作用域缩小了一些。limits.conf 这里的配置,只适用于通过 PAM 认证登录用户的资源限制,它对 systemd 的 service 的资源限制不生效。登录用户的限制,与上面讲的一样,通过 /etc/security/limits.conf 和 limits.d 来配置即可。 对于systemd service的资源限制,如何配置呢? ...

systemd 的使用

Linux systemd 的使用 systemd 是一个庞大的系统,在这篇里,专注于 systemd 在 service,target 以及日志系统的使用。 service service 的书写 配置文件放在 /usr/lib/systemd/system/ 或者 /lib/systemd/system/ 中,以 .service 结尾。Systemd 默认从目录 /etc/systemd/system/ 读取配置文件,但是,里面存放的大部分文件都是符号链接。 # 配置文件大概格式 [Unit] Description=ATD daemon [Service] Type=forking ExecStart=/usr/bin/atd [Install] WantedBy=multi-user.target 配置文件是由 ini 格式书写的,按照几个大的区块来写,Unit 是该模块基础信息,Service 是 service 型 Unit 专属,Install 附加信息。 [Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。 - Description:简短描述 - Documentation:文档地址 - Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败 - Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败 - BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行 - Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动 - After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动 - Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行 - Condition...:当前 Unit 运行必须满足的条件,否则不会运行 - Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败 [Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。 - WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中。一般挂载为 multi-user.target。 - RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中 - Alias:当前 Unit 可用于启动的别名 - Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit [Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。 - Type:定义启动时的进程行为。它有以下几种值。 - Type=simple:默认值,执行ExecStart指定的命令,启动主进程 - Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出 - Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行 - Type=dbus:当前服务通过D-Bus启动 - Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行 - Type=idle:若有其他任务执行完毕,当前服务才会运行 - ExecStart:启动当前服务的命令 - ExecStartPre:启动当前服务之前执行的命令 - ExecStartPost:启动当前服务之后执行的命令 - ExecReload:重启当前服务时执行的命令 - ExecStop:停止当前服务时执行的命令 - ExecStopPost:停止当其服务之后执行的命令 - RestartSec:自动重启当前服务间隔的秒数 - Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog - TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数 - Environment:指定环境变量 service 的管理 # 查看系统所有安装的服务项 systemctl list-unit-files --type=service # 查看系统所有运行的服务项 systemctl list-units --type=service # 查看系统所有开机自启动的服务项 systemctl list-unit-files --type=service | grep enabled # 查看指定服务项状态 systemctl status <服务项名称> # 查看服务项的依赖关系 systemctl list-dependencies <服务项名称> # 查看出错的服务 systemctl list-units --type=service --state=failed # 清除服务项的错误状态 systemctl reset-failed <服务项名称> # 查看系统启动耗时 systemd-analyze # 查看各项服务启动耗时 systemd-analyze blame | grep .service # 启动服务 systemctl start <服务项名称> # 停止服务 systemctl stop <服务项名称> # 重启服务 systemctl restart <服务项名称> # 重新读取配置文件 systemctl reload <服务项名称> # 使服务开机自启动 ## 需要配置 install systemctl enable <服务项名称> # 使服务不要开机自启动 systemctl disable <服务项名称> # 禁用服务 systemctl mask <服务项名称> # 启用服务 systemctl unmask <服务项名称> # 重新读取所有服务项 systemctl daemon-reload # 服务状态 enabled:已建立启动链接 disabled:没建立启动链接 static:该配置文件没有[Install]部分(无法执行),只能作为其他配置文件的依赖 masked:该配置文件被禁止建立启动链接 target Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target 这个概念类似于"状态点",启动某个 Target 就好比启动到某种状态。 ...

timeit模块的使用

Python Python Module timeit模块的使用 timeit 主要是为了测试代码运行速度。 它主要有两个方法,即 timeit 和 repeat。 测试一段代码的运行时间,在 python 里面有个很简单的方法,就是使用 timeit 模块,使用起来超级方便 下面简单介绍一个 timeit 模块中的函数。 主要就是这两个函数: timeit(stmt='pass', setup='pass', timer=<defaulttimer>, number=1000000) 返回: 返回执行stmt这段代码number遍所用的时间,单位为秒,float型 参数: stmt:要执行的那段代码 setup:执行代码的准备工作,不计入时间,一般是import之类的 timer:这个在win32下是time.clock(),linux下是time.time(),默认的,不用管 number:要执行stmt多少遍 repeat(stmt='pass', setup='pass', timer=<defaulttimer>, repeat=3, number=1000000) 这个函数比 timeit 函数多了一个 repeat 参数而已,表示重复执行 timeit 这个过程多少遍,返回一个列表,表示执行每遍的时间。 当然,为了方便,python 还用了一个 Timer 类,Timer 类里面的函数跟上面介绍的两个函数是一样一样的 class timeit.Timer(stmt='pass', setup='pass',timer=<timer function>) Timer.timeit(number=1000000) Timer.repeat(repeat=3,number=1000000) 看懂了吧,一样的,使用的时候哪种方便用哪种。 就相当于 timeit(stmt='pass', setup='pass', timer=<defaulttimer>, number=1000000) = Timer(stmt='pass', setup='pass', timer=<timerfunction>).timeit(number=1000000) repeat(stmt='pass', setup='pass', timer=<defaulttimer>, repeat=3, number=1000000) = Timer(stmt='pass', setup='pass', timer=<timerfunction>).repeat(repeat=3, number=1000000)

Ubuntu 18.04升级内核以及内存性能研究

Linux Ubuntu Ubuntu 18.04升级内核以及内存性能研究 自从用上了 AMD 7002 CPU之后,服务器上出现了 EDAC amd64: Error: F0 not found, device 0x1460 (broken BIOS?)。 通过 suse 的论坛支持,确定这是因为 “AMD ROMA” 这一代太高级了,Linux Kernel 没跟上,所以会出现这个问题。Ubuntu 18.04 的内核版本是 4.15.0-55-generic;Ubuntu 20.04 的内核版本是 5.4.0-33-generic;官网提供的稳定版内核版本是 5.7.2-050702-generic。 那么就要评估要不要升级内核了?是直接升级操作系统还是仅升级内核? 要不要升级内核? 这需要判断这个错误对 性能 和 稳定性 的影响程度。 先整理出两台机器: mtest01:7542, 64G 2933 DDR4 * 8,内核 4.15.0-55-generic mtest02: 7542, 64G 2933 DDR4 * 8,内核 5.7.2-050702-generic 重启后,通过 dmesg 检测,发现 mtest01 出现 EDAC amd64: Error: F0 not found, device 0x1460 (broken BIOS?) 问题,而 mtest02 没出现这个问题。 ...

Ubuntu 18.4 通用配置脚本

Linux Ubuntu Ubuntu 18.4 通用配置脚本 配置 ip 先决条件:网口名为 eno1 且为联通状态,若不是,请手动修改。 #! /bin/bash # config_ip.sh # sh config_ip.sh eno1 192.168.1.xxx 192.168.1.1 mv /etc/netplan /etc/netplan.bk mkdir -p /etc/netplan/ touch /etc/netplan/01-netcfg.yaml cat > /etc/netplan/01-netcfg.yaml<<EOF # This file describes the network interfaces available on your system # For more information, see netplan(5). network: version: 2 renderer: networkd ethernets: $1: addresses: [$2/24] gateway4: $3 nameservers: addresses: - "$3" EOF cat /etc/netplan/01-netcfg.yaml echo 'Finish!' netplan apply if [ $? -eq 0] then echo 'Apply Success!' else echo 'Apply Failure!' fi 配置 DNS #! /bin/bash # config_dns.sh # sh config_dns.sh 192.168.1.x mv /etc/systemd/resolved.conf /etc/systemd/resolved.conf.bk cat > /etc/systemd/resolved.conf <<EOF [Resolve] DNS=$1 #FallbackDNS= #Domains= #LLMNR=no #MulticastDNS=no #DNSSEC=no #Cache=yes #DNSStubListener=yes EOF 配置源 #! /bin/bash # config_source.sh # sh config_source.sh mv /etc/apt/sources.list /etc/apt/sources.list.bk cat > /etc/apt/sources.list <<EOF # tsinghua deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse deb https://packages.grafana.com/oss/deb stable main deb-src https://packages.grafana.com/oss/deb stable main deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse # aliyun deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse # ubuntu deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ trusty-proposed main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse EOF apt-get update 配置集群免密登陆 生成默认密钥对 ssh-keygen -t rsa -C "default_key@default.namespace" ls ~/.ssh/ 获取认证文件 ssh-copy-id -i ~/.ssh/id_rsa xxx@xxx 通过生成的密钥通过 ssh-copy-id 指定一台机器,那么那台机器的 ~/.ssh/authorized_keys 就会更新,录入一条新的数据。 ...