nfs 卸载技巧

Linux file system nfs 卸载技巧 由于 nfs 的网络通信,一般来说,df或者ls等影响到磁盘的命令卡住,甚至卡死是因为 nfs 连接出现了问题。一般来说,要么服务端重启服务或者客户端重启服务就好。退而求其次的方法是umount nfs盘,但往往没办法直接搞定。一般会直接卡住或者提示 device busy。 那么我们就去伪造一个对端,我们可以搞个虚拟机,或者本机网络接口分配一个服务端端的ip,可以ping通。 ifconfig eth0:fakenfs 192.0.2.55 netmask 255.255.255.255 #其中 192.0.2.55 是 nfs 服务端的ip ip link set eth0 up 此时我们的机器需要开启nfs服务,Ubuntu的话就 apt install ntfs-kernel-server。 然后再尝试强制卸载 nfs 云盘:umount -fl /your/path。 之后需要把本机配置的 ip 给清掉: ifconfig eth0 del 192.0.2.55 ip link set eth0 down 参考 mount - 强制卸载NFS挂载目录 Linux强制卸载设备 nfs挂载无法卸载

nfs 的基本使用

Linux [[file system]] nfs 的基本使用 nfs 的架构 nfs 可以理解为“网盘”,即本地可以挂载远端的盘,不考虑物理上的io瓶颈,上下行带宽多大则io速度多快。典型的C/S的架构,运行过程中对CPU有依赖。 nfs 安装 # 服务端 sudo apt install nfs-kernel-server # 客户端 sudo apt install nfs-common nfs 使用 简单来说,分三步: 服务端创建文件系统 nfs配置文件中确定文件系统以及访问限制 客户端连接指定的nfs /etc/exports NFS服务端对分享目录的配置文件 /etc/exports.d NFS服务端对分享目录配置文件的扩展目录,值得注意的是:只有扩展名为.exports的文件会被NFS读取并应用,其他文件都会被忽略。 /var/lib/nfs/etab NFS对外分享目录的主配置文件,它是由exportfs命令维护的,其信息与NFS内核中的配置信息保持同步。注:请不要手动编辑该文件。 /var/lib/nfs/rmtab 客户端访问的目录列表,由NFS系统维护,请不要手动编辑。 root@localhost:~# cat /etc/exports # /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) # /mnt/nfs 192.168.0.0/24(rw,sync,no_subtree_check) $ sudo mount -t nfs host:/$dir $ddir 参考 如何在Ubuntu 18.04上设置NFS挂载 Linux 下的 NFS 系统简介

redhat 系使用 scl 工具临时使用高级开发工具

Linux [[RedHat]] redhat 系使用 scl 工具临时使用高级开发工具 最近在做一次编译任务中,出现了 cc 指令错误,显示未找到 a.c 文件,猜测可能因为 gcc 版本问题。检测到可以在 Ubuntu 18.04 正常编译使用的 gcc 版本是 7.5,而基于 Centos7 的 Aliyun Linux 2.1903 却还是 4.8 版本。先升级 gcc 版本再测试编译问题。 在 redhat 系中升级 gcc 有两种方案,一种是下载源码进行编译,另外一种是借助 scl 工具。前者不推荐,一是因为编译速度慢,二是因为编译可能出现各种问题需要手动处理。后者 SCL 软件集(Software Collections)是为了给 RHEL/CentOS 用户提供一种以方便、安全地安装和使用应用程序和运行时环境的多个(而且可能是更新的)版本的方式,同时避免把系统搞乱。 普通 RHEL/Centos 使用 scl # 安装 scl 源: $ yum install centos-release-SCL scl-utils-build # 查看从 scl 中安装的包的列表: $ scl –list # 列出 scl 源有哪些包可以用: $ yum list all --enablerepo='centos-sclo-rh' # 安装高版本的 gcc、gcc-c++ yum install devtoolset-7-gcc devtoolset-7-gcc-c++ # devtoolset-3: gcc 4.9 # devtoolset-4: gcc 5 # devtoolset-6: gcc 6 # devtoolset-7: gcc 7 # devtoolset-8: gcc 8 # 测试下是否成功 $ scl enable devtoolset-7 'gcc --version' gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Aliyun Linux 2.1903 使用 scl # 先安装scl-utils $ yum install -y scl-utils # 打开YUM仓库支持 $ yum install -y alinux-release-experimentals # 从YUM源安装您需要的软件包,以下示例命令同时安装了SCL插件方式支持的所有开发工具包 $ yum install -y devtoolset-7-gcc devtoolset-7-gdb devtoolset-7-binutils devtoolset-7-make # 运行相关的SCL软件 $ scl enable devtoolset-7 'gcc --version' gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 使用高版本的开发工具 使用绝对路径 添加可执行文件路径到 PATH 环境变量 使用官方推荐的加载命令:scl enable devtoolset-x bash, x为要启用的版本 执行安装软件自带的脚本: source /opt/rh/devtoolset-x/enable,x为要启用的版本 推荐后两种方案。 ...

redis 安装使用

database Redis redis 安装使用 # 安装并编译 wget https://download.redis.io/releases/redis-6.0.9.tar.gz -O /tmp/redis-6.0.9.tar.gz cd /tmp tar xzf redis-6.0.9.tar.gz cd redis-6.0.9 make # 创建环境 BASE_PATH=/opt/redis-single-point mkdir -p $BASE_PATH mkdir -p $BASE_PATH/bin mkdir -p $BASE_PATH/conf mkdir -p $BASE_PATH/data mkdir -p $BASE_PATH/log/ cp /tmp/redis-6.0.9/src/redis-server /tmp/redis-6.0.9/src/redis-cli /tmp/redis-6.0.9/src/redis-benchmark $BASE_PATH/bin # 配置 redis.conf vi $BASE_PATH/conf/redis.conf bind 127.0.0.1 protected-mode no port 4399 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised no pidfile /var/run/redis_6379.pid loglevel notice logfile "/opt/redis-single-point/log/redis.log" databases 16 always-show-logo yes save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb rdb-del-sync-files no dir /opt/redis-single-point/data/ replica-serve-stale-data yes replica-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-diskless-load disabled repl-disable-tcp-nodelay no replica-priority 100 acllog-max-len 128 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no replica-lazy-flush no lazyfree-lazy-user-del no oom-score-adj no oom-score-adj-values 0 200 800 appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble yes lua-time-limit 5000 cluster-enabled no cluster-node-timeout 15000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 stream-node-max-bytes 4096 stream-node-max-entries 100 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit replica 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 dynamic-hz yes aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes jemalloc-bg-thread yes # 配置 redis 服务 vi /lib/systemd/system/redis.service [Unit] Description=redis service port 6379 [Service] User=Development Group=Development Type=forking ExecStart=/opt/redis-single-point/bin/redis-server /opt/lotus/redis-single-point/conf/redis.conf Restart=on-success [Install] WantedBy=multi-user.target # 启动服务并检测 systemctl daemon-reload systemctl start redis ps -ef|grep redis echo 'export PATH=$PATH:/opt/redis-single-point/bin' >> /etc/profile source /etc/profile redis-cli -h 127.0.0.1 -p 6379 redis>

redis 集群搭建

database Redis redis 集群搭建 高可用方案 一般常用的有两种高可用方案: redis 哨兵 redis 集群 在 redis 早期版本中,只能使用哨兵模式,但这种模式下,需要多一个守护对资源进行监控,并且在 master 断掉的时候切换过程比较慢。 在 5.0 之后,一般推荐使用 redis 集群方案实现高可用。 操作环境 使用了三台机器,以三主三从的方案进行部署,在一台机器上部署一主一从,其中 8001 是主节点,8002 是从节点。 redis01: 192.168.0.2 redis02: 192.168.0.3 redis03: 192.168.0.4 虽然这三台机器都是 Ubuntu Server 18.04,但是内核版本都不相同,所以都是单独执行的编译过程。 决定不使用系统空间,而使用 /opt/ 的上 TB 空间。 所有 redis 相关的数据都在 /opt/redis/ 下面: bin/ 二进制程序 conf/ 配置文件 data/ 运行产生文件 log/ 日志文件 redis-6.0.7/ 源代码 部署过程 主要是配置文件的处理: 主节点配置以下参数: daemonize yes port 8001 dir /opt/redis/data/master cluster-enabled yes cluster-config-file /opt/redis/conf/nodes-8001.conf cluster-node-timeout 15000 #bind 127.0.0.1 protected-mode no appendonly yes requirepass abcdefg masterauth abcdefg logfile /opt/redis/log/redis-master-8081.log 从节点配置以下参数: ...

sed 匹配内容的前一行和后一行添加内容

Linux sed 匹配内容的前一行和后一行添加内容 在某行的前一行或后一行添加内容 具休操作如下: # 匹配行前加 sed -i '/allow 361way.com/iallow www.361way.com' the.conf.file # 匹配行前后 sed -i '/allow 361way.com/aallow www.361way.com' the.conf.file 而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛。代码就变成了: sed -i '/2222222222/a\3333333333' test.txt sed -i '/2222222222/i\3333333333' test.txt a 是 append,行后加;i 是 insert,行前加。 配合find查找的内容处理,如下: find . -name server.xml|xargs sed -i '/directory/i <!--' find . -name server.xml|xargs sed -i '/pattern="%h/a -->' 在某行(指具体行号)前或后加一行内容 sed -i 'N;4addpdf' a.txt sed -i 'N;4ieepdf' a.txt 这里指定的行号是第四行 。 删除指定行的上一行或下一行 # 删除指定文件的上一行 sed -i -e :a -e '$!N;s/.*n(.*directory)/1/;ta' -e 'P;D' server.xml # 删除指定文件的下一行 sed -i '/pattern="%/{n;d}' server.xml 转载说明 sed 匹配内容的前一行和后一行 添加内容

ssh 服务的原理

Linux SSH ssh 服务的原理 读者大可以直接就自己的问题去 Google 解决方案,但是不理解这个过程,那么每次遇到都要去 search,自己只是‘工具人’,遇到了问题也不知道如何是好。这时候需要看下原理,有原理做基础,才能理解做配置的每一步的意义。 两种安全验证 SSH(即 Secure Shell),是一项创建在应用层和传输层基础上的安全协议,为计算机 Shell 提供安全的传输和使用环境。 所以为了安全,SSH 提供了两种级别的安全认证,基于密码的安全认证和基于密钥的安全认证。 基于密码的安全认证 基于密码的安全认证,登录的时候需要提供账号和密码;远程主机将自己的公钥分发给登录客户端,客户端访问主机使用该公钥加密;远程主机使用自己的私钥解密数据。 登录的流程如下: 远程主机收到用户登录请求,将自己的公钥发给用户 用户通过远程主机公钥的指纹确认主机的真实性,然后使用远程主机公钥将登录密码加密后,发送回远程主机 远程主机使用自己的私钥解码登录密码,验证密码正确后,允许用户登录 这种就是最常用的直接登录,需要输入密码,而传入过程中,明文密码会被加密,所以很安全。 基于密钥文件的安全认证 基于密钥的安全认证,客户端将将公钥上传到服务器。登录的时候,客户端向服务器发送登录请求;服务器收到请求后,向用户发送一段随机字符串;用户用自己的私钥加密后,再发送回服务器;服务器使用事先存储的公钥进行解密,如果解密成功,证明用户可信,允许登录。 这种方式,在登录服务器的过程中,不需要上传密码,增加了安全性。 known_hosts 文件 当第一次登陆远程主机时,不管是用密码还是密钥,都会有个提示: $ ssh user@host The authenticity of host 'host (***.***.***.***)' can't be established. RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d. Are you sure you want to continue connecting (yes/no)? 这段话提示用户无法确认远程主机的真实性,只知道 RSA 公钥的指纹,询问用户是否继续。 我们使用 ssh-keygen 工具可以生成 SSH 密钥对,其中公钥的长度可以很长,对用户来说不方便直接对比验证,因此对其进行了 MD5 计算,生成了一个128的指纹,这样再进行比较就比较容易了。 那么这里就要求我们事先知道远程主机的公钥指纹,才可以确认主机的真实性。 用户确认主机的真实性,输入 yes 继续连接: Warning: Permanently added 'host,***.***.***.***' (RSA) to the list of known hosts. 然后输入密码: ...

ssh 服务的配置

Linux SSH ssh 服务的配置 有了 ssh 服务的介绍以及原理之后,我们就可以做到 可以用很短的指令就登陆,并且不用输密码,最重要的就是要学会修改 ssh_config 文件。我们先介绍配置文件的一些可配置项,再针对免密登陆做操作。 配置文件 ssh程序可以从以下途径获取配置参数: 命令行选项 用户配置文件 (~/.ssh/config) 系统配置文件 (/etc/ssh/ssh_config) 配置文件可分为多个配置区段,每个配置区段使用 Host 来区分。我们可以在命令行中输入不同的host 来加载不同的配置段。 对每一个配置项来说,首次获取的参数值将被采用,因此通用的设置应该放到文件的后面,特定host相关的配置项应放到文件的前面。 常用配置项 下面介绍一些常用的SSH配置项: Host Host 配置项标识了一个配置区段。 ssh 配置项参数值可以使用通配符:* 代表0~n个非空白字符,? 代表一个非空白字符,! 表示例外通配。 我们可以在系统配置文件中看到一个匹配所有 host 的默认配置区段: $ cat /etc/ssh/ssh_config | grep '^Host' Host * 这里有一些默认配置项,我们可以在用户配置文件中覆盖这些默认配置。 GlobalKnownHostsFile 指定一个或多个全局认证主机缓存文件,用来缓存通过认证的远程主机的密钥,多个文件用空格分隔。默认缓存文件为:/etc/ssh/ssh_known_hosts, /etc/ssh/ssh_known_hosts2. HostName 指定远程主机名,可以直接使用数字IP地址。如果主机名中包含 %h ,则实际使用时会被命令行中的主机名替换。 IdentityFile 指定密钥认证使用的私钥文件路径。默认为 ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 或 ~/.ssh/id_rsa 中的一个。文件名称可以使用以下转义符: '%d' 本地用户目录 '%u' 本地用户名称 '%l' 本地主机名 '%h' 远程主机名 '%r' 远程用户名 可以指定多个密钥文件,在连接的过程中会依次尝试这些密钥文件。 Port 指定远程主机端口号,默认为 22 。 ...

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 能做什么。 ...