分类: Linux

  • 记录几个git的知识点

    git

    我们项目用svn比较多,最近在做一些git的尝试,之前对git一知半解,属于能用但不太懂,仔细看下来确实git比svn复杂不少。

    rebase和merge的差异

    参考文章:

    1. https://blog.csdn.net/u010698107/article/details/129000177
    2. https://dingjingmaster.github.io/2022/05/0002-rebase%E4%B8%8Emerge%E7%9A%84%E5%8C%BA%E5%88%AB/

    是用git的开发方式通常是这样:
    file
    从master分支拉取一个自己的开发分支,然后自己会开发对应的内容,开发完成之后通常其他人也对master进行了提交,这个时候就会出现这样的分支情况:
    file
    我在feature分支肯定不能直接提交在master分支上了,这里就有两个思路,一个是把master最新的两个提交C3, C4也merge到C6这里,进而产生一个新的提交,如下所示:
    file
    这就是merge,但是对于git我们通常不这么干,我们通常做的事情是rebase,即将c3, c4的提交插入在C5之前:
    file

    上面这就是rebase和merge的差异。
    但是有一个很重要的协作法则,rebase不要用在公共协作分支上。如第二篇参考文章中提到的,如果我rebase了一个公共分支之后,其他同学在这个分支上也有提交,那么彼此之间就需要大量的merge而且混乱,那不如直接merge。

    pull和fetch的差异

    简单地说git pull包含了git fetch && git merge。
    git fetch主要是为了从远程仓库获取最新的代码,例如将仓库的代码拉到origin/master中,这个操作不会影响本地分支,通常git fetch之后还要做一些其他的工作,例如rebase,merge之类,所以开发了一个简化的指令pull。

    git pull就基本上是等价于快速地进行一次合并,所以默认行为是merge,可能需要手动处理冲突,同时也可以在pull中使用–rebase参数将merge操作改成rebase操作:

    git pull origin master  # 相当于git fetch origin master + git merge origin/master current_brance
    git pull --rebase origin master # 相当于 git fetch origin master + git rebase master

    所有参考文章:

    https://blog.csdn.net/u010698107/article/details/129000177
    https://dingjingmaster.github.io/2022/05/0002-rebase%E4%B8%8Emerge%E7%9A%84%E5%8C%BA%E5%88%AB/#git-rebase-%E5%8E%9F%E7%90%86
    https://cloud.baidu.com/article/3318148

    End。

  • Linux库静态替换解析:为什么覆盖动态链接库so会导致进程闪退

    总结

    遇到一个这样的问题,我最近把公司git ci自动化的流程向更先进的开源社区的方式推进了一点,我们修改了服务端so库,将新编译的so用cp指令覆盖掉旧的so会直接导致所有进程闪退。

    但是我们发现先rm旧的文件,再复制新的文件不会导致闪退,这个就非常纳闷了,处于不理解和好奇就深入研究了一下,最终总结是这样:

    这个闪退应该是分了几个流程:

    1. 加载so的时候是把整个so用文件映射到内存里,然后利用文件系统的lazy_load读内存
    2. cp的时候会复用旧的inode,操作系统对这个文件的索引会被改变
    3. 程序读取到原来没有的函数就会触发系统的load,然后去对应的偏移量读对应的block
    4. 闪退

    rm不闪退是因为:

    1. 旧的so因为还被引用(记录在INode上),所以不会立马删除对应的block
    2. 新的so会使用新的inode
    3. 程序中断读取文件的时候,会读取到旧文件的数据

    内核中mmap对应的结构:
    file

    可以看到其中有一个struct file表明一个打开的文件套接口,进一步看这个接口是这样:
    file
    整体的脉络相对就理清楚了。

    扩展:链接库

    众所周知,一般库文件会分为两种,静态库和动态库。

    静态库是在编译时将库的代码打包成。a文件,最终链接到可执行文件中。

    动态库在编译时需要开启-fPIC开启内存无关的编译方式编译成so文件,在程序运行时动态加载。

    静态链接库,它会伴随可执行文件运行被加载,它已经被ld链接器把库和执行文件放在一起了,我们将ELF文件映射到相应的运行地址,然后将PC寄存器指向entry即可。

    动态链接库的加载过程就比较复杂,可以看参考[7]文章的内容,讲的非常细致,简单地说动态链接库是真的动态,100个进程共用一个动态链接库,这个库在内存中实际占用的大小也只有一份。
    它在内核中的实现是按照制度的方式映射同一个文件中的部分(如动态代码段),这个过程中会创造引用计数。

    非常详细的解释可以读参考[7]!!!

    参考文章

    [1], https://cloud.tencent.com/developer/article/1040842
    [2], https://www.linuxidc.com/Linux/2011-01/31622.htm
    [3], https://www.cs.toronto.edu/~simon/html/understand/node33.html
    [4], https://elixir.bootlin.com/linux/latest/source/include/linux/fs.h
    [5], https://zhuanlan.zhihu.com/p/401446080
    [6], https://zhuanlan.zhihu.com/p/287863861
    [7], https://blog.ideawand.com/2020/02/15/how-does-linux-shared-library-versioning-works/
    [8], https://blog.csdn.net/weixin_44966641/article/details/120631079

    End.

  • 文件系统对比 btrfs vs zfs

    btrfs vs zfs

    btrfs是一个支持写时复制的文件系统,同时zfs是另外一个也被广泛使用的文件系统。

    btrfs使用红黑树,zfs使用另外一套技术,zfs在大型机器上似乎是被广泛使用,处理大型文件的性能上优于btrfs,并且存储文件没有上限,btrfs文件数量上有上限,同时处理小文件更快。

    具体来说优劣势:

    btrfs在Linux内核直接有支持,内存使用更小

    zfs更适合大负载场景,支持数据自动还原,跨平台。

    btrfs vs ext4

    因为btrfs支持COW,所以在写入小文件时效率可能更低。相比ext4,btrfs更适用于需要快照、数据完整性检查和内置RAID等功能的高级用户。

    ext4是使用日志记录,在每次写入都会记录,虽然如此,但是ext4在日常使用效率比btrfs要好。所以如果对于快照和RAID支持没有需求的人应该选择Ext4。

  • Github搭建博客

    今天学习了一下在github上搭建博客,并且学习了一下git的基本使用。

    要复习高频就不细写了,参考了下面的一些资料:
    看到SSH, key的生成忽然就懂了git的安全验证的方式,再看完git的教程,发现git无非就是一个帮你保存任务的工具,其实实际上还是要自己进行版本控制,不过它给你提供了相当多的高效的指令。
    另外提两点,
    在安装jekyll的之前要安装nodejs和ruby-devel,ruby-devel不安装jekyll就会安装失败。nodejs是jekyll使用的服务器吧,虽然不知道为什么没安装它不能运行,但是就是要安装才行,我才可能是因为jekyll提供了假设本地服务器的功能,并且无论输入什么在打开之前都要初始化服务器设置,然后没找到noedjs就执行不了?
    不说多了,让我再犹豫一下用哪个博客。
    但因为之后要在实验室使用版本控制,需要学习的不仅是git的使用,还要假设git服务器,抽空再学习一下。
    今天就这样吧。

  • Fedora22 安装 搜狗输入法 (以及去除输入法的黑框)

    安装环境:Fedora 22 x86_64 LXDE桌面
    这两天因为安装搜狗,花了不少心思,用了些时间,麻烦的细节就不说了。
    学习了一些关于包管理和桌面系统的知识。

    安装步骤:

    添加Fedora中文社区的源:http://repo.fdzh.org/
    添加方法看网站右边。
    然后打开终端,切换到管理员输入:

    $dnf install sogoupinyin -y

    等一下应该就能装好,但是我并没有装好,应该是因为网络问题,然后就找到了他的包,在本地安装的。
    http://pan.baidu.com/s/1pJLxo9t 这里下载,解压之后找到sougoupinyin的rpm和opencc的rpm,用dnf安装就行。

    装好了之后就能用啦!
    但是!搜狗输入法总会在要输入的地方有一个黑色框框,好烦,到网上搜。
    发现原因是搜狗输入法会使用一个半透明的效果,但是lxde又没有开启半透明的效果,就变成黑色框框了。
    解决方法如下:

    $dnf install xcompmgr

    安装之后在用户跟目录下~/.config/autostart/里面创建一个文件:

    $vim xcompmgr.desktop

    输入:

    [Desktop Entry]
    Type=Application
    Name=Sample X Compositing manger
    Exec=xcompmgr
    NoDisplay=false
    Terminal=false
    OnlyShowIn=LXDE

    就能解决问题啦。

    正文:
    Fedora竟然出了中文源,里面有各种Fedora不好弄得东西,比如Chrome,只有deb的安装包搜狗输入法,Firefox的Flash……还有一些豆瓣FM,百度云,迅雷,有道词典什么的,真是很棒呢!!!
    但是源似乎有问题,总会下载失败,应该是网络的问题,不是我这边设置的问题,希望快解决吧,不让每天升级的强迫症完成不了啊。

    另外,yum竟然被dnf替代了,以后dnf不好搜啊,和游戏同名了,哈哈哈哈。

    在找到正解之前,试了很多自动启动xcompmgr的方法,都不能解决:
    http://wiki.lxde.org/zh/%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8%E7%A8%8B%E5%BA%8F
    放在~/.bashrc里
    放在~/.xprofiles里
    大概是因为桌面的启动顺序的原因(还不太了解),自己在/etc里一个个找x开头的X开头的配置文件,在/etc/xdg/找到一个autostart,猜大概就是它了,但是这是给整个系统的,我想只给自己的用户,然后再~/.config/里找到autostart/然后就解决了这个问题 ~

    在放上dnf(和yum的指令基本一样)的常用指令和桌面系统的基本介绍:
    Yum指令:
    http://blog.csdn.net/astraylinux/article/details/7025761
    LXDE:
    https://wiki.archlinux.org/index.php/LXDE_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29#.E8.87.AA.E5.8A.A8.E6.8C.82.E8.BD.BD
    linux图形界面基本知识:
    http://blog.csdn.net/zhangxinrun/article/details/7332049

    学Linux还是要多自己动手多用搜索引擎呀 ~

    参考:
    http://tieba.baidu.com/p/3105969958
    http://os.51cto.com/art/201401/426464.htm
    (后来发现这里有直接的解决方法:)http://www.cnblogs.com/heimirror/p/3730108.html

  • [转]fedora15设置pdf文件的默认打开方式

    用fedora15已经很久了,但打开pdf文件一直默认都是用系统自带的文档查看器,虽然装了Adobe_Reader,但一直都无法设为默认的打开方式,因为属性里的打开方式没有这个选项,而且也无法像ubuntu样设置使用命令打开。无耐,我一直忍受着文档查看器无法匹配pdf的分辨率,因为每次我都会习惯地双击打开文件,而不是先点右键再选择打开方式,而且网上找了很久也没找到相关的资料。

  • 去掉wget烦人的 “eta(英国中部时间)” 提示

    我用Linux也有一两年的历史了, 一直以来都有一块心病困扰着我, 那是什么呢? 没错了, 就是标题所说的, wget有事没事就会自动刷新, 刷屏, 不停地重复输出那一行, 总是没有解决, 一直都是这个样子, 今天下Linux kernel 2.6.37的时候决心要去掉这个烦人的地方, 找了好久, 总算是找到了解决方案!! gentoo (MYSKY注: 对各个发行版都同样受用.) 里的 wget ,从1.12版本开始,就一直有个不影响功能的小毛病:由于中文翻译的失误,进度提示的时候,会被拉成很多行。原因就是原来英文的ETA这3个字母,被翻译成了 “eta(英国中部时间)” 这么长,所以引起断行出错。 zh_CN.po 里,其实还是有说明的,只不过翻译人员疏忽了。如下: #. TRANSLATORS: "ETA" is English-centric, but this must #. be short, ideally 3 chars. Abbreviate if necessary. #: src/progress.c:805 #, c-format msgid " eta %s" msgstr " eta(英国中部时间) %s" 既然这个小毛病不影响功能,之前也就没太在意,一直在等上游更新,不过到了 1.12-r1 版本,仍旧还有这个毛病,我也渐渐的看不下去了,就决定动手自己改掉它了。 方法也很简单,用之前我介绍过的命令就可以了,具体如下: msgunfmt /usr/share/locale/zh_CN/LC_MESSAGES/wget.mo -o - | sed 's/eta(英国中部时间)/ETA/' | msgfmt - -o /tmp/zh_CN.mo sudo cp /tmp/zh_CN.mo /usr/share/locale/zh_CN/LC_MESSAGES/wget.mo 搞定。

  • Fedora yum安装AdobeReader

    每次安装Linux我都有两个必装软件,一个是Chrome, 一个是AdobeReader,现在能用yum安装chrome了,这次试试安装AdobeReader,现下好了一个AdobeReader的rpm文件,然后用yum localinstall -y AdobeReader_chs-8.1.7-1.i486.rpm结果失败了,它说没有公匙,我就到网上到处找啊,到处找,终于找到解决方法了: [root@MYSKY ~]# rpm -ivh http://linuxdownload.adobe.com/adobe...0-1.noarch.rpm [root@MYSKY ~]#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux [root@MYSKY ~]#sudo yum install AdobeReader_chs 上面的第二步我是没有成功,但是一样的可以直接跳到第三步,yum在运行过程中会提示GPG keys没找到,然后将它找到成第二步,反正这样,以后yum update -y就能自动更新AdobeReader了..

  • Fedora 删除旧内核

    由于Fedora更新升级非常的频繁, 所以, 非常有必要清除陈旧的内核,方法如下:

    1. 查看当前系统中已安装的内核相关包: [root@knityster ~]# rpm -qa | grep kernel kernel-headers-2.6.32.12-115.fc12.i686 kernel-firmware-2.6.32.12-115.fc12.noarch kernel-PAE-devel-2.6.32.11-99.fc12.i686 kernel-devel-2.6.32.12-115.fc12.i686 kernel-PAE-2.6.32.11-99.fc12.i686 kernel-PAE-devel-2.6.32.12-115.fc12.i686 kernel-PAE-2.6.32.12-115.fc12.i686 kernel-devel-2.6.32.11-99.fc12.i686 abrt-addon-kerneloops-1.0.9-2.fc12.i686
    2. 查看当前使用的内核:
    [root@knityster ~]# uname -r 2.6.32.12-115.fc12.i686.PAE

    3. 确定要删除的内核:
    这里为:kernel-PAE-2.6.32.11-99.fc12.i686
    4. 删除内核:
    [root@knityster ~]# yum remove kernel-PAE-2.6.32.11-99.fc12.i686

    说明:
    不推荐网上到处抄来抄去的,直接使用: rpm -e 的方法删除内核包, 而是使用 yum remove 进行删除,
    因为使用yum remove删除, yum 会自动移除 : /boot/grub/menu.lst 中的相关启动项。

  • Linux 备份还原指令

    dump [-f 备份文件] 待备份资料
    -S #仅列出备份的话占用多少空间
    -u #将这次dump的时间记录到/etc/dumpdates
    -v #将dump的过程显示出来
    -j #使用bzip2备份,进行简单压缩(level 2)
    -level #dump备份的等级
    -f #类似与tar, 备份成的文件的名字
    -W #显示在/etc/fstab里面设置了dump的分区是否备份过

    restore #恢复dump的内容
    -t #显示含有什么数据, 类似与tar -t
    -C #比较实际数据和备份数据的差异
    -i #进入互动模式
    -r #还原文件系统(目录)到当前目录下