后山


  • 首页

  • 标签

  • 分类

  • 归档

CentOS 8 桌面系统配置小记

发表于 2020-08-16 |

背景

家里之前配了一个台式机,ms04 那样,amd 平台,CentOS 8。
在配置学习开发环境的过程中遇到了几个问题,记录一下。

桌面安装

安装 CentOS 8 自带的 gnome 桌面
sudo yum group install "Server with GUI"
修改桌面配置
vim /etc/gdm/custom.conf
日志位置
/var/lib/gdm/.local/share/xorg/Xorg.0.log

这里放一个整个桌面的架构图,对技术细节和历史感兴趣的同学可以看这本开源世界旅行手册。
image.png

桌面崩溃

由于个人也是第一次接触,所以只有三板斧,幸好解决了问题。
1。 彻底打不开
删除桌面后重新安装
sudo yum group remove "Server with GUI"
2。 重新安装后分辨率无法调整
xrandr 可以返回显示器支持的分辨率,如果报错,应该就是驱动出问题了。
这里就可以看出 amd 不够 yes 的点了,通用驱动页面没有 linux 的支持信息,最好在谷歌找准关键词搜。https://www.amd.com/zh-hans/support/kb/release-notes/rn-amdgpu-unified-linux-20-20 可以在这里下载到。

CentOS/Win10 共用磁盘格式化

为了提供一定的娱乐功能,我是装了双系统的。磁盘也计划用 NTFS 文件系统。

fdisk -l 列出所有硬盘
mkfs.ntfs -f -L data2 -v /dev/sdb1 将 /dev/sdb1 分区快速格式化为 NTFS 格式,打上 data2 标签
parted /dev/sdb mklabel gpt 将磁盘 /dev/sdb 以 GPT 格式建立分区表
parted /dev/sdb mkpart primary ntfs 4096s 100% 将磁盘 /dev/sdb 从第 4096 个 sector 开始到 100% 的空间划做一个分区
vim /etc/fstab 编辑自动 mount 设置

重要:

  1. 直接使用 mkfs.ntfs 对整个设备操作导致 Win10 不认盘,并且最大只有 1.7TB。
  2. 直接使用 parted 建立分区表后不进行格式化会导致开机直接进入 rescue 模式。
  3. 正确的方式是先 parted mklabel 建立分区表,然后 parted mkpart 进行分区,最后 mkfs.ntfs 进行格式化。这样就得到了一个可以 mount 的文件设备。

快捷键修改

不得不说 MacOS 的快捷键真的很舒服,常用的快捷键在各个软件里都是有实现并且基本统一的,而 gnome 里就各行其是,我常用的 terminal 和 chrome 就不一致。

理论基础 B 站 https://www.bilibili.com/read/cv5124452/ 这里讲的不错。
我这边不考虑 TTY,仅考虑 X11。

X11 层面

这个层面修改 keycode –> keysymbol,也就是说我把 Win 和 Alt 键互换的话,在桌面的所有应用里这两个键都算是换掉了。

安装 gnome-tweaks 可以很轻松完成这步修改。
重要: gnome-tweaks 必须在当前 X11 登陆用户下启动,否则会找不到 DBus。以下两个指令应该能够正常返回,否则说明启动用户不对。
gdbus introspect --session --dest org.gnome.SessionManager --object-path /org/gnome/SessionManager
gdbus introspect --session --dest org.gnome.Shell --object-path /org/gnome/Shell

组合键解释层面

我们得到了一组按键组合,这个组合具体含义是由各个应用进行解释的,很可惜这里改不了,我能做的只有以下两点。
1 在系统配置里将常用的快捷键删掉,避免和个人习惯冲突。
2 安装 autokey,写脚本配置每一个按键组合在每个应用映射到不同的组合里

以上操作可以达成不同应用使用同一个快捷键进行同一个操作,我最需要的就是在 terminal 和 chrome 里使用 MacOS 的复制和粘贴快捷键,这样就可以实现了。
重要: autokey 尽量使用系统包管理工具安装,如果官方包管理工具不支持,也要尽量使用系统的 python。部分 sitepackage 只有系统 python 解释器能够直接找到。

文件系统概述 —— 从 Time Machine 备份磁盘开始

发表于 2020-07-25 |

前言

本来以为要实现局域网自动备份很简单,网上有现成的方案:在 NAS 设备上安装 netatalk 提供 afp 协议服务,在 macOS 系统自动挂载,然后在 Time Machine 中配置。
下面三步都很简单,但是在配置 automount 的时候很艰难,一直报错。于是决心复习一遍 unix 系统的文件系统知识,研究一下最新的使用 NAS 配置 Time Machine 局域网备份的方法。

  • Netatalk>) 是一个 Apple Filing Protocol (AFP) 的开源实现。它为 Unix 风格系统提供了与 Macintosh 文件共享的功能。CentOS 系统服务端使用 yum install netatalk 轻松安装,修改配置文件重启。
  • 在 Finder 使用 Connect To Server 在界面上交互挂载。
  • 在 Time Machine 中配置。

Time Machine 备份磁盘介绍和本次配置目标

早期的系统仅支持 AFP 网络文件协议[1],但最新的官方支持文档[2]仅推荐了 SMB 网络文件协议。我这次选择按照最新推荐的协议进行配置。

要使用“时间机器”备份您的 Mac,您需要以下任一类型的储存设备:

  • 连接到 Mac 的外置 USB、雷雳或 FireWire 驱动器
  • 连接到 AirPort Extreme 基站 (802.11ac) 或 AirPort 时间返回舱的外置驱动器
  • AirPort 时间返回舱
  • 共享为“时间机器”备份目标位置的 Mac
  • 支持通过 SMB 进行“时间机器”备份的联网储存 (NAS) 设备

本次配置的目标是

许多第三方 NAS 设备支持通过 SMB 进行的“时间机器”备份。有关详细信息,请查看适用于您 NAS 设备的文稿。

  • SMB protocol version 3.x, including SMB 3.x signing。NAS 服务需要支持 SMB 3.x 。
  • Support for Bonjour discovery. NAS 服务需要支持 Bonjour discovery 。

Unix 文件系统架构简述

文件系统是从 Unix/类 Unix 操作系统层面进行的描述,自上而下可以分为以下几个层面。

操作系统标准——人机交互

Unix 的标准化包括 ISO C、IEEE POSIX(Portable Operating System Interface 可移植操作系统界面)、SUS(Single Unix Specification 单一 Unix 规范) 等。

image.png
标准约定了文件系统应该具备什么样的概念和功能,具体而言就是规定了有哪些系统例程以及相关参数。不关心具体的实现。

操作系统实现——系统与磁盘交互

不同的操作系统有不同的文件系统实现,不同的文件系统有不同的特性,影响到文件操作性能和数据安全。
同一个操作系统运行时可以同时挂载多个文件系统。

简单列举几种常见的实现。

  • NTFS:NTFS(英語:New Technology File System),是 Microsoft 公司开发的专用文件系统,Mac OS X 内核能对 NTFS 进行有限的读操作。Linux 和 BSD 提供自由及开放源代码的软件,可用于读写 NTFS 文件。
  • APFS:苹果文件系统(英語:Apple File System,APFS)是一个适用于 macOS、iOS、tvOS 和 watchOS 的文件系统,目前正在由苹果公司开发和部署。
  • XFS:XFS,一种高性能的日志文件系统,特别擅长处理大文件,同时提供平滑的数据传输。目前 CentOS 7 也将 XFS+LVM 作为默认的文件系统。
  • ext4:第四代扩展文件系统(英语:Fourth extended filesystem,缩写为 ext4)是 Linux 系统下的日志文件系统,是 ext3 文件系统的后继版本。

除了单文件大小,个人用户通常不会碰到其他文件系统的问题。大量的云平台遮蔽了文件系统之间的差异,软件开发工程师通常无需关心底层使用的是哪种文件系统,架构师需要关心各文件系统的性能及其他特性。

网络存储

这里所指的网络存储是指的不通过主板硬件接口连接存储设备,而是通过网络挂载的存储设备。

  • NFS:网络文件系统(英语:Network File System,缩写作 NFS)是一种分布式文件系统,力求客户端主机可以访问服务器端文件,并且其过程与访问本地存储时一样,它由昇阳电脑(已被甲骨文公司收购)开发,于 1984 年发布
  • SMB:伺服器讯息区块(Server Message Block,缩写为 SMB),又称网路文件共享系统(Common Internet File System,缩写为 CIFS, /ˈsɪfs/),一种应用层网络传输协议,由微软开发,主要功能是使网络上的机器能够共享计算机文件、打印机、串行端口和通讯等资源。
  • AFP:苹果归档协议(英语:Apple Filing Protocol,缩写 AFP)也称 Apple 文件协议、Apple 归档协议,以前称为 AppleTalk Filing Protocol,它是一个专有网络协议,并且是 Apple File Service(苹果文件服务,缩写 AFS)的一部分,为 macOS 和经典 Mac OS 提供文件服务。目前在苹果文件系统(APFS)中已弃用。
  • 对象存储:无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。不同的云厂商有不同的实现和产品名。

最后是集各种接口于一身的新一代分布式存储。Linux 通过 Samba+Avahi 搭建 Time Machine 服务image.png

磁盘驱动和实现

磁盘包括软盘、磁带、机械硬盘、SSD 等。
磁盘的驱动和实现由存储设备厂商负责,通常都已经集成到了操作系统中,即插即用,普通用户无需关心。

最新 NAS 配置方法

需要配置:

  1. samba:提供 SMB 服务
  2. avahi-daemon:提供 Bonjour discovery 服务

samba

安装 yum install samba
启动 systemctl start smb.service
配置 vim /etc/samba/smb.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[global]
# 下面两个属性为添加
min protocol = SMB2
ea support = yes

[tmbackup]
comment = macos time machine backup
path = 你的备份路径
browseable = yes
public = no
writable = yes
create mask = 0700
valid users = 授权用户名
# 加载模块以支持AAPL拓展,注意顺序很重要!
# catia: 兼容linux/macos中合法但在Windows/SMB中非法的字符
# fruit: 增强macos的的兼容性,并提供Netatalk AFP服务
# streams_xattr: 通过Linux文件系统提供Windows NTFS属性字段
vfs objects = catia fruit streams_xattr
# 支持aapl
fruit:aapl = yes
# 存储os x的元数据
fruit:metadata = stream
# 设置服务器在finder中的图标
fruit:model = MacPro
# 支持time machine,非常重要!
fruit:time machine = yes
# 文件清理的一些配置
fruit:posix_rename = yes
fruit:veto_appledouble = no
fruit:wipe_intentionally_left_blank_rfork = yes
fruit:delete_empty_adfiles = yes

avahi

Avahi 不需要配置。没错,直接启动就好了。

# systemctl enable –now avahi-daemon

其他

如果开启了防火墙,需要开启一下 mDNS 端口 5353,CentOS 8 的指令如下
firewall-cmd –zone=public –add-port=5353/udp

个人初次使用 TimeMachine 第一选择硬盘时,必须先在 Finder 挂载才能看到,之后就能够自动连接了。

参考资料

  1. OS X Lion: 您可以与 Time Machine 配合使用的磁盘 https://support.apple.com/kb/PH4327?locale=zh_CN
  2. 可与“时间机器”搭配使用的备份磁盘 https://support.apple.com/zh-cn/HT202784
  3. Linux 通过 Samba+Avahi 搭建 Time Machine 服务 https://blog.dazzyd.org/providing-time-machine-on-linux/
  4. 配置 samba 作为苹果电脑 time machine 的备份硬盘 https://tlanyan.me/setup-samba-as-time-machine-destination/

数据导出工具设计

发表于 2020-07-20 |

目标

根据导出参数,将目标系统中的数据生成导出文件

接口设计

命令/入口名

databox 数据工具箱

子命令

list 列举所有模块
show [module_name] 导出某个模块或所有模块的数据依赖图文本文件(mermaid 格式)到 ./graphs 目录
ripper company_code [module_name] 导出某个模块或所有模块的数据到 ./{company_code}_data 目录
clean company_code 清空公司的导出数据
stitcher dirpath [module_name] 恢复指定目录下的某个模块或所有模块的数据

技术方案

命令行参数解析 python-fire:
考虑可扩展性和界面友好性,应该使用 click。但是考虑到 python-fire 更省时间,故仍然使用 python-fire。

数据依赖图呈现 https://mermaid-js.github.io/mermaid-live-editor/:
语法上选择 mermaid,该语法既可以手写又可以代码生成。呈现上选择由命令行工具生成符合 mermaid 语法的文本文件,然后手动复制到在线编辑器中进行查看。
本地生成图片过于复杂耗时,本地 md 编辑器渲染字体过小,故弃而不用。

数据导出:
ripper 在待导出的系统环境中运行,共享同一套环境。
同一个模块的数据导出到同一个模块中。

倍市得数据层——数据存储类型介绍

发表于 2020-07-07 |

倍市得简介

倍市得按照模块划分了多个子系统(subsystem,有时与 system 混用),这些系统之间是独立的。
倍市得使用 CodeFactory 代码生成工具从思维导图生成每个模块的以下这些文件。

1
2
3
4
5
├── model_enums.py
├── model_handlers.py
├── model_utils.py
├── model_utils_test.py
└── models.py

生成的主要数据模型基本遵循数据库设计三大范式,因此从数据模型的角度既可以使用关系型数据库也可以使用非关系型数据库。
其他数据文件类型和地址也存在主要的数据模型中。

数据存储类型

主数据库 mongoDB

当前版本(2020-07-16)使用 mongo 作为主要的数据库。mongoDB 是目前市场占有率最高的 noSQL 数据库。
使用 mongoDB 版本为 v4.0.8,官方文档 https://docs.mongodb.com/。

官方提供的数据工具 https://docs.mongodb.com/v4.0/reference/program/:
mongodump 和 mongorestore :
优点是输出格式为二进制,较为节省空间
缺点是 oplog 不适用于部分导出的场景
重点参数:
–query 对每个表的数据进行选择性导出

mongoimport 和 mongoexport :
优点是输出的文件人类可识别,缺点是占用空间大

Redis

当前版本 redis-cli 4.0.10。官方文档 https://redis.io/。

用途包括:

  1. 用作缓存,这部分数据随意删除
  2. 用作 celery 的 broker backend
  3. 用作 mq 的消息队列
  4. 用作分布式 id 生成工具,如 seq
  5. 其他需要持久化的数据(暂不明确)

部分数据备份和恢复方式暂不明确。

OS filesystem

使用操作系统自带的文件系统进行存储

用途包括:

  1. 后端生成用由 nginx 直接代理的静态文件
  2. BI 数据文件,这部分数据有从数据库导出的也有用户上传的
  3. BI 缓存,这部分数据随意删除
  4. 其他(暂不明确)

OSS

当前默认使用的对象存储是阿里云的 OSS,其他云平台的对象存储有不同的名字。
对象存储,也称为基于对象的存储,是一种扁平结构,其中的文件被拆分成多个部分并散布在多个硬件间。
对象存储的优点是有分布式系统的可靠性和效率,集成 CDN,但按需付费,性价比高,缺点是写入文件无法修改,适用于不经常变化的文件。 常见的存储内容包括网站静态文件、历史日志等。

备份方式:
可以直接下载文件,恢复时再上传

也可以使用复制方法,等到恢复数据时直接从原始 OSS 处拷贝过来 https://help.aliyun.com/document_detail/31979.html?spm=a2c4g.11186623.2.10.7d3a4bb2VlcJfc#reference-mvx-xxc-5db

剑指笔记

发表于 2020-06-02 |

流程

电话面试:尽可能形象,敢于确认细节
共享桌面远程面试:理清思路、良好的代码风格、进行单元测试、调试能力
现场面试:

  • 行为面试:准备项目经验
  • 技术面试:基础知识、高质量代码、清晰的思路、优化效率的能力、优秀的综合能力
  • 提问环节:准备与职位或者项目相关的问题

基础知识

编程语言

概念理解
实现
空间、时间复杂度

  • 官方文档 https://docs.python.org/zh-cn/3.6/reference/
  • python cookbook
  • 流畅的 python

问题

个人对 Python 比较熟悉,以下均为 Python 分析解法

赋值运算符函数

1
2
3
4
5
6
7
8
9
10
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char *pData=NULL);//构造函数
CMyString(const CMyString& str);//拷贝构造函数
~CMyString();//析构函数
private:
char* m_pData;//数据域,字符指针
};

Python 支持操作符重载 operator overloading。
网上有人总结如下,一言以蔽之就是只能重载部分现有的运算符。

  • 不能重载内置类型的运算符
  • 不能新建运算符,只能重载现有的
  • 某些运算符不能重载 例如 is, and, or 和 not(不过位运算符&、|和~可以)

#todo: 研究元类、类创建过程中的微妙细节
正确性
异常安全性

实现 Singleton 模式

1
2
3
4
题目:设计一个类,我们只能生成该类的一个实例
扩展:定义一个 President 基类,从该类继承出的
FrenchPresident 和 AmericanPresident 等
类型都只能产生一个实例。

单例模式:单例对象的类必须保证只有一个实例存在。
思路:核心就是需要保存唯一的实例,并在第一次调用后找到该实例返回。

解法一:
利用导入模块只运行一次的特性,将该类写在一个 module 中,通过 import 该实例使用。
解法二:
使用装饰器,将该实例保存在该类的环境中。
解法三:
将该实例存在类的变量空间中
解法四:
使用元类,将该实例保存在元类的变量空间中

#todo: 熟悉类创建流程

#todo:学习设计模式

12…9
Hieast

Hieast

快速学习者,高校慕课平台深度使用者,专注于挖掘数据的价值。目前从事 Python 数据开发,自媒体数据采集、分析和应用相关工作。

44 日志
5 分类
32 标签
RSS
GitHub E-Mail
© 2016 — 2020 Hieast
主题 — NexT.Pisces