Linux启动流程简述
记录Linux启动流程。
Linux启动的简要流程Linux-MBR启动流程POST – GRUB(Bootloader-MBR) – Kernel – init
详细描述及说明
在触发开机通电之后,计算机读取BIOS中CMOS芯片的已经写好的程序进行主板设备的通电自检.
在自检完成后将读取硬盘上的前512个字节,通过前面的446个字节载入grub的bootloader及硬盘相关驱动.
同时引导grub进入stage1.5,stage1.5指向了定义在boot分区下的grub.cfg,及相关的grub图形文件.
grub的stage2进行了grub的菜单展示及内核选择的界面.
通过grub的引导,计算机挂载内核,识别的根文件系统.
启动init进程,通过SysV管理其他进程的启动及执行.
Grub 内核参数grub的菜单里面有几个参数, 这几个参数是用来控制内核行为的.AWS ec2 的串行端口是通过这个东西控制的, 如果不添加这个参数, 串口就是黑的.
linux /boot/vmlinuz-linux-zen root=UUID=7a1c634b-4d44-4136-87b1-6232d31b7c3b rw console=ttyS0 earlyprintk=serial,ttyS0,keep transparent_hugepage=never
初始化 Serial Console.console=ttyS0
设置初始化端口的选项.
Append “,keep” to not disable it when the real console takes over.earlyprintk=serial,ttyS0,keep
关闭透明巨页.transparent_hugepage=never
vim笔记
vim的常用的命令速记。
可在~/.vimrc中进行vim的的默认配置,echo ‘:set nu’ > ~/.vimrc即可设置vim默认显示行号。30分钟正则表达式入门教程
Vim一种模式化的编辑器,具有多种不同的模式。
编辑模式,命令模式
插入模式
末行模式 内置的命令行接口
vim +12 test.sh
vim +/PATTERN test.sh 打开自动定位到匹配模式的第一个结果的行首。
vim + test.sh 直接出现在文件末尾
切换模式的说明i – 直接在当前光标的位置输入a – 在光标字符的后面输入o – 在光标下面直接新建一行,开始输入I – 在光标所在行的行首输入O – 在光标所在的上面直接新建一行,开始输入A – 在光所所在行的行尾输入
编辑模式到末行模式 使用符号 ::10,100d:set nu:set nonu:s/dhcp/static/g
关闭文件: 编辑模式下 连续ZZ,表示保存退出 :q 表示直接退出,类似的常用还有 :wq :wq! :q! :w! :w :x 保存退出 :w [PATHTOFILE]
光标调整:字符间hjkl 左 下 上 右 10l 右侧10个字符w 下一个单词的词首b 前一个单词的词首e 下一个单词的词尾
行首行尾^ 调至行首第一个非空白字符0 调至行首$ 调至行尾
HIJK 行间G 直接到最后一行句间段间
1.2. 设置vim的个性化设置设置自动显示行号,设置VIM自动将tab转化为4个空格
:set nu
:set tabstop=4
:set softtabstop=4
:set shiftwidth=4
:set expandtab
3. 已经编辑的文件进行tab空格转换:
TAB替换为空格::set ts=4
:set expandtab
:%retab!
空格替换为TAB::set ts=4
:set noexpandtab
:%retab!
4. Vim的个性化配置及插件
自动换行
set wrap
输入命令时自动提示补完
set showcmd
显示行号
set nu
显示当前行号及关联前后行号
set relativenumber
语法高亮
syntax on
光标所在的行高亮
set cursorline
前后滚动时保留最前和最后的5行
set scrolloff=5
Ansible笔记-2
这份笔记介绍的是Ansible playbook的格式及相关的内容。
Ansible笔记Ansible PlaybookYAML
YAML(/ˈjæməl/,尾音类似 camel ) 是“YAML不是一种标记语言”的外语缩写(见前方参考资料原文内容);但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。数据结构可以用类似大纲的缩排方式呈现,结构通过缩进来表示,连续的项目通过减号“-”来表示,map结构里面的key/value对用冒号“:”来分隔。YAML文件一般的文件名为.yaml 或 .yml,文本结构举例如下:
house:
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
address:
number: 34
street: Main Street
city: Nowheretown
zipcode: 12345
Ansible Playbook的关键字内容与命令的内容基本一致,有如下的几个关键字:
- hosts 用来指定控制主机的范围,注意短横线后空格接字符
remote_user 用来指定使用的用户
tasks 可在字段下方缩进指定需要执行的任务,注意缩进
- name 用来定义任务的名称或描述,注意短横线后空格接字符
yum: name=httpd state=latest 定义使用的模块功能:后面跟操作参数
tags: 对任务进行标记,可通过命令调用标记执行或排除某些任务
when: 判断,满足when后面的条件才执行任务
notify: 触发handler的标志
handlers: 定义触发任务的内容
- name: 任务的名称,注意短横线后空格接字符
service: name=httpd state=restarted 定义使用的模块:后面跟操作参数
Ansible Playbook示例先看一个已经写好的playbook,针对写好的来解释playbook如何书写。
--- # 默认的开头
- hosts: all # 先定义控制的范围,all表示所有主机,分组可定义在/etc/ansible/hosts文件中;
remote_user: root # 定义执行下面操作的用户,控制权限
tasks: # tasks字段负责定义任务
# 如果是Redhat系,执行安装httpd
- name: install httpd CentOS
yum:
name: httpd
state: latest
tags: install_httpd
when: ansible_os_family == "RedHat"
# 如果是Debain系,执行安装apache
- name: install httpd Ubuntu
apt:
name: apache
state: latest
when: ansible_os_family == "Ubuntu"
tags: install_httpd
# 执行网站主页的替换,如果变更触发handler字段定义的重启服务任务
- name: set the homepage
copy:
src: ./index.html
dest: /var/www/html/index.html
notify:
- restart_the_service
# 执行启动服务
- name: start httpd
service:
name: httpd
service: started
# 执行清空防火墙
- name: empty firewalld
shell: iptables -F
# 移除apache软件包
- name: remove httpd
yum:
name: httpd
state: absent
tags: remove_httpd
# 删除预设的apache网站文件
- name: clean stuff
file:
name: /var/www/html/
state: absent
tags: clean_stuff
# handler触发后需要执行的任务
handlers:
# 重启httpd服务
- name: restart_the_service
service:
name: httpd
state: restarted
Ansible Playbook执行命令使用格式:
ansible-playbook [options] playbook.yml [playbook2 ...]
命令作用:
Runs Ansible playbooks, executing the defined tasks on the targeted hosts.
# 运行ansible的playbook,在目标主机上执行已经定义好的任务。
命令示例:
[root@Hayden ~]$ ansible-playbook --syntax-check install_httpd.yaml
# 对playbook进行语法检查
[root@Hayden ~]$ ansible-playbook -C install_httpd.yaml
# 对playbook进行运行测试,不改变结果,仅仅进行测试
[root@Hayden ~]$ ansible-playbook install_httpd.yaml
# 对playbook进行运行,并生成运行的结果
[root@Hayden ~]$ ansible-playbook -t "install_httpd" install-httpd.yaml
# 只运行具有“install_httpd”标签的任务
[root@Hayden ~]$ ansible-playbook --skip-tags "install_httpd" install-httpd.yaml
# 跳过install_httpd标签的任务
[root@Hayden ~]$ ansible-playbook --skip-tags "install_httpd clean_stuff" install-httpd.yaml
# 跳过多个标签的任务示例
默认文件位置sudo pacman -Ql ansible | grep hosts 查看hosts文件的范例文件所在目录,其他文件操作类似.
如果有不明白的命令可通过ansible-doc命令直接查看内置的说明文件,针对模块的ansible-doc -l 为列出所有可用模块
Ansible笔记-1
Ansible的学习笔记。Ansible管理方式是资源在目标主机上,定义所期望的目标状态的方式;每一个操作必须是幂等的(可重复操作但结果不变的)。ansible采用ssh链接所管理的服务器,因此具有agentless的优势。
Ansible的安装Ansible在Redhat的仓库中就有二进制包,直接dnf或yum安装就可以了。
[root@localhost Liarlee]$ yum install -y Ansible
Ansible的配置文件Ansible的配置文件常用的有:
/etc/ansible/ansible.cfg Ansible的配置文件
/etc/ansible/hosts Ansible允许控制的主机列表,可在hosts文件中对服务器进行分组
Ansible的组件
ansible
ansible-playbook
ansible-doc
Ansible的配置和使用Ansible命令模式
ansible [HOST_PARTTEN] -m [MODUELS] -a “[ARGS]” -f [Forks] -C -u [USERNAME] -c [CONNTECTION]
基于密钥认证ansibleansible支持使用ssh用户命名密码的认证方式,也支持使用ssh密钥认证的方式进行链接。ssh密钥的方式可以保证安全性,同时免去输入密码的麻烦。
生成ansible的密钥 [root@localhost Liarlee]$ ssh-keygen -t rsa -P ""
复制ansible的公钥到需要连接控制的host上 [root@localhost Liarlee]$ ssh-copy-id -i ~/.ssh/id-rsa.pub root@[host1-IP]
[root@localhost Liarlee]$ ssh-copy-id -i ~/.ssh/id-rsa.pub root@[host2-IP]
在ansible的hosts文件中记录需要控制的主机名或者IP [root@localhost Liarlee]$ echo "[host1-IP]" >> /etc/ansible/hosts
[root@localhost Liarlee]$ echo "[host2-IP]" >> /etc/ansible/hosts
使用ansible进行控制测试 [root@localhost Liarlee]$ ansible all -m ping # 进行连通测试
[root@localhost Liarlee]$ ansible all -m ping --list-hosts # 列举所有受影响的主机,但是不执行操作
[root@localhost Liarlee]$ ansible all -m ping -C # 进行测试,但是不对控制的主机作更改
Ansible使用示例Ansible默认将所有的操作通过模块的方式定义,这里列举了一些常用的模块:
Ansible管理查询命令使用ansible-doc命令来进行模块的文档查看, /var/log/messages 中会记录操作日志。
[root@localhost Liarlee]$ ansible-doc -l # 列举所有当前可用的模块和简单说明
[root@localhost Liarlee]$ ansible-doc -s [MODULES_NAME] # 查看指定模块的使用方法和说明
User模块设定主机的用户状态,对用户进行创建删除,更改信息以及参数。
# 设置所有主机创建用户user,设置内容有uid,groups,shell
[root@localhost Liarlee]$ ansible all -m user -a "name=user1 uid=3000 state=present groups=testgrp shell=/bin/zsh"
Group模块设置主机的组状态,对组状态进行编辑。
# 控制所有主机创建组testgrp,设置内容有gid,非系统组
[root@localhost Liarlee]$ ansible all -m group -a "gid=3000 name=testgrp state=present system=no"
# 控制所有主机删除testgrp
[root@localhost Liarlee]$ ansible all -m group -a "gid=3000 name=testgrp state=absent"
Copy模块从本地复制内容到控制的所有主机,指定源地址和目的地址。
# 复制本地/etc/fstab到所有主机的/tmp/fstab.ansible,同时设置权限为755
[root@localhost Liarlee]$ ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=755"
# 通过键盘输入的文本内容传输到目的文件中,文件可不存在,可同时设置文件的属主属组
[root@localhost Liarlee]$ ansible all -m copy -a "content='hello,world\n' dest=/tmp/test.txt owner=liarlee group=liarlee"
# 递归复制目录及其子文件到所有主机的/tmp/下
[root@localhost Liarlee]$ ansible all -m copy -a "src=/etc/httpd dest=/tmp/"
# 复制目录下的所有文件到所有主机的/tmp/下,不创建对应的目录
[root@localhost Liarlee]$ ansible all -m copy -a "src=/etc/httpd/ dest=/tmp/"
# 在所有主机的目录下新建一个空文件
[root@localhost Liarlee]$ ansible all -m copy -a "content='' dest=/tmp/testfile"
Fetch模块可从远程主机复制文件到本地。
# 从某个主机复制文件到本地目录,文件不存在退出
[root@localhost Liarlee]$ ansible [HOST1] -m fetch -a "src=/etc/fstab dest=/tmp/fstab.host1 fail-on-missing=yes"
Command模块command模块不调用shell去解析命令,仅仅读取第一个命令进行简单执行,因此不支持管道传递参数。
# 在所有主机上执行ifconfig
[root@localhost Liarlee]$ ansible all -m command -a "ifconfig"
Shell模块使用shell执行传递的命令,支持管道传递参数
# 执行shell命令修改用户的密码
[root@localhost Liarlee]$ ansible all -m shell -a "echo PASSWORD | passwd --stdin user1"
File模块用于设定文件的状态以及属性
# 在所有主机上建立目录
[root@localhost Liarlee]$ ansible all -m file -a "path=/tmp/testdir state=directory"
# 在所有主机上对文件建立符号链接
[root@localhost Liarlee]$ ansible all -m file -a "src=/tmp/testfile path=/tmp/testfile.link state=link"
# 在所有主机上设置文件或目录的权限
[root@localhost Liarlee]$ ansible all -m file -a "path=/tmp/testfile mode=0755"
Cron模块用于设置计划任务
# 设置每三分钟运行一次同步时间的脚本
[root@localhost Liarlee]$ ansible all -m cron -a "miniute=*/3 name=synctime job='usr/sbin/update 172.16.0.1 &> /dev/null'state=present"
# 删除设置的计划任务
[root@localhost Liarlee]$ ansible all -m cron -a "miniute=*/3 name=synctime job='usr/sbin/update 172.16.0.1 &> /dev/null'state=absent"
Yum模块用于调用yum进行软件包的安装卸载等,定义主机安装软件包的状态
# 在所有主机安装nginx
[root@localhost Liarlee]$ ansible all -m yum -a "name=nginx state=install"
Service模块用于定义管理目标主机的服务状态
# 在所有的主机上启动nginx服务
[root@localhost Liarlee]$ ansible all -m service -a "name=nginx state=startd"
# 在所有的主机上设置nginx开机启动
[root@localhost Liarlee]$ ansible all -m service -a "name=nginx enabled"
# 在所有主机上停止nginx服务
[root@localhost Liarlee]$ ansible all -m service -a "name=nginx state=stoppd"
# 在所有的主机上重载nginx的配置文件
[root@localhost Liarlee]$ ansible all -m service -a "name=nginx state=reloaded"
# 在所有主机上重启nginx服务
[root@localhost Liarlee]$ ansible all -m service -a "name=nginx state=restarted"
Scripts模块用于在所有主机上执行设置好的脚本
# 在所有的主机上执行test.sh
[root@localhost Liarlee]$ ansible all -m scripts -a "/tmp/test.sh"
KVM中windows7虚拟机时间问题
在KVM虚拟机中,安装Windows7的虚拟机,安装完成启动的时候发现虚拟机的时间与外部时间的速度不一致。记录问题的原因及解决方法。
解决方式查看虚拟机的配置文件观察运行的效果类似于GBA模拟器的加速设定,动画速度变快了,windows7的系统时间也被加速了。 首先怀疑的是虚拟机的运行速度是不是被加速了,没有相关的设置。其次是查看配置文件中时间的相关定义,发现我的配置文件中,时间的定义是这样的:
<clock offset='localtime'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
<timer name='hypervclock' present='yes'/>
</clock>
怀疑这几个timer是有问题的,一般来说配置文件中只有简单的 clock offset=’localtime’ 的字段其实就够用了。在删除了第一个timer之后,系统的时间和运行速度就正常了。
在fedora-wiki找到的说明页面Libvirt_Managed_Timers页面链接在字段中‘rtc’并不是主要的问题,主要问题是后面的tickpolicy=’catchcup’。fedora wiki给出的答案是catchup–Deliver at a higher rate to catch up.所以这就是为什么删除了这个timer之后系统正常的原因。
IO重定向笔记
输出重定向部分的复习笔记
标准输入输出文件描述符的概念可以通过命令查看以及绑定文件描述符FD。
liarlee@hayden-pc ~
> $ ll /proc/$$/fd
总用量 0
dr-x------ 2 liarlee liarlee 0 6月 24 20:22 .
dr-xr-xr-x 9 liarlee liarlee 0 6月 24 20:22 ..
lrwx------ 1 liarlee liarlee 64 6月 24 20:22 0 -> /dev/pts/0
lrwx------ 1 liarlee liarlee 64 6月 24 20:22 1 -> /dev/pts/0
lrwx------ 1 liarlee liarlee 64 6月 24 20:22 10 -> /dev/pts/0
lrwx------ 1 liarlee liarlee 64 6月 24 20:22 2 -> /dev/pts/0
Linux提供的I/O设备Linux系统提供的IO设备,共有三种:
STDIN - 0 默认键盘输入
STDOUT - 1 默认输出信息到终端
STDERR - 2 默认输出错误信息到终端
Linux输入输出重定向重定向说明STDOUT和STDERR可以被重定向到文件中,STDIN可通过读取文件实现输入重定向,重定向命令的基本格式如下:
[CMD] [lOPERATION_SYMBOL] [FILENAME]
命令 操作符号 文件名
操作符号包括:
> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有结果输出重定向到文件
>> 在原有文件内容的基础上进行追加
< 标准输入的重定向
例子那么会有如下的操作:
> $ ls 1> /tmp/echo.stdout
# 正确的命令结果输出到文件中
> $ ls 2> /tmp/echo.stderr
# 命令执行的错误结果输出到文件中
> $ ls /error /usr 2>&1 >/tmp/right.test
# 将错误信息重定向输出到屏幕显示,正确的信息输出到文件
# 通俗的讲是-- 将STDERR(2)重定向为STDOUT(1)输出到屏幕上,
# 命令的其他结果输出到文件中
> $ ls /error /usr >true 2>false
# 将正确的信息输出到true中,把错误的信息输出到false中
> $ ls /error /usr >all 2>&1
# 先将标准输出重定向到文件all中,在将错误信息追加到标准输出中
# 命令结果等于ls /error /usr &>all
> $ ls /error /usr &> /dev/null
# 静默执行命令,不显示结果,不输出到终端
> $ ls /error /usr 2>&1 >/dev/null
# 错误的信息显示在终端上,其他信息不显示
# 某些命令可以使用管道将STDIN输入重定向作为命令的值
echo [PASSWD] | passwd --stdin [username] &> /dev/null
# 更改某个用户的用户名和密码
pyautogui自动脚本
最近一个游戏非常的上头, 实在是肝不动了,自己写了个脚本帮我点点点。
Pyautogui 库Pyautogui 项目Pyautogui CheatSheet
简单记录了一下使用到的方法。
pyautogui.position() # 获取鼠标位置
pyautogui.locateOnScreen() # 对屏幕截图,获取图片文件所对应的屏幕坐标
pyautogui.click() # 模拟鼠标点击
pyautogui.doubleclick() # 模拟鼠标双击
pyautogui.moveTo() # 移动到屏幕坐标位置
pyautogui.moveRel() # 移动固定的坐标距离
pyautogui.dragRel() # 按住鼠标拖拽
code#!/usr/bin/python
# -*- coding:UTF-8 -*-
import pyautogui
import time
import os
def MOTIONMOUSE(lines):
if lines < 9:
# 检测是否有书本或食物
results_food = pyautogui.locateOnScreen('./food.png', grayscale=True) # 检测食物图片是否存在
print('- 食物检测结果:', results_food)
results_book = pyautogui.locateOnScreen('./book.png', grayscale=True) # 检测书籍图片是否存在
print('- 书本检测结果:', results_book)
pyautogui.click(1900, 60, duration=0.1) # 点击换线
if results_book is not None:
pyautogui.click(1700, 325) # 点击学习
pyautogui.click(1600, 645) # 点击确定
elif results_food is not None:
pyautogui.click(1700, 325) # 点击食用
else:
pass
pyautogui.moveTo(1700, 60, duration=0.1) # 移动到对应一线的位置
pyautogui.moveRel(0, 65 * lines, duration=0.1) # 移动到对应的线路位置
time.sleep(1)
pyautogui.click() # 触发一次点击
else:
pyautogui.click(1900, 60, duration=0.3) #
# 检测是否有书本或食物
results_food = pyautogui.locateOnScreen('./food.png', grayscale=True)
print('- 食物检测结果:', results_food)
results_book = pyautogui.locateOnScreen('./book.png', grayscale=True)
print('- 书本检测结果:', results_book)
if results_book is not None:
pyautogui.click(1700, 325)
pyautogui.click(1600, 645)
elif results_food is not None:
pyautogui.click(1700, 325)
else:
pass
for t in range(0, lines-8):
pyautogui.moveTo(1700, 90, duration=0.1)
pyautogui.dragRel(0, -65, duration=0.3)
if t < 14:
time.sleep(3)
else:
pass
pyautogui.click(1700, 480, duration=0.1)
# starting .....
Count = 0
replace_times = 0
Energy = input('please input value of energy: ') # 输入体力
All_lines = input('please input the number of lines: ') # 输入所有线路的数字
for turns in range(1, 999):
print('** 这是第 ' + str(turns) + ' 轮采集。')
for line in range (1, int(All_lines) + 1):
print('* 这是第 ' + str(line) + ' 条线路。')
clock = time.strftime('%H:%M:%S', time.localtime(time.time()))
print('* 开始时间 = ' + clock + ' ')
MOTIONMOUSE(int(line))
time.sleep(2)
pyautogui.click(1600, 770, duration=1.5)
pyautogui.moveTo(1310, 800)
#检测是否有树木
results_click = pyautogui.locateOnScreen('./level4_usable.png', grayscale=True) # 计算斧子在不在
print('- 斧子检测结果:', results_click)
results_replace = pyautogui.locateOnScreen('./level4_replace.png', grayscale=True) # 计算可替换的斧子在不在
print('- 更换检测结果:', results_replace)
# 判断是否有物品
if results_click is not None: # 判断是否有按键,有等待,没有按键换线;
print('* 第 ' + str(Count) + ' 次采集。')
Count = Count +1
energy = int(Energy) - 15
elif results_replace is not None: # 判断是否有可更换的斧子
pyautogui.click(1510, 720, duration=0.2)
pyautogui.click(1310, 880, duration=0.2)
Count = Count + 1
replace_times = replace_times + 1
print('这是第 ' + str(Count) + ' 次采集。')
print('这是第 ' + str(replace_times) + ' 次换斧子。')
energy = int(Energy) - 15
time.sleep(4)
else:
print('-- 采集物或斧子未存在,跳过。')
pass # 啥也没有,跳过
print('Starting Waiting for Refresh:')
time.sleep(200)
Archlinux安装过程记录
自己尝试安装了archlinux在虚拟机里,记录安装过程,不过现在archlinux的WIKI是描述清晰的,直接查看和参考即可。
Pacman常用命令pacman命令的常用说明:
[root@LiarLee ~]# pacman -Sg gnome 查看gnome软件包组下面的所有软件包
[root@LiarLee ~]# pacman -Qe openssh 查询已经安装的软件包
[root@LiarLee ~]# pacman -Qs openssh 正则查询软件包
[root@LiarLee ~]# pacman -Rs $(pacman -Qtdq) 递归删除孤立软件包
[root@LiarLee ~]# pacman -Ss 关键字:在仓库中搜索含关键字的包
[root@LiarLee ~]# pacman -Qs 关键字: 搜索已安装的包
[root@LiarLee ~]# pacman -Qi 包名:查看有关包的详尽信息
[root@LiarLee ~]# pacman -Ql 包名:列出该包的文件
[root@LiarLee ~]# pacman -Syyu 下载 和 更新本地的所有软件包
[root@LiarLee ~]# pacman -U /var/cache/pacman/pkg/linux-aarch64-6.8.9-1-aarch64.pkg.tar.xz 使用cache软件包进行降级(如果需要的话
Archlinux Installation Version 2.0Update at 2024-05-12 12:39 关于 EC2 上面的步骤。EC2 如何预期使用 metal 规格的实例是无法使用UEFI 的(x64) , 所以最后妥协了, 还是回到了BIOS。
船新版本设置一下子时区
timedatectl set-timezone Asia/Shanghai
格式化磁盘, 划分分区这次安装的分区划分是:
disk
mountpoint
description
filesystem type
/dev/vda1
/boot
uefi_partitation
xfs
/dev/vda2
/
archroot
btrfs
如果使用的是 Grub 的方式, 那么现在创建一个 1M 的分区用来写入grub 的 core.img, 并且 1M 的分区需要标记为 BIOS Boot, 才可以正常启动。
fdisk 或者 gpartd 什么的都行
fdisk -l
格式化文件系统
mkfs.vfat -F 32 /dev/vda1
mkfs.btrfs -L archroot /dev/vda2
挂载btrfs root, 在其中创建子卷.
mount /dev/vda2 /mnt
创建子卷
btrfs su cr /mnt/@
卸载 btrfs 的 root 卷
umount -R /mnt
分别挂载创建的子卷 和 uefi 分区
mount -t btrfs -o subvol=@ /dev/vda2 /mnt
mkdir -pv /mnt/boot
mount /dev/vda1 /mnt/boot
检查下挂载的和分区什么的是不是符合预期.
lsblk -f
配置livecd软件repo地址, 准备开始安装.
reflector --country='china' > /etc/pacman.d/mirrorlist
pacstrap 安装内核, 基本文件系统, 固件, 常用软件,大概能想起来的就这么多.
pacstrap -K /mnt base linux linux-firmware vim htop wget curl btrfs-progs fastfetch openssh sudo containerd nerdctl zstd ttf-jetbrains-mono-nerd tree ranger ncdu mtr fish eza util-linux fzf bat xfsprogs alacritty git
pacstrap -K /mnt base linux linux-firmware vim htop wget curl btrfs-progs fastfetch openssh sudo containerd nerdctl zstd ttf-jetbrains-mono-nerd tree ranger ncdu mtr fish eza util-linux fzf bat git xfsprogs neovim grub cloud-init dnsmasq
生成fstab, 需要编辑一下, 修改里面不合理的内容参数.
genfstab -U /mnt >> /mnt/etc/fstab
chroot 切换 根文件系统
arch-chroot /mnt
编辑字符集, 文件里面写英语字符, 偷懒
vim /etc/locale.gen
en_US.UTF-8 UTF-8
locale-gen
编辑 mkinitcpio 的配置文件, 按需改, 必须 ec2 可能会需要 ena 什么的….
vim /etc/mkinitcpio.conf
mkinitcpio -P
更改一下root用户的密码.
passwd
系统配置一些七七八八的命令和步骤, 方便复制。
╰─>$ passwd
╰─>$ useradd -m hayden
╰─>$ passwd hayden
╰─>$ chsh -s /usr/bin/fish root
╰─>$ chsh -s /usr/bin/fish hayden
╰─>$ visudo
╰─>$ vim /etc/mkinitcpio.conf
╰─>$ cat /etc/mkinitcpio.conf
MODULES=(ena)
COMPRESSION="zstd"
MODULES_DECOMPRESS="yes"
╰─>$ mkinitcpio -P
╰─>$ lsinitcpio /boot/initramfs-linux.img | grep ena
╰─>$ lsinitcpio /boot/initramfs-linux.img | grep nvme
╰─>$ cat /boot/loader/entries/arch.conf
title Hayden Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options root=UUID=4a203946-565e-4cce-b5db-fb149ca0f7c0 rootflags=defaults,rw,subvolid=5 console=ttyS0 earlyprintk=serial,ttyS0,keep
╰─>$ sync
╰─>$ grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
Adding boot menu entry for UEFI Firmware Settings ...
done
╰─>$ sudo systemctl enable cloud-init sshd systemd-networkd systemd-resolved
Created symlink '/etc/systemd/system/cloud-init.target.wants/cloud-init.service' → '/usr/lib/systemd/system/cloud-init.service'.
Created symlink '/etc/systemd/system/multi-user.target.wants/sshd.service' → '/usr/lib/systemd/system/sshd.service'.
Created symlink '/etc/systemd/system/dbus-org.freedesktop.network1.service' → '/usr/lib/systemd/system/systemd-networkd.service'.
Created symlink '/etc/systemd/system/multi-user.target.wants/systemd-networkd.service' → '/usr/lib/systemd/system/systemd-networkd.service'.
Created symlink '/etc/systemd/system/sockets.target.wants/systemd-networkd.socket' → '/usr/lib/systemd/system/systemd-networkd.socket'.
Created symlink '/etc/systemd/system/sysinit.target.wants/systemd-network-generator.service' → '/usr/lib/systemd/system/systemd-network-generator.service'.
Created symlink '/etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service' → '/usr/lib/systemd/system/systemd-networkd-wait-online.service'.
UEFI+GPT安装 Bootloader, 我懒了, 直接用 systemd-boot 了, 挺好用的.
bootctl install
systemctl enable systemd-boot-update.service
创建一个 bootloader 新的启动项.
vim /boot/loader/entries/arch.conf
title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options root=UUID=2538f94c-df39-43e5-be97-8a2bc7cd2f44 rootflags=subvol=@ rw
检查启动配置文件是否存在异常.
╰─>$ bootctl list
开一些服务的自动启动
╰─>$ systemctl enable sshd
## BIOS+GPT
```bash
grub-install /dev/nvme2n1
vim /etc/default/grub
GRUB_TIMEOUT=1
GRUB_DISTRIBUTOR="Hayden's Arch"
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 console=ttyS0 earlyprintk=serial,ttyS0,keep transparent_hugepage=never"
检查没 ...
DockerFile笔记
Dockerfile的书写规则及Dockerfile的指令说明。
Docker的镜像存储到Overlay2
Docker images ls
# 查看所有的Docker Images
Docker exec -it Container_Name /bin/sh
# 将容器启动并执行shell命令行
Docker Images
Docker Images中有启动容器所需要的文件系统及内容,用于启动并创建Docker容器,采用分层机制,最底层为bootfs,之上是rootfs
rootfs:Docker的根文件系统,由Kernel挂载为“ReadOnly”模式,而后通过联合挂载技术额外挂在一个可写层
bootfs:用于系统引导的文件系统,包括bootloader及kernel,容器启动之后自动卸载
Docker Images Layer下层的镜像称为父镜像,最底层的叫做Base Images
Aufs - Advanced multi-layered unification filesystem
Overlayfs - 3.18版本被合并到Linux内核
Docker的分层镜像,除了Aufs,还支持btrfs,devicemapper和vfs
Docker Registry - Docker daemon自动视图从DockerHub拉取镜像文件
Docker Registry的分类
Sponsor Registry:第三方,提供给客户或Docker社区
Mirror Registry:第三方,只给客户使用
Vendor Registry:由发布Docker镜像的供应商提供
Private Regisry:通过设有防火墙及额外的安全层的私有实体提供
云原生 - 面向云环境的运行了云系统本身的调用的程序。通过环境变量进行配置
Webhooks - 自动创建镜像
Quay.io 除了DockerHub其他的镜像仓库
docker pull quay.io/coreos/flannel:latest
Docker镜像的保存与恢复docker save -o myimages.gz IMAGE_NAME1 IMAGE_NAME2
# 将多个镜像保存到本地压缩文件
scp myimages.gz
# 传输镜像到其他节点
docker load -i myimages.gz
# 在新的节点加载镜像
Docker FileDockerFile存在的意义docker exec CONTAINER –> vi –> RELOADDocker的容器不利于我们对需要反复调试的服务进行更改,通过Dockerfile的修改可快速调整容器的配置。
自定义镜像的方法基于Docker容器制作镜像
创建你需要的容器,Docker commit命令进行镜像的制作
docker run –name b1 -it busybox
mkdir -p /data/html
vi /data/html/index.html
docker commit -p b1
docker tag IMAGE_ID REPOSITORY:TAG
docker image ls
docker image rm IMAGE_TAG
docker imspect – cmd字段自动标志启动自动运行的命令
更改docker的默认运行命令
docker commit -p -a ‘Liarlee’ -c ‘CMD [“/bin/httpd”,”-f”,”-h”,”/data/html”]’ b1 hayden/httpd:v0.2
docker login -u USERNAME 登录到服务器
docker push Liarlee/httpd
基于DockerFile制作DockerImageDockerfile Format
# 开头的为注释文字
INSTRUCTION arguments,采用指令+参数的格式
Dockerfile执行的时候是从上至下执行的
第一个非注释行必须是FROM指令
.dockerignore文件路径记录,可以通配,打包时忽略list中的文件可以使用环境变量替换BASH SHELL:echo ${NAME:-tom} 给一个变量设置一个默认值echo ${NAME:+tom} 如果变量有数值,强行改为默认值
- FROMFROM指定的镜像将自动拉取作为底层的镜像进行制作;
FROM <repository>[:tag]
FROM <repository>@<HASH number>
EXAMPLE:
FROM centos:latest
# 使用Centos的最新发行镜像作为底层镜像
- MAINTAINER提供制作人的信息,废弃不用了,现在使用LABEL
MAINTAINER "LiarLee<Test@LiarLee.com>"
- LABELLABEL是给镜像指定元数据的命令
LABEL maintainer="LiarLee<Test@LiarLee.com>"
- COPY复制本地文件或目录到镜像文件系统中。
COPY \<src> ... \<dest>
COPY ["\<src>" ... "\<dest>"]
\<src> -- 相对路径
\<dest> -- 绝对路径
- 指定的src目录,会将目录下的所有文件复制到目的地,但是不会将src复制。
- 如果使用了多个src,或者src使用了通配,目的必须是个目录
- 如果dest不存在会被自动创建
COPY /etc/passwd /etc/passwd
# 与cp命令相似,复制本地目标文件到容器文件系统中
COPY /usr/local/src/nginx/* /usr/local/src/nginx/
# 如果目标目录不存在需要先行创建
Docker Build命令[root@Hayden test]# docker build -h
Flag shorthand -h has been deprecated, please use --help
Usage: docker build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile
Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
--build-arg list Set build-time variables
--cache-from strings Images to consider as cache sources
--cgroup-parent string Optional parent cgroup for the container
--compress Compress the build context using gzip
--cpu-period int Limit the CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit the CPU CFS (Completely Fair Scheduler) quota
-c, --cpu-shares int CPU shares (relative weight)
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
--disable-content-trust Skip image verification (default true)
-f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile')
--force-rm Always remove intermediate containers
--iidfile string Write the image ID to the file
--isolation string Container isolation technology
--label list Set metadata for an image
-m, --memory bytes Memory limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable
unlimited swap
--network string Set the networking mode for the RUN instructions
during build (default "default")
--no-cache Do not use cache when building the image
--pull Always attempt to pull a newer version of the image
-q, --quiet Suppress the build output and print image ID on success
--rm Remove intermediate containers after a successful
build (default true)
--security-opt strings Security options
--shm-size bytes Size of /dev/shm
-t, --tag list ...
Fedora开机启动速度的优化
一直认为我的虚拟机性能不够所以导致自己的机器开桌面环境,开机慢慢慢慢慢慢…….今天终于发现了原因…..
过程使用systemd-analyze 命令使用systemd-analyze blame 命令罗列所有的启动的服务和耗时
我的机器耗时间最长的是
dnf-makecache.service 占用了 1min 8.124s;
plymouth-quit-wait.service 占用了 1min 744ms
配置所以关闭它,阻止今后开机的时候启动
systemctl disable dnf-makecache.service
systemctl disable dnf-makecache.timer
或者就直接把这个服务指向 /dev/null 也是可以的, 总体来说就是让他开机的时候不要继续启动。
systemctl mask dnf-makecache.service
systemctl mask dnf-makecache.timer
systemctl mask plymouth-quit-wait.service
systemctl mask firewalld.service
尽量不使用DHCP使用固定的IP可以提高启动速度,其他的不需要服务可以自行关闭即可
优化后的结果[root@localhost ~]# systemd-analyze
Startup finished in 3.091s (kernel) + 1.669s (initrd) + 5.211s (userspace) = 9.971s
[root@localhost ~]# systemd-analyze blame
2.868s vmware-tools.service
1.317s lvm2-monitor.service
1.115s dev-mapper-fedora\x2droot.device
1.044s fwupd.service
865ms NetworkManager-wait-online.service
834ms systemd-udev-settle.service
794ms dracut-initqueue.service
715ms udisks2.service
566ms sssd.service
533ms initrd-switch-root.service
443ms abrtd.service
404ms systemd-udev-trigger.service
326ms systemd-journal-flush.service
280ms ModemManager.service
259ms libvirtd.service
251ms polkit.service
209ms chronyd.service
199ms NetworkManager.service
192ms systemd-vconsole-setup.service
164ms accounts-daemon.service
149ms user@42.service
146ms systemd-udevd.service
143ms dracut-cmdline.service
137ms dracut-pre-pivot.service
137ms systemd-tmpfiles-setup-dev.service
134ms systemd-sysctl.service
131ms packagekit.service
124ms gssproxy.service
119ms fedora-readonly.service
116ms lvm2-pvscan@8:2.service
111ms user@0.service
110ms avahi-daemon.service
105ms auditd.service
105ms dmraid-activation.service
101ms gdm.service
86ms systemd-user-sessions.service
71ms fedora-import-state.service
65ms initrd-parse-etc.service
58ms upower.service
51ms systemd-logind.service
47ms var-lib-nfs-rpc_pipefs.mount
47ms systemd-fsck@dev-disk-by\x2duuid-e37f7ce7\x2d367b\x2d4e28\x2d8c1e\x2d3b98d1e4d441.service
46ms systemd-journald.service
45ms systemd-tmpfiles-setup.service
44ms boot.mount
41ms home.mount
41ms wpa_supplicant.service
40ms dev-hugepages.mount
37ms nfs-config.service
35ms plymouth-read-write.service
33ms rpc-statd-notify.service
30ms systemd-remount-fs.service
30ms systemd-fsck@dev-mapper-fedora\x2dhome.service
27ms geoclue.service
27ms cups.service
26ms colord.service
24ms livesys.service
23ms rtkit-daemon.service
22ms dracut-pre-udev.service
21ms dev-mqueue.mount
21ms dracut-shutdown.service
20ms sysroot.mount
20ms switcheroo-control.service
20ms plymouth-start.service
19ms plymouth-switch-root.service
19ms kmod-static-nodes.service
16ms dev-mapper-fedora\x2dswap.swap
16ms initrd-cleanup.service
15ms systemd-fsck-root.service
13ms livesys-late.service
10ms sys-kernel-debug.mount
6ms systemd-update-utmp-runlevel.service
6ms initrd-udevadm-cleanup-db.service
6ms systemd-update-utmp.service
6ms systemd-random-seed.service
5ms tmp.mount
2ms sys-kernel-config.mount
可以通过命令查看systemd的一些信息:
systemctl --failed # 查看所有启动或者运行失败的服务
systemctl status # 查看系统启动之后的所有Service 以及状态
Mark Tips
axel dnf可用的多线程更新
yum-fastestmirror 自动挑选最快的服务器更新
附加一个systemd的使用教程:- ClickThisLink
附加一个plymouth的教程:- ClickThisLink