Ubuntu 配置 ip 地址

Linux Ubuntu Ubuntu 配置 ip 地址 之前的经历告诉我,Linux 通过读取配置文件加载 ip 相关的配置,这让问题变得简单。在 Redhat 系中,通过修改 /etc/sysconfig/network-scripts/ifcfg-* 等文件,可以针对网卡级别直接修改配置,而 Debian 系实现的方案并不一致。 众所周知,Ubuntu 分为 Server 版和 Desktop 版,后者提供更优秀的可视化配置;同时 Ubuntu 在 17.04 引入了 netplan 配置,这改变了网络配置的方式。 Ubuntu Desktop 18.10 Desktop 网络配置 这里对桌面版不再说明细节,图文解释见 How to configure static IP address on Ubuntu 18.10 Cosmic Cuttlefish Linux。 Ubuntu 17.10 之后的网络配置 临时配置 ip 地址 通过 ip 这个命令可以临时配置 ip 地址。重启后消失。 # 设置 ip 地址 $ sudo ip addr add 192.168.1.21/24 dev eno1 # 设置通道开闭(如果在 ssh 登陆情况下关闭,那么就只能去...) $ ip link set dev eno0 up $ ip link set dev eno0 up # 查看网卡绑定地址信息 $ ip address show dev eno1 # 设置网关 $ sudo ip route add default via 192.168.1.1 # 查看网关信息 $ ip route show 动态 ip 地址分配(DHCP) 修改 netplan 相关配置文件即可。 ...

vimrc文件配置

Linux VIM 【转载】vimrc文件配置的全文收录(史上最全,附带中文解释) vi 与 vim 的不同 vi 类似于 windows 的记事本,比较适合编辑普通文本,但是用于编写脚本代码就不太合适了,缺少高亮显示代码、自动缩进等重要功能;而 vim 类似于 windows 下的高级编辑器,为了提高开发效率,需要使用 vim 而不是 vi。 因此,首先做如下调整,以便只使用 vim 作为开发脚本的功能工具: [root@dabiaoge ~]# echo 'alias vi=vim' >> /etc/profile [root@dabiaoge ~]# tail -1 /etc/profile alias vi=vim [root@dabiaoge ~]# source /etc/profile 经过上述调整后,当用 vi 命令时,会自动被 vim 替代。 配置 vim 的配置文件及其重要参数介绍 全局路径:/etc/vimrc 用户个人路径:$HOME/.vimrc 建议:放在用户个人路径 $HOME/.vimrc 下。 .vimrc 文件的配置(几乎涵盖了所有) "~/.vimrc "vim config file "date 2018-12-26 "Created by bert "blog:https://blog.51cto.com/zpf666 """"""""""""""""""""""""""""""""""" """=>全局配置<=""" """"""""""""""""""""""""""""""""""" "关闭vi兼容模式" set nocompatible "设置历史记录步数" set history=1000 "开启相关插件" "侦测文件类型" filetype on "载入文件类型插件" filetype plugin on "为特定文件类型载入相关缩进文件" filetype indent on "当文件在外部被修改时,自动更新该文件" set autoread "激活鼠标的使用" set mouse=a set selection=exclusive set selectmode=mouse,key "保存全局变量" set viminfo+=! "带有如下符号的单词不要被换行分割" set iskeyword+=_,$,@,%,#,- "通过使用: commands命令,告诉我们文件的哪一行被改变过" set report=0 "被分割的窗口间显示空白,便于阅读" set fillchars=vert:\ ,stl:\ ,stlnc:\ """"""""""""""""""""""""""""""""" """=>字体和颜色<=""" """"""""""""""""""""""""""""""""" "自动开启语法高亮" syntax enable "设置字体" "set guifont=dejaVu\ Sans\ MONO\ 10 set guifont=Courier_New:h10:cANSI "设置颜色" "colorscheme desert "高亮显示当前行" set cursorline hi cursorline guibg=#00ff00 hi CursorColumn guibg=#00ff00 "高亮显示普通txt文件(需要txt.vim脚本)" au BufRead,BufNewFile * setfiletype txt """"""""""""""""""""""""""""""" """=>代码折叠功能<=""" """"""""""""""""""""""""""""""" "激活折叠功能" set foldenable "set nofen(这个是关闭折叠功能)" "设置按照语法方式折叠(可简写set fdm=XX)" "有6种折叠方法: "manual 手工定义折叠" "indent 更多的缩进表示更高级别的折叠" "expr 用表达式来定义折叠" "syntax 用语法高亮来定义折叠" "diff 对没有更改的文本进行折叠" "marker 对文中的标志进行折叠" set foldmethod=manual "set fdl=0(这个是不选用任何折叠方法)" "设置折叠区域的宽度" "如果不为0,则在屏幕左侧显示一个折叠标识列 "分别用“-”和“+”来表示打开和关闭的折叠 set foldcolumn=0 "设置折叠层数为3" setlocal foldlevel=3 "设置为自动关闭折叠" set foldclose=all "用空格键来代替zo和zc快捷键实现开关折叠" "zo O-pen a fold (打开折叠) "zc C-lose a fold (关闭折叠) "zf F-old creation (创建折叠) "nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR> """"""""""""""""""""""""""""""""""" """=>文字处理<=""" """"""""""""""""""""""""""""""""""" "使用空格来替换Tab" set expandtab "设置所有的Tab和缩进为4个空格" set tabstop=4 "设定<<和>>命令移动时的宽度为4" set shiftwidth=4 "使得按退格键时可以一次删除4个空格" set softtabstop=4 set smarttab "缩进,自动缩进(继承前一行的缩进)" "set autoindent 命令打开自动缩进,是下面配置的缩写 "可使用autoindent命令的简写,即“:set ai”和“:set noai” "还可以使用“:set ai sw=4”在一个命令中打开缩进并设置缩进级别 set ai set cindent "智能缩进" set si "自动换行” set wrap "设置软宽度" set sw=4 "行内替换" set gdefault """""""""""""""""""""""""""""""""" """=>Vim 界面<=""" """""""""""""""""""""""""""""""""" "增强模式中的命令行自动完成操作" set wildmenu "显示标尺" set ruler "设置命令行的高度" set cmdheight=1 "显示行数" set nu "不要图形按钮" set go= "在执行宏命令时,不进行显示重绘;在宏命令执行完成后,一次性重绘,以便提高性能" set lz "使回格键(backspace)正常处理indent, eol, start等" set backspace=eol,start,indent "允许空格键和光标键跨越行边界" set whichwrap+=<,>,h,l "设置魔术" set magic "关闭遇到错误时的声音提示" "关闭错误信息响铃" set noerrorbells "关闭使用可视响铃代替呼叫" set novisualbell "高亮显示匹配的括号([{和}])" set showmatch "匹配括号高亮的时间(单位是十分之一秒)" set mat=2 "光标移动到buffer的顶部和底部时保持3行距离" set scrolloff=3 "搜索逐字符高亮" set hlsearch set incsearch "搜索时不区分大小写" "还可以使用简写(“:set ic”和“:set noic”)" set ignorecase "用浅色高亮显示当前行" autocmd InsertLeave * se nocul autocmd InsertEnter * se cul "输入的命令显示出来,看的清楚" set showcmd """""""""""""""""""""""""""""""""""" """=>编码设置<=""" """""""""""""""""""""""""""""""""""" "设置编码" set encoding=utf-8 set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 "设置文件编码" set fileencodings=utf-8 "设置终端编码" set termencoding=utf-8 "设置语言编码" set langmenu=zh_CN.UTF-8 set helplang=cn """"""""""""""""""""""""""""" """=>其他设置<=""" """"""""""""""""""""""""""""" "开启新行时使用智能自动缩进" set smartindent set cin set showmatch "在处理未保存或只读文件的时候,弹出确认" set confirm "隐藏工具栏" set guioptions-=T "隐藏菜单栏" set guioptions-=m "置空错误铃声的终端代码" set vb t_vb= "显示状态栏(默认值为1,表示无法显示状态栏)" set laststatus=2 "状态行显示的内容" set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} "粘贴不换行问题的解决方法" set pastetoggle=<F9> "设置背景颜色" set background=dark "文件类型自动检测,代码智能补全" set completeopt=longest,preview,menu "共享剪切板" set clipboard+=unnamed "从不备份" set nobackup set noswapfile "自动保存" set autowrite "显示中文帮助" if version >= 603 set helplang=cn set encoding=utf-8 endif "设置高亮相关项" highlight Search ctermbg=black ctermfg=white guifg=white guibg=black """""""""""""""""""""""""""""""" """=>在shell脚本开头自动增加解释器以及作者等版权信息<=""" """""""""""""""""""""""""""""""" "新建.py,.cc,.sh,.java文件,自动插入文件头" autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()" "定义函数SetTitle,自动插入文件头" func SetTitle() if expand ("%:e") == 'sh' call setline(1, "#!/bin/bash") call setline(2, "#Author:bert") call setline(3, "#Blog:https://blog.51cto.com/zpf666") call setline(4, "#Time:".strftime("%F %T")) call setline(5, "#Name:".expand("%")) call setline(6, "#Version:V1.0") call setline(7, "#Description:This is a production script.") endif endfunc 转载说明 读者朋友可以直接完全复制粘贴拿去使用,只需要修改代码的开头和末尾部分的版权信息就可以使用 ...

windows7 下安装 utunbu 的几件头疼事

[[Windows 7]] [[Ubuntu]] [[Linux]] windows7 下安装 utunbu 的几件头疼事 一、系统及硬件说明 Windows版本:Windows7旗舰版 Linux版本:ubuntukylin-16.10-desktop-amd64 我的笔记本上有两块硬盘,其中一块是 1000GB 机械硬盘,分为五个区,另一块是固态 120GB,用作装系统。 大致的分区情况如下: 二、安装双系统前的准备 我的想法是,将 sda5 中的空间分出来 50G 用于安装 ubuntu,中间的什么压缩卷,转移数据就不赘述了,分好的空间就开始做 U 盘 Linux 系统盘,使用的软件是软碟通,然后等待刻录完成,开机驱动选择U盘启动,然后就开始了安装之旅,噩梦刚刚开始。 三、安装过程 一路确定下去,直到分区的时候,选择自定义分区,推荐 /boot 设置在最前面,然后是 swap 分区,/ 分区,/home 分区,具体分多少看个人喜好,然后就是等待。过了一会儿安装好了,重启。 四、设置开机引导 推荐在 Windows 下进行开机引导,我使用的是 easybcd,添加新条目的时候发现不对劲,按照网上的教程,这时候 /boot 分区前面应该有 Linux 字样,但是我这样安装之后并没有 Linux 字样,但是死马当活马医,还是把 /boot 分区作为引导项,然后重启。 重启之后,有两个登录选项,选择 linux 不能进入 ubuntu,而是进入 grub 引导,难道是我安装的时候分区错误吗,然后我重新安装了一次,仍然在 sda5 上安装了几次,但都是没出现过 Linux 字样。 五、思考 为什么我按照网上的教程多次实践也查了很多原因,看了《Linux鸟哥的私房菜》第三版里 p105 4.4.2 旧主机有两块以上硬盘多重引导该怎么办。开机流程是这样的,BIOS 启动,然后看下用户设定的第一启动盘是什么硬件,然后把权利交给该硬件(前面用U盘启动就是改了这个顺序)。我这个情况,就是给了 sdb 里的 mbr,但是之前用 easybcd 做的引导应该就是把 /boot 传输给 sdb 里的 mbr,让用户开机的时候可以选择,那么为什么进不去 Linux 呢。 ...

WTF,一款个人终端仪表板

Linux WTF,一款个人终端仪表板 主要使用方法,看下面两个链接就好了。 WTF - the terminal dashboard 开始使用 WTF 吧,一款终端仪表板 目前个人使用,还是遇到了一点坑。 坑一:配置文件 wtfutil 指令可以通过 -c/--config 指定特定的配置文件加载,但是实际在自己的机器上(macOS High Sierra)上无论怎么指定,都会指向 ~/.config/wtf/config.yml,如果将该文件删除,那么就会生成一份默认的。对此我的解决方案是,直接修改 ~/.config/wtf/config.yml,玩坏了,就重新生成默认配置。 坑二:部分模块设定 boarder:true,会导致左侧一列字符被吃掉 通过 CMDRUNNER 模块设置 istats all 会出现左侧一列字符消失,设置 boarder:false,问题解决,但缺少了 title 和边界区分 设置 DOCKER 模块,问题如上所述 由于官方目前提供的很多模块也是借助于一些接口的,例如:GitHub,GitLab,TRAVISCI 等,这些模块就没做测试,也暂时没用上。 坑三:DIGITAL CLOCK 模块显示错误 DIGITAL CLOCK 模块在我这边的显示效果,可以理解为第 3-5 个像素集体向左移动 1 像素,无论如何设置 height 和 width。 我想做的:增加一个课程表板块 我的配置 下面是我个人的配置,在 MacBook Pro 15‘ 2015 中,iTerm 完整屏幕显示效果还可以。(需要主动配置 git 仓库位置以及 markdown 文件位置)。 # 终端参数 ➜ wtf echo $COLUMNS 204 ➜ wtf echo $LINES 51 # ~/.config/wtf/config.yml wtf: colors: border: focusable: darkslateblue focused: orange normal: gray grid: columns: [40, 40, 40, 40, 40] rows: [13, 13, 13, 5, 5] refreshInterval: 1 mods: clocks: colors: rows: even: "lightblue" odd: "lightgreen" enabled: true locations: Shanghai: "Asia/Shanghai" Tokyo: "Asia/Tokyo" Toronto: "America/Toronto" New York: "America/New York" London: "Europe/London" Moscow: "Europe/Moscow" Hong Kong: "Asia/Hong Kong" Taipei: "Asia/Taipei" position: top: 0 left: 0 height: 1 width: 2 refreshInterval: 15 timeFormat: "15:04:05 -0700 MST * 2006 January 2 * Monday" dateFormat: "" sort: "chronological" title: "Clocks" type: "clocks" ipinfo: border: true colors: name: "lightblue" value: "white" enabled: true position: top: 1 left: 0 height: 1 width: 1 refreshInterval: 150 power: enabled: true position: top: 1 left: 1 height: 1 width: 1 refreshInterval: 15 title: "⚡️" nbascore: enabled: true position: top: 2 left: 2 height: 1 width: 2 refreshInterval: 600 uptime: args: [""] cmd: "uptime" enabled: true position: top: 3 left: 2 height: 1 width: 2 refreshInterval: 30 type: cmdrunner security: enabled: true position: top: 2 left: 1 height: 1 width: 1 refreshInterval: 3600 resourceusage: enabled: true position: top: 2 left: 0 height: 1 width: 1 refreshInterval: 1 todo: checkedIcon: "X" colors: checked: gray highlight: fore: "black" back: "orange" enabled: true filename: "todo.yml" position: top: 3 left: 0 height: 2 width: 1 refreshInterval: 3600 prettyweather: enabled: true city: "Hangzhou, China" position: top: 3 left: 1 height: 2 width: 1 refreshInterval: 300 unit: "m" view: 0 language: "en" git: commitCount: 5 commitFormat: "[forestgreen]%h [grey]%cd [white]%s [grey]%an[white]" dateFormat: "%H:%M %d %b %y" enabled: true position: top: 0 left: 2 height: 2 width: 3 refreshInterval: 8 repositories: - "/path/to/git/repository/1" - "/path/to/git/repository/2" textfile: enabled: true filePaths: - "/path/to/markdown/file1" - "/path/to/markdown/file2" format: true formatStyle: "dracula" position: top: 2 left: 4 height: 3 width: 1 refreshInterval: 15 wrapText: true

一次内存测试体验

Linux 一次内存测试体验 主要测试项目: 内存带宽测试 内存基准测试 内存基础知识 内存带宽计算公式 内存带宽计算公式:带宽=内存物理频率×倍增系数×(内存总线位数/8) 通用的计算公式:带宽=频率\*位宽/8 内存的物理频率 随着技术的发展,内存的物理频率以及带宽都在增加。 内存的物理频率:内存颗粒运行的物理频率,从早期的 100MHz 到现在的 260MHz。 内存的时钟周期:与内存物理频率互为倒数,所以从早期的 10ns(1/100MHz)到现在的 4n(1/266) 以内。 而内存名称上的数字则是标称频率,其实并不是物理频率。如 DDR 400、DDR2 800、DDR3 1600 和 DDR4 3200 的物理运行频率都是 200MHz,物理频率必须乘上倍增系数才能获得相应的标称频率。 标称频率是以老旧的SDRAM内存为基准,换算得出利于商业运作和产品标识的频率。 内存物理频率与标称频率的列表: 100MHz - DDR200,DDR2 400,DDR3 800,DDR4 1600 133MHz - DDR266,DDR2 533,DDR3 1067,DDR4 2133 166MHz - DDR333,DDR2 667,DDR3 1333,DDR4 2666 200MHz - DDR400,DDR2 800,DDR3 1600,DDR4 3200 233MHz - DDR3 1887,DDR4 3733, 266MHz - DDR2 1066,DDR3 2133,DDR4 4266 内存的倍增系数 内存从SDRAM发展至今DDR4,其改变如下: DDR 采用时钟脉冲上升、下降沿各传一次数据,1 个时钟信号可以传输 2 倍于 SDRAM 的数据,所以又称为双倍速率 SDRAM。一次预读 2bit 数据。它的倍增系数就是 2。 DDR2 仍然采用时钟脉冲上升、下降支各传一次数据的技术(不是传 2次),但是一次预读 4bit 数据,是 DDR 一次预读 2bit 的 2 倍,因此,它的倍增系数是 2X2=4。 DDR3 作为 DDR2 的升级版,最重要的改变是一次预读 8bit,是 DDR2 的 2 倍,所以,它的倍增系数是 2X2X2=8。 DDR4,较为复杂。DDR4 如果要继续在物理频率不增加的情况下达到高传输性能,只有两种方法。 其一就是增加预取位到 16bit 其二就是采用多总线技术。GDDR5 显存就使用了双总线技术来达到极高的内存带宽和标称频率。比如 GDDR5 5000 显存,由于采用双总线技术,我们可以将其看作两颗 “GDDR5 2500” 并行运行,每颗 “GDDR5 2500” 预取位数为 8bit,两颗组成的“双通道”,预取位数可以看作16bit。 实际上用到了第三种方法,可见DDR4 SDRAM 内存的总线位数 从 SDRAM-DDR 时代,数据总线位宽时钟没有改变,都为 64bit,但是采用双通道技术,可以获得 64X2=128bit 的位宽。如果采用四通道技术,可以达到 256bit 位宽。 ...

使用 Django 创建一份在线简历

Python [[Django]] 使用 Django 创建一份在线简历 一、开篇 去年十二月的时候,我曾跟着追梦人物的Django博客教程葫芦依样,开发出了一个自己的博客 Black&White,那时候的我对网站的结构,网站运行的模式懵懵懂懂,只会跟着教程一步步做下去,遇到问题去找解决方案的过程也很艰辛,找不到出现问题的关键点,最后成品做了出来,但因为只是模仿,没能力创新,使得最后自己的博客 url 是 demo.lightl.fun/,连二级域名都不会修改。之后几个月因为其他事缠身,也就没继续 Django 的学习。适逢将要毕业,我花了几个月将本科知识全部回顾了一遍,对计算机网络的认识更上一层楼,乘着将要找工作,不如重新实践,利用 Django 创建一份在线简历。 二、设计思路 由于做过的工程太少,很多时候设计思路只是一个方向,具体实现过程会对需求做各种变动,随机应变吧。 简单的设计思路就是,开始一个 Django 项目,开始一个新的简历应用,从网上找到前端界面模板,然后作为 static 文件放到简历应用中,根据模板可以提供的数据输出位置设计模型(数据库),然后生成数据库,存入真实数据,用 Django 提供的数据库接口获得数据,在视图函数中作为参数传给前端界面,再在前端界面中使用模板渲染的方法给传来的数据进行渲染,最后使用 nginx 部署在公网服务器上,实现在线简历功能。 三、具体实现及遇到的问题 具体实现过程中,参考自强学堂-Django 基础教程以及追梦人物的 Django 博客教程。此时的实现,会考虑每一步做的意义以及能实现的效果,同时 Django 已经升级到了 2.0.5,而网上教程多集中在 1.8,有少许区别,参照自强学堂提出的以及 google 可以解决,(同时 Django2.0.5 可以兼容Django1.8创建的项目,但在模型部分有修改)。 先是常规的建立项目,建立应用,添加应用信息到 settings.py,给 view.py 添加一个 index 方法,给 urls.py 配置 url 导向,这里没什么太多可说的。 # JL/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'jianli', ] # JL/urls.py from django.contrib import admin from django.urls import path from jianli import views as jianli_views urlpatterns = [ path('admin/', admin.site.urls), path('', jianli_views.index, name='jianli_view'), # 新版 url 写法更舒服了 ] 之后找简历模板,最后选择了简历模板,下载,放入应用的 static 文件夹中,将 index.html 放入 templates 文件夹中,给 html 文件中指向的 css、js 位置进行修改,此时出现了第一个渲染的数据 base_dir,它指向应用的 static 文件夹,如果今后移动该文件夹,只需要修改 base_dir 内容,index.html 就可以正常工作。 ...

使用 Docker 安装 Jira Software 和 Confluence

[[Confluence]] [[Jira]] 使用 Docker 安装 Jira Software 和 Confluence Jira 是一个缺陷跟踪管理系统,为针对缺陷管理、任务追踪和项目管理的商业性应用软件,开发者是澳大利亚的 Atlassian。Jira 这个名字并不是一个缩写,而是截取自 Gojira ,日文的哥斯拉发音。 Atlassian Confluence(简称Confluence)是一个专业的 wiki 程序。它是一个知识管理的工具,通过它可以实现团队成员之间的协作和知识共享。 安装 Jira(8.1.0) 和 Confluence (7.0.1) 制作 Docker 破解镜像 atlassian-agent.jar 破解文件:atlassian-agent 目录结构: atlassian ├── docker-compose.yml ├── confluence │ ├── Dockerfile │ └── atlassian-agent.jar └── jira ├── Dockerfile └── atlassian-agent.jar atlassian/docker-compose.yml: version: "3.7" services: mysql: image: mysql:5.7 container_name: mysql ports: - "3306:3306" restart: unless-stopped networks: atlassian-net: aliases: - mysql environment: - MYSQL_ROOT_PASSWORD=123456 volumes: - type: volume source: data_mysql_vol target: /var/lib/mysql - type: volume source: conf_mysql_vol target: /etc/mysql/mysql.conf.d - type: volume source: data_backup_vol target: /backup - type: bind source: /usr/share/zoneinfo/Asia/Shanghai target: /etc/localtime read_only: true jira: image: jira/jira:v8.1.0 build: ./jira container_name: jira ports: - "8080:8080" restart: unless-stopped depends_on: - mysql networks: atlassian-net: aliases: - jira environment: - CATALINA_OPTS= -Xms1024m -Xmx2g -Datlassian.plugins.enable.wait=300 volumes: - data_jira_var:/var/atlassian/jira - data_jira_opt:/opt/atlassian/jira confluence: image: confluence/confluence:7.0.1 build: ./confluence container_name: confluence ports: - "8090:8090" restart: unless-stopped depends_on: - mysql networks: atlassian-net: aliases: - confluence volumes: - data_confluence_vol:/home/confluence_data - data_confluence_opt:/opt/atlassian/confluence - data_confluence_var:/var/atlassian/confluence networks: atlassian-net: driver: bridge volumes: data_mysql_vol: conf_mysql_vol: data_backup_vol: data_jira_var: data_jira_opt: data_confluence_vol: data_confluence_opt: data_confluence_var: atlassian/jira/Dockerfile: ...

使用 fio 测试磁盘 I/O 性能

Linux 使用 fio 测试磁盘 I/O 性能 fio 是一个常见的用于测试磁盘 I/O 性能的工具,支持 19 种不同的 I/O 引擎,包括:sync, mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。fio 一直在更新,最新的版本是 v3.19,它的官网是 fio。 fio 有两种方式对磁盘进行压力测试,一种是命令行指定参数,另外一种是读取配置文件,两者差不太多,但后者可以配合 sh,screen 等方式,保持长期的运行。 安装 $ sudo apt install fio 配置文件参数说明 配置文件属于 ini 格式的,即有区块概念,区块下通过“=”设置键值对。 filename: 指定文件 (设备) 的名称。可以通过冒号分割同时指定多个文件,如 filename=/dev/sda:/dev/sdb。 directory: 设置 filename 的路径前缀。在后面的基准测试中,采用这种方式来指定设备。 name: 指定 job 的名字,在命令行中表示新启动一个 job。 direct: bool 类型,默认为 0, 如果设置成 1,表示不使用 io buffer。 ioengine: I/O 引擎,现在 fio 支持 19 种 ioengine。默认值是 sync 同步阻塞 I/O,libaio 是 Linux 的 native 异步 I/O。关于同步异步,阻塞和非阻塞模型可以参考文章 使用异步 I/O 大大提高应用程序的性能”。 iodepth: 如果 ioengine 采用异步方式,该参数表示一批提交保持的 io 单元数。该参数可参考文章“Fio 压测工具和 io 队列深度理解和误区”。 rw: I/O 模式,随机读写,顺序读写等等。可选值:read,write,randread,randwrite,rw,randrw。 bs: I/O block 大小,默认是 4k。测试顺序读写时可以调大。 size: 指定 job 处理的文件的大小。 numjobs: 指定 job 的克隆数(线程)。 time_based: 如果在 runtime 指定的时间还没到时文件就被读写完成,将继续重复知道 runtime 时间结束。 runtime: 指定在多少秒后停止进程。如果未指定该参数,fio 将执行至指定的文件读写完全完成。 group_reporting: 当同时指定了 numjobs 了时,输出结果按组显示。 命令行使用 # 顺序读 $ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest # 顺序写 $ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest # 随机读 $ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest # 随机写 $ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest # 混合随机读写 $ fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=100 -group_reporting -name=mytest -ioscheduler=noop 配置文件启动 # fio.conf [global] ioengine=libaio iodepth=128 direct=0 thread=1 numjobs=16 norandommap=1 randrepeat=0 runtime=60 ramp_time=6 size=1g directory=/your/path [read4k-rand] stonewall group_reporting bs=4k rw=randread [read64k-seq] stonewall group_reporting bs=64k rw=read [write4k-rand] stonewall group_reporting bs=4k rw=randwrite [write64k-seq] stonewall group_reporting bs=64k rw=write $ fio fio.conf read4k-rand: (groupid=0, jobs=16): err= 0: pid=2571: Tue May 12 15:28:36 2020 read: IOPS=33.4k, BW=131MiB/s (137MB/s)(7834MiB/60002msec) slat (nsec): min=1703, max=3754.6k, avg=476047.81, stdev=421903.44 clat (usec): min=4, max=93701, avg=60830.41, stdev=9669.21 lat (usec): min=171, max=94062, avg=61307.14, stdev=9735.47 clat percentiles (usec): | 1.00th=[41681], 5.00th=[45876], 10.00th=[48497], 20.00th=[51643], | 30.00th=[54789], 40.00th=[57410], 50.00th=[60556], 60.00th=[63701], | 70.00th=[66847], 80.00th=[69731], 90.00th=[73925], 95.00th=[77071], | 99.00th=[81265], 99.50th=[82314], 99.90th=[85459], 99.95th=[86508], | 99.99th=[88605] bw ( KiB/s): min= 6240, max=11219, per=6.27%, avg=8377.40, stdev=1197.43, samples=1920 iops : min= 1560, max= 2804, avg=2094.01, stdev=299.31, samples=1920 lat (usec) : 10=0.01%, 250=0.01%, 500=0.01% lat (msec) : 2=0.01%, 4=0.01%, 10=0.01%, 20=0.02%, 50=14.27% lat (msec) : 100=85.80% cpu : usr=0.59%, sys=1.94%, ctx=1545619, majf=0, minf=0 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=107.7% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwt: total=2003580,0,0, short=0,0,0, dropped=0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 read64k-seq: (groupid=1, jobs=16): err= 0: pid=2590: Tue May 12 15:28:36 2020 read: IOPS=10.7k, BW=674MiB/s (707MB/s)(12.3GiB/18607msec) slat (usec): min=8, max=12592, avg=1495.75, stdev=3792.74 clat (usec): min=2, max=193705, avg=189323.53, stdev=12000.95 lat (usec): min=21, max=193723, avg=190819.12, stdev=11397.67 clat percentiles (msec): | 1.00th=[ 180], 5.00th=[ 180], 10.00th=[ 182], 20.00th=[ 190], | 30.00th=[ 192], 40.00th=[ 192], 50.00th=[ 192], 60.00th=[ 192], | 70.00th=[ 192], 80.00th=[ 192], 90.00th=[ 192], 95.00th=[ 192], | 99.00th=[ 194], 99.50th=[ 194], 99.90th=[ 194], 99.95th=[ 194], | 99.99th=[ 194] bw ( KiB/s): min=41000, max=43682, per=6.12%, avg=42274.07, stdev=551.21, samples=592 iops : min= 640, max= 682, avg=660.07, stdev= 8.64, samples=592 lat (usec) : 4=0.01%, 50=0.01%, 100=0.01%, 250=0.02%, 500=0.01% lat (usec) : 750=0.01% lat (msec) : 10=0.01%, 20=0.05%, 50=0.19%, 100=0.26%, 250=100.46% cpu : usr=0.13%, sys=2.13%, ctx=49722, majf=0, minf=16 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.3%, >=64=131.4% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwt: total=198676,0,0, short=0,0,0, dropped=0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 write4k-rand: (groupid=2, jobs=16): err= 0: pid=2607: Tue May 12 15:28:36 2020 write: IOPS=2409k, BW=9411MiB/s (9868MB/s)(16.0GiB/1741msec) clat percentiles (nsec): | 1.00th=[ 0], 5.00th=[ 0], 10.00th=[ 0], 20.00th=[ 0], | 30.00th=[ 0], 40.00th=[ 0], 50.00th=[ 0], 60.00th=[ 0], | 70.00th=[ 0], 80.00th=[ 0], 90.00th=[ 0], 95.00th=[ 0], | 99.00th=[ 0], 99.50th=[ 0], 99.90th=[ 0], 99.95th=[ 0], | 99.99th=[ 0] cpu : usr=14.12%, sys=85.68%, ctx=2337, majf=0, minf=16 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwt: total=0,4194304,0, short=0,0,0, dropped=0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 write64k-seq: (groupid=3, jobs=16): err= 0: pid=2623: Tue May 12 15:28:36 2020 write: IOPS=221k, BW=13.5GiB/s (14.5GB/s)(16.0GiB/1188msec) clat percentiles (nsec): | 1.00th=[ 0], 5.00th=[ 0], 10.00th=[ 0], 20.00th=[ 0], | 30.00th=[ 0], 40.00th=[ 0], 50.00th=[ 0], 60.00th=[ 0], | 70.00th=[ 0], 80.00th=[ 0], 90.00th=[ 0], 95.00th=[ 0], | 99.00th=[ 0], 99.50th=[ 0], 99.90th=[ 0], 99.95th=[ 0], | 99.99th=[ 0] cpu : usr=3.63%, sys=96.11%, ctx=1862, majf=0, minf=16 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.2%, >=64=99.6% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwt: total=0,262144,0, short=0,0,0, dropped=0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 Run status group 0 (all jobs): READ: bw=131MiB/s (137MB/s), 131MiB/s-131MiB/s (137MB/s-137MB/s), io=7834MiB (8215MB), run=60002-60002msec Run status group 1 (all jobs): READ: bw=674MiB/s (707MB/s), 674MiB/s-674MiB/s (707MB/s-707MB/s), io=12.3GiB (13.2GB), run=18607-18607msec Run status group 2 (all jobs): WRITE: bw=9411MiB/s (9868MB/s), 9411MiB/s-9411MiB/s (9868MB/s-9868MB/s), io=16.0GiB (17.2GB), run=1741-1741msec Run status group 3 (all jobs): WRITE: bw=13.5GiB/s (14.5GB/s), 13.5GiB/s-13.5GiB/s (14.5GB/s-14.5GB/s), io=16.0GiB (17.2GB), run=1188-1188msec Disk stats (read/write): nvme0n1: ios=1819561/61, merge=0/580, ticks=2577676/16, in_queue=2501764, util=96.22% 从上述结果的 bw 和 iops 来看,这是块走 pcie 3.0 * 2 的 ssd,大概率是 m.2 接口的 SSD。 ...

修复丢失的 GPG 密钥 Apt 存储库错误(NO_PUBKEY)

Linux Ubuntu 修复丢失的 GPG 密钥 Apt 存储库错误(NO_PUBKEY) apt遇到gpg error:pub key not found问题。 报错一般出现在 apt/apt-get update/upgrade 相关操作时。大致报错内容为: W: GPG error: https://packages.grafana.com/oss/deb stable InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 8C8C34C524098CB6 注意这个 8C8C34C524098CB6 这个就是 pub key。 这个问题出现的原因是:当您添加存储库,而忘记添加其公共密钥时,或者在尝试导入 GPG 密钥时可能出现临时密钥服务器错误 它造成的影响是:无法更新软件索引,从而无法更新软件 解决方案:导入公共GPG密钥 修复单个存储库的丢失 GPG 密钥问题 sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net:80 --recv-keys THE_MISSING_KEY_HERE THE_MISSING_KEY_HERE 在这里指代上面的 8C8C34C524098CB6。 完整指令是: sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net:80 --recv-keys 8C8C34C524098CB6 批量修复存储库的丢失 GPG 密钥问题 sudo apt update 2>&1 1>/dev/null | sed -ne 's/.*NO_PUBKEY //p' | while read key; do if ! [[ ${keys[*]} =~ "$key" ]]; then sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net:80 --recv-keys "$key"; keys+=("$key"); fi; done 参考 Fix Missing GPG Key Apt Repository Errors (NO_PUBKEY)

修改已有用户 uid 以及 gid

Linux 修改已有用户 uid 以及 gid 主要是为了解决 nfs 权限问题,所以一些特定的机器需要对特定的用户配置特定的uid以及gid。 配置前必须保证两点: 需要变成的id是否被占用: id $your_id 需要变动的用户是否有进程: ps -au $username 如果出现了上述两种情况,根据实际情况处理,一般的处理方法为: id被占用:删掉占用的用户,或者占用的用户重新分配id 有进程存在:ps -aux $username|grep -v PID|awk '{print $1}'|xargs kill -9 上述情况判断完成后,就需要重新指定id了。 # 假设用户tomcat的uid为90 $ id tomcat uid=90(tomcat) gid=90(tomcat) groups=90(tomcat) $ usermod -u 91 tomcat $ groupmod -g 91 tomcat $ id tomcat uid=91(tomcat) gid=91(tomcat) groups=91(tomcat) find / -user 90 -exec chown -h tomcat {} ; find / -group 90-exec chgrp -h tomcat {} ; 参考 Linux 下 NFS 服务权限问题解决 Permission denied