系统概况: host 和 guest 都是用的 Ubuntu Server 16.04系统。 我的 host 机上有三块网卡2块有线网卡(接口 enp1s0 和 enp3s0)和1个无线网卡(接口 wls2s0)。 我的 host 机通过无线网卡连在一个路由器上,并因此能够连接到互联网,所在的网段是192.168.3.0\24,ip 固定为192.168.3.5。 其他两块有线网卡没有连接。 实验0: 效果: guest 与 guest、guest 与 host 之间可以互相 ping 通;guest 不能访问 host 所在路由器网段(192.158.3.0\24)。 方案: 在 host 中搭建了一个虚拟网桥,将 qemu-bridge-helper 工具在启动虚拟机时创建的虚拟网络接口 tap0[1,2…] 与 host 桥接在一起,我手动配置了他们的网段是192.168.4.0\24。 步骤: 1.配置 host 的 /etc/network/interfaces ,在其中加入以下内容,然后通过 /etc/init.d/networking restart 重启服务来创建网桥。 auto br0 iface […]

http://stackoverflow.com/questions/330793/how-to-initialize-a-struct-in-accordance-with-c-programming-language-standards 在内核中fs/ext3/indoe.c中,一个struct初始化格式个这样的: static const struct address_space_operations ext3_writeback_aops = { .readpage = ext3_readpage, .readpages = ext3_readpages, .writepage = ext3_writeback_writepage, .write_begin = ext3_write_begin, .write_end = ext3_writeback_write_end, .bmap = ext3_bmap, .invalidatepage = ext3_invalidatepage, .releasepage = ext3_releasepage, .direct_IO = ext3_direct_IO, .migratepage = buffer_migrate_page, .is_partially_uptodate = block_is_partially_uptodate, .error_remove_page = generic_error_remove_page, }; 我以前没见过这种形式,于是查了一下,原来这是属于C99的“新”特性。 初始化 对于最初(C89)一般形式的struct初始化,需要在大括号中按照成员顺序初始化,和初始化数组很类似;而C99支持乱序初始化,只要给出初始化的变量名,并且在前面加点,后边加等号即可。下面举例和c语言中一般形式的初始化结构体对比:

最近在实验室学习,chrome竟然称为了我使用的主要工具,不论是看博客或是看一些文档、论坛都离不开浏览器。chrome浏览器非常好用,通过登录google账号,可以同步设置、书签甚至插件。这里推荐几个我用的Chrome插件,能提高工作效率,大家根据名字都能搜到。 Octotree 可以在显示github网页左侧显示类似工程目录的侧边栏。 OneTab 可以一键将暂时没看完的标签收集起来,有时间(内存)时可以一键展开重新加载。 Tab Split 可以一键将标签栏的标签分开成两个窗口,防止标签太多开不清标题。 Vimium 可以用类似Vim的快捷键操纵浏览器。可以基本告别鼠标了。。。 # 我的Vimium按键映射配置 map <c-f> scrollFullPageDown map <c-b> scrollFullPageUp map <c-h> goBack map <c-l> goForward map <c-j> scrollLeft map <c-k> scrollRight map h previousTab map l nextTab map o Vomnibar.activateInNewTab map O Vomnibar.activate # 我的Vimium搜索引擎配置 w: http://www.wikipedia.org/w/index.php?title=Special:Search&search=%s Wikipedia b: http://www.baidu.com/s?wd=%s&ie=utf-8 Baidu t: http://s.taobao.com/search?q=%s taobao s: https://scholar.google.com/scholar?hl=zh-CN&q=%s […]

(发布于 April 3, 2013, 意译于12/9/2016) 原文链接 :https://lwn.net/Articles/545244/ 另一个版本的翻译(有些句子没有翻): http://kernel.taobao.org/index.php?title=%E5%86%85%E6%A0%B8%E6%9C%88%E6%8A%A52013-04#In-kernel_memory_compression 吐槽 : 我的天呐!!翻译完我才发现有人翻译过了,早知道我就不自己翻译了,痛苦死我了。。 PS :内容我还没有完全理解,仅供参考,以原文为准。 阿姆达尔定律告诉我们一个计算机系统肯定存在一个瓶颈。历史上,对于很多工作负载这个瓶颈都是cpu,所以人们在不断提升cpu性能。所以现在,渐渐地,ram成为了瓶颈。有时当数据在ram和disk之间来回传递时,cpu就在一边干瞪眼呢。增大ram有时并不是一个好的或者经济的做法,更快的I/O或者ssd可以缓解问题,但是不能消除这个瓶颈。 如果可以增大ram中数据的有效容量,不是很好吗?既然cpu闲置,也许我们可以拿闲置的cpu周期来专注这件事。这就是内核内压缩的目标:用闲置的cpu周期来做ram中的压缩和解压缩。 算上刚刚发布的zswap,现在有3个内核内实现的压缩方法在被建议merge到内核的内存管理(memory management, MM) 子系统:zram, zcache和zswap。乍一看可能会让人觉得一个就够了吧,但是他们三个却有很大的不同,可能面向着不同的用户群。所以就像现在内核中存在很多文件系统一样,有一天内核中也会存在多种压缩方案吧,不过这还得李纳斯大神和主要的内核开发者说了算。。。为了方便说明,本文把这些方案统称“zproject”,并对比了这些方案。我们先说明一些关键原则和压缩遇到的挑战。然后我们会从三个层次说明并详细地阐释这些zprojects设计上的不同选择,之后我们还讨论zprojects怎么和内核其他部分交互,最后给出结论。 压缩基础 要让压缩在内核中工作,内核必须把字节序列放入内存中再压缩,之后内存中也应保有压缩后的版本,以备这些数据被再次使用。压缩状态下的数据不能被读写,所以对压缩版本的数据再进行解压缩后才能继续读写这些数据。 字节序列压缩多少都可以,但还是以一个固定大小的单元压缩较方便。贯穿整个内核的一种基本的存储单元是page,一个page由PAGE_SIZE个字节组成,通常的linux支持的架构中,page的大小是4KB。如果这个page对准了PIGE_SIZE的地址分界,那么它就被称为page frame。对于每个page frame,内核在ram中都有相应的struct page结构。所有这三个zprojects都用page作为压缩的单元,并且通过开辟和管理page frames来存储压缩页。 有很多可用的压缩算法,但总的来说,高压缩比意味着高cpu周期,运行的快的算法一般压缩比较低。在时间效率和压缩率之间做出权衡很重要。这三种zprojects,默认都使用内核lib/文件夹中的LZO(1X)算法,这种算法做出了很好的权衡。然而,算法的选择还是很灵活的,也许cpu运行的算法还会被一些特殊架构的硬件压缩引擎取代呢。 一般,存在一些数据一会儿压缩一会儿解压缩的循环,数据序列大概和序列中的字节数成正比。因为页比较大,页压缩和解压缩都是很昂贵的操作,所以我们希望限制这些操作的数量。因此我们必须谨慎的选择哪些页要被压缩,尽可能找到那些可能会被再次用到同时最近不会用的页,以免把cpu时间浪费在重复的压缩然后立刻又解压缩上。因为压缩页不能直接访存某个字节,我们必须要保证内核清楚地辨识出哪个是压缩页,避免对压缩页中的字节尝试cpu的线性地址操作,同时保证压缩页可以被找到并可以在被访问时解压缩。

我发现。。shell脚本貌似不像C或者Python一样自带注释语法,不过拐弯抹角还是有一些方法的。。囧 方法1:利用逻辑语句 利用了逻辑语句的执行顺序,缺点是注释中不能出现括号,否则会报错! ###逻辑或前如果为真,后边的语句块自动不执行 #1 :||{ 注释内容… } #2 ((1))||{ 注释内容… } #3 true||{ 注释内容… } ###逻辑与前如果为假,后边的语句块自动不执行 #4 ((0))&&{ 注释内容… } <!–more–> #5 false&&{ 注释内容… } 方法2:利用Here Documents语法 利用了shell脚本的here documents的语法,注意<<后边是自己命名的,做到前后呼应即可,如下为两例,但是我测试的几种命名只有例1中的方法没有什么缺点,在例二或者其他命名中,如果出现反单引号`则可能会报错! #e.g. 1 :<<” 注释内容… ” #e.g. 2 :<< BLOCK 注释内容… BLOCK 方法3:利用sed命令 如果是使用vim编辑,利用sed语法,vim中的normal模式下: #全文注释: :0,$ s/^/#/ #m到n行注释: :m,n s/^/#/ #全文去注释: :0,$ s/^#// #m到n行去注释: :m,n s/^#// […]

最近由于需要实现从一个客户端电脑定时远程上传图片到阿里云服务器的功能,需要实现SCP的免密码传输。所以查资料并做了一个记录,希望对大家有帮助。 步骤 1.Client上某用户执行ssh-keygen命令,生成建立安全信任关系的证书 ssh-keygen -b 1024 -t rsa 这里如果~/.ssh/id_rsa.pub 已经存在,说明以前已经生成过,可以直接跳过这步。 2.将公钥证书id_rsa.pub内容复制到Server某用户的~/.ssh/authorized_keys目录中 ## 方法1 scp -p ~/.ssh/id_rsa.pub [username]@[server_ip]:[user_home]/.ssh/authorized_keys ## 方法2 client: cat ~/.ssh/id_rsa.pub #然后复制它 server: vim ~/.ssh/authorized_keys #然后粘贴保存 3.使用方法 #已经不需要输入密码 #比如ssh登录: <!–more–> ssh [user_name]@[ip_address] #再如scp传输文件: scp [path_to_file] [user_name]@[ip_address]:[dir_path]

刚想玩玩kvm,结果分不清这几个命令。。搜了一下,记录下来,希望对大家有帮助。 摘抄 1 在老版本中有单独的qemu-kvm模块存在,结合qemu一起做虚拟机工作。在后续新版本中,已经将qemu-kvm模块完全合并到qemu中去。因此当需要使用kvm特性时候,只需要qemu-system-x86_64 启动命令中增加参数 –enable-kvm参数使能即可。 (http://blog.csdn.net/tantexian/article/details/41281171) 2 I asked the mailing list, here’s what I got: qemu-arch like /usr/local/bin/qemu-x86_64 is for running a program of that arch on the host machine of what ever arch, but not a virtual machine qemu-system-arch like /usr/local/bin/qemu-system-x86_64 is for running a system of that arch on the host […]

这是我学习sed的一个总结,只限于自己和比我水平低(就是没接触过)的同学看。。。除了参考资料,讲解也包括很大成分的个人理解,如果发现错误,希望大家可以提醒我及时更正,谢谢~! sed概述 sed是一个流编辑器,更准确的说是一个行编辑器,就是sed处理文本处理命令用于逐行处理文本中的文字。 这是sed命令的格式: sed [options] [commands] [input-file] 就是说sed命令一般由“sed”、选项、命令和待处理文本文件组成。 举个例子: 对于文本test.txt: this is the first line. the 2nd line. hello, this is the 3rd line. 命令sed -n ‘/hello/p’ test 就会产生以下输出: hello, this is the 3rd line. 其中-n选项表示屏蔽sed默认输出。单引号中/hello/表示匹配带有”hello”的行p代表打印所匹配的行。 sed执行的流程 读取一行到模式空间缓冲区

常用git,做个记录,方便查询,利人利己,如有错误,欢迎指正~ 创建仓库 git init 创建仓库 git clone xxx.git(远程库的地址) 克隆一个远程仓库 git remote add origin xxx.git(远程库的地址) 指定一个远程仓库地址,命名为origin 提交更改 git rm file_name 删除文件 git add file_name 添加文件到仓库暂存区(index) git commit -m “xxx” 提交更改给仓库 git commit -am “xxx” 上两条的终极合体,添加所有已追踪文件的更改到暂存区,并提交 git log 显示提交日志 git status 显示当前仓库状态 git push [-f] [remote_name] [branch_name] 上传到远程仓库,加-f表示强制覆盖远程仓库的上传(要谨慎)

由于网上很多配置wifi的方式在我的伽利略开发板上都行不通,最后终于找到这个可以用的“冷门”办法: 系统配置 开发板: Intel Galileo gen2 无线网卡:PCI-e intel wifi link 5100 开发板系统: EGLIBC based Linux(download) 所用工具 硬件: usb无线网卡或者pci-e接口的无线网卡。 (注意如果你用的是和我一样的pci-e网卡,注意顺便买来天线接上,不然信号贼弱,这种网卡不接天线是不行的。) 软件: comman(开发板的完整版linux已经内置) 参考: 《connman百度百科》( http://baike.baidu.com/link?url=3C6RQqswxVvGMxNy7XA1-bWUBU6W0G7_Rvvsv2DRyv04nontgZ9oX7MRgeeNvMuRmjRMqf75_tqspSgjhb8Ysa )