Skip to content Skip to main navigation Skip to footer

Linux

Linux:Ubuntu 14.04 下的MAC OS X 主题安装

安装 MAC OS X 主题会帮助你的 Ubuntu 14.04 看起来更像MAC OS X。在这里我们介绍的Macbuntu安装包包含了GTK 主题,这些主题是专门为ubuntu unity定制的。图标主题可以为ubuntu 14.04使用,包括登陆界面引导启动的背景,登陆用户,甚至包括了lightdm 使用webkit的登陆界面。这个安装包是nobslab在bluedxca93的帮助下从gnome-look.org网站上开发的。

最终效果图

Linux:Ubuntu 14.04 下的MAC OS X 主题安装
Linux:Ubuntu 14.04 下的MAC OS X 主题安装

files:

Linux:Ubuntu 14.04 下的MAC OS X 主题安装
Linux:Ubuntu 14.04 下的MAC OS X 主题安装

music

Linux:Ubuntu 14.04 下的MAC OS X 主题安装
Linux:Ubuntu 14.04 下的MAC OS X 主题安装

第一步:下载壁纸

预览图:

Linux:Ubuntu 14.04 下的MAC OS X 主题安装
Linux:Ubuntu 14.04 下的MAC OS X 主题安装

第一步要做的事仅仅是下载Mac OS X 的壁纸,下载连接在 这里这个压缩包的大小有39.2MB。 解压之后右键点击桌面->修改背景图片->选择下载的背景

安装主题修改工具

为了修改GTK主题,图标,系统主题,光标,字体我们需要安装unity tweak。要安装unity tweak在ubuntu14.04上通过使用如下命令:

sudo apt-get install unity-tweak-tool

当然你也可以通过安装ubuntu-tweak来实现主题更换

sudo add-apt-repository ppa:tualatrix/ppa
sudo apt-get update
sudo apt-get install ubuntu-tweak

效果图:

Linux:Ubuntu 14.04 下的MAC OS X 主题安装
Linux:Ubuntu 14.04 下的MAC OS X 主题安装

在ubuntu14.04上安装Mac OS X主题

为了修改上文所说的内容。我们需要打开终端运行如下命令:

sudo add-apt-repository ppa:noobslab/themes
sudo apt-get update
sudo apt-get install mac-ithemes-v3
sudo apt-get install mac-icons-v3

现在打开刚才安装的工具来选择主题,在GTK主题上选择MBuntu。再本地tab上选择Mbuntu-osx在光标tab上选择Mac-cursors.

如图所示

Linux:Ubuntu 14.04 下的MAC OS X 主题安装
Linux:Ubuntu 14.04 下的MAC OS X 主题安装
Linux:Ubuntu 14.04 下的MAC OS X 主题安装
Linux:Ubuntu 14.04 下的MAC OS X 主题安装

 

Linux:Ubuntu 14.04 下的MAC OS X 主题安装
Linux:Ubuntu 14.04 下的MAC OS X 主题安装

现在unity桌面看起来就像Mac了。你已经有了mac的图标,mac的窗口样式,mac的鼠标指针样式。

来源:https://linux.cn/article-3487-1.html

Linux:Ubuntu 14.04中修复默认启用HDMI后没有声音的问题

声音问题在Ubuntu中是老生常谈了。先前我已经在修复Ubuntu中的“无声”问题一文中写到了多种方法,但是我在此正要谈及的声音问题跟在另外一篇文章中提到的有所不同。

Linux:Ubuntu 14.04中修复默认启用HDMI后没有声音的问题
Linux:Ubuntu 14.04中修复默认启用HDMI后没有声音的问题

因此,我安装了Ubuntu 14.04,实际上是重新安装了一遍。一如既往,我将全新安装Ubuntu 14.04后要做的事全部又重新做了一遍。然后,我意识到系统突然失声了。当我正侦查问题所在之时,我发现了一件奇怪的事情。我检查了alsamixer,发现它的状况有点离奇。

Linux:Ubuntu 14.04中修复默认启用HDMI后没有声音的问题
Linux:Ubuntu 14.04中修复默认启用HDMI后没有声音的问题

正如你能看到的,alsamixer中默认设置了HDMI。这意味着默认情况下将使用HDMI输出,而不是内置扬声器。这就是我从系统上内置扬声器无法获得声音的原因。

使用下面的命令来检查alsamixer的状态:

alsamixer

如果alsamixer默认设置成了HDMI或者其它声音输出,那就继续读下去吧,看看我们是怎么来修复这个问题的。

修复默认设置成HDMI时Ubuntu的失声问题

现在来强制Ubuntu使用模拟输出来取代默认的HDMI,但我们还需要一点点信息。打开终端,然后使用下列命令:

aplay -l

这会列出设备,卡号之类的东西。注意,向下检查模拟输出使用的卡和设备编号。我的输出如下所示:

Linux:Ubuntu 14.04中修复默认启用HDMI后没有声音的问题
Linux:Ubuntu 14.04中修复默认启用HDMI后没有声音的问题

一旦你取得了所需的卡和设备编号,重新构建一个配置文件:

sudo gedit /etc/asound.conf

上面的命令也会打开文件,将下面两行添加进去,当然将卡和设备编号替换成你自己的:

defaults.pcm.card 1
defaults.pcm.device 0

保存文件,并重启计算机。现在,你应该听到声音了吧。需要提一下的是,这对所有的Linux发行版都有效,如Linux Mint,Elementary OS,Fedora,Arch Linux等等都可以。正如我之前所说,该“失声疗法”仅针对HDMI被设置为默认设备的情况。对于其它情况,你可以阅读关于在Ubuntu和Linux Mint中修复失声问题这篇文章

您可以尽情发表评论来告诉我这个方法是否有疗效,或者您有更好的方法来处理该问题,也可以告诉我。再见了!


关于Abhishek

我是Abhishek Prakash,It’s F.O.S.S.的“创立者”,我有一个通信系统工程的硕士学位。我酷爱Linux和开源。我使用Ubuntu,信奉知识分享。除了Linux之外,我也喜爱经典的侦探推理小说,是Agatha Christie作品的超级粉丝。大家尽可以在Google+上将我圈进去,并追随@abhishek_pc


via: http://itsfoss.com/fix-sound-ubuntu-1404/

译者:GOLinux 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3489-1.html

Linux:在 Linux 中怎样使用cp命令合并目录树

怎样将两个布局相似的目录树合并成一个新的目录树?为理解该问题让我们思考下面的例子。

Linux:在 Linux 中怎样使用cp命令合并目录树
Linux:在 Linux 中怎样使用cp命令合并目录树

假设 dir1 和 dir2 目录中分别有3个子目录a,b和c.目录布局如下所示:

Linux:在 Linux 中怎样使用cp命令合并目录树
Linux:在 Linux 中怎样使用cp命令合并目录树
 输入目录布局

在目录a,b和c中有一些文件,tree命令的输出将能更好的说明:

Linux:在 Linux 中怎样使用cp命令合并目录树
Linux:在 Linux 中怎样使用cp命令合并目录树
 文件布局

1. 使用cp命令创建合并:

现在我们将这两个目录合并成一个名为”merged”新的目录中.完成上述操作最简单的方式就是递归复制目录,如下图所示:

Linux:在 Linux 中怎样使用cp命令合并目录树
Linux:在 Linux 中怎样使用cp命令合并目录树
 递归复制完成新的合并

1.1 cp命令和替换带来的问题:

这种方式所带来的问题是该合并目录中所创建的文件为原文件的副本,并非原文件本身.别急, (你可能正在问自己) 如果不是原文件又有什么问题? 要回答你的问题,考虑下你有很多大文件的情况.那种情形下,复制所有的文件可能花费数小时。

现在让我们回到刚那问题上,且尝试使用mv命令而不是cp命令。

Linux:在 Linux 中怎样使用cp命令合并目录树
Linux:在 Linux 中怎样使用cp命令合并目录树
 企图使用mv命令进行合并操作

这些目录不能被合并.因此我们不能像这样使用mv命令去合并目录. 现在你该怎样将原文件保存到”merged”目录中?

2. 解决方法:

cp命令有一个非常有用的选项来帮助我们摆脱这种状况. cp命令的-l 或 –link选项能够创建硬链接而非原文件副本.让我们尝试一下。

在我们尝试cp命令的硬链接选项前,让我们查看一下原文件的inode号码. 可通过tree命令–inodes选项来查看inodes:

Linux:在 Linux 中怎样使用cp命令合并目录树
Linux:在 Linux 中怎样使用cp命令合并目录树
 原文件的inodes

现在我们有了inodes的列表,对于cp命令可通过–link选项创建硬链接:

Linux:在 Linux 中怎样使用cp命令合并目录树
Linux:在 Linux 中怎样使用cp命令合并目录树
 使用硬链接合并的目录

2.1 验证文件:

现在文件已经被复制,让我们验证一下inodes是否和原文件匹配:

Linux:在 Linux 中怎样使用cp命令合并目录树
Linux:在 Linux 中怎样使用cp命令合并目录树
 Verify Inodes

2.2 清除:

正如你所看到的,这些文件的inodes和原文件的一样。现在问题已经解决,且原文件已被复制到合并目录中.现在我们能够移除dir1和dir2目录。

Linux:在 Linux 中怎样使用cp命令合并目录树
Linux:在 Linux 中怎样使用cp命令合并目录树
 移除原始目录


via: http://linoxide.com/linux-command/merge-directory-trees-linux/

原文作者:Raghu

译者:hunanchenxingyu 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3494-1.html

Linux:最新apache+svn+reviewboard实现在线代码评审

本文重点说reviewboard的安装

作用,在线代码评审工具。

—————————————————————————

mysql安装

yum -y install gcc gcc-c++ make cmake autoconf automake ncurses* bison* zlib* expat*
openssl* apr* neon*
yum -y install mysql-server 

 可以选择yum安装mysql 或者编译安装mysql

注,编译安装的mysql,90%运维会装在/usr/local/mysql 下 如果默认安装在/usr/local/mysql下,等装好ReviewBoard生成站点的时候会选择支持使用的数据库的时候没有识别mysql只有sqlite3,此时,如果你数据库不是sqlite3,继续往下执行自动生成的站点访问将会出现bad reqest 400错误。对于编译安装的mysql,解决办法如下 yum安装的mysql命令将在/usr/local/bin/下,不需要软连。

对于编译安装的mysql,解决办法如下 做相应的软连接

ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/libmysqlclient.so.18
ln -s /usr/local/mysql/bin/* /usr/local/bin/

 mysql安装此处不再介绍 编译也好,yum也好,看需求及使用mysql的级别。

—————————————————————————-

Apache和SVN

yum -y install httpd httpd-devel  mod_dav_svn  subversion subversion-devel 

 apache 安装好之后可直接启动

svn 的安装于配置,仓库的创建,用户的管理,权限的配置,网上文档一大堆。

—————————————————————————-

安装reviewboard

reviewboard是由python开发,

1,使用python-setuptools安装

yum -y install python-setuptools
easy_install -U setuptools,

 2,安装python组件

yum -y install python python-devel python版本要2.6以上才可以支持reviewboard

 3、 安装patch

yum -y install patch 

 4、 安装pysvn

wget http://pysvn.barrys-emacs.org/source_kits/pysvn-1.7.6.tar.gz
tar zxvf pysvn-1.7.6.tar.gz
cd pysvn-1.7.6/Source
python setup.py backport 验证与python的兼容
python setup.py configure

 make pysvn的编译安装需要subversion-devel的支持,没有装devel报此处报错,yum安装之后将解决。

mkdir /usr/lib64/python2.6/site-packages/pysvn
cp pysvn/__init__.py /usr/lib64/python2.6/site-packages/pysvn
cp pysvn/_pysvn*.so /usr/lib64/python2.6/site-packages/pysvn

 5、 安装mod_wsgi

yum -y install mod_wsgi 

 mod_wsgi 是支持webpy的一个模块

6、 安装mencache

yum -y install memcached
easy_install python-memcached

 reviewboard需要memcxched的支持,之前没打开11211端口,访问很慢。

7、 安装Review Board

easy_install ReviewBoard

 # 如果安装过程中 Django 1.6.5一直因为网络问题安装失败的话,可以手动下载安装 伟大的天朝已经屏蔽的google,此处提供一个openerdns 42.120.21.30 添加到/etc/resolv.cof 里。成功的几率大大提高,以为此dns可以代理到google,https://code.google.com/p/openerdns/ 

wget https://pypi.python.org/packages/source/D/Django/Django-1.6.5.tar.gz#md5=e4c5b2d35ecb3807317713afa70a0c77
cd Django-1.6.5
python setup.py build
python setup.py install

 # 或者使用pip在线安装

pip --default-timeout=2000 install Django==1.6.5

 8、 安装mysql组件

easy_install mysql-python

 创建reviewboard站点

创建reviewboard存放数据的数据库reviewboard并赋予权限和密码

mysql> create database reviewboard default charset utf8 collate utf8_general_ci;
mysql> grant all on reviewboard.* to 'reviewboard'@'localhost' identified by 'reviewboard';
mysql> FLUSH PRIVILEGES; 

 创建reviewboard站点

rb-site install /reviewboard 

 rb-site命令是装reviewboard自动生成的

之后会有一系列类似安装向导的步骤,需要你做出选择,尽量选择默认值吧

     Domain = rb.XXX.com 自己随意,本地做个hosts绑定就行
     Root Path = 回车
     Database Type = mysql
     Database Name = reviewboard
     Database server = 回车
     Database username = 'reviewboard'
     Database password = 'reviewboard'
     Memcache Server = 回车
      Username [admin]: admin
     E-Mail Address = 邮箱自己填

  ok之后需要修改下列文件的属主属组

[root@localhost bin]# chown -R apache /reviewboard/htdocs/media/uploaded
[root@localhost bin]# chown -R apache /reviewboard/htdocs/media/ext
[root@localhost bin]# chown -R apache /reviewboard/htdocs/static/ext
[root@localhost bin]# chown -R apache /reviewboard/data/
cp /reviewboard/conf/apache-wsgi.conf  到/etc/httpd/conf.d/  

 apache为yum安装,编译安装

 自己定位目录。80端口被占用,我使用了8081 修改了下端口,使用80端口将不用任何修改。

重启apache,http://http://rb.xxx.com/ 就可以访问。

Linux:最新apache+svn+reviewboard实现在线代码评审
Linux:最新apache+svn+reviewboard实现在线代码评审

如果出现400错误,就是在创建reviewboard站点出现错误,站点没有生成好,之前就是没有显示mysql选择了sqlite3,也ok了,访问就是显示400错误,以为是apache-wsgi.conf中

 WSGIPassAuthorization On
 WSGIScriptAlias "/" "/reviewboard/htdocs/reviewboard.wsgi/"

 这两行的问题,写了个html,试验了虚拟主机,注释这两行就ok,打开就400, 查了半天的mode_wsgi,还是400,最终又重新检查一遍,支持了mysql,终于解决。

500错误解决有可能是数据库的问题,重启数据库(慎重)或者drop reviewboard库重新创建,并重新生成reviewboard站点。

来源:http://zhangxylinux.blog.51cto.com/5041623/1532964

Linux:如何无盘启动Linux

无盘启动意味着一台客户端电脑在启动操作系统时没有任何的磁盘存储介质。在这种情形之下,电脑能够通过网络从远程NFS服务器上加载内核和根文件系统。在这过程中可能会用到多种不同的方法来从NFS服务器上加载内核和根文件系统:RARP,BOOTP或是DHCP协议。在这个指导教程中,我会使用BOOTP/DHCP协议,因为它们能够被大多数的网卡所支持。

Linux:如何无盘启动Linux
Linux:如何无盘启动Linux

无盘计算机的优势

想象一下你的办公室内有30台电脑,每一台都需要使用相同的应用程序。如果你作为管理这些电脑的管理员,你会怎么做?如果你在每一台电脑上安装应用程序,那只是在浪费你的时间。另一方面来说,一套无盘系统就能解决你的问题。有了一套无盘系统,你只需在中央NFS服务器上安装需要的程序,然后通过网络启动这30台客户机即可。

需要什么

两台或更多的装备有支持DHCP协议的网卡的Linux电脑。这些将扮演NFS服务器角色的电脑应当配有硬盘,其它客户机不需要任何的硬盘。服务器和客户机需要连接到同一个本地网络之内。

设置一个无盘系统共需要五步。

  1. 安装所需的包
  2. 配置TFTP服务器
  3. 配置DHCP服务器
  4. 配置NFS服务器
  5. 启动无盘客户机

在这个指导教程中,我假设作为启动服务器的电脑运行的是 Ubuntu。如何你正在使用其它的Linux发行版,原理是一样的。

第一步:安装所需的包

像下面这样使用 apt-get 命令来安装所有需要的包。

$ sudo apt-get install dhcp3-server tftpd-hpa syslinux nfs-kernel-server initramfs-tools

第二步:配置TFTP服务器

TFTP服务器是一个小型FTP服务器,需要用它来在本地网络中的客户机和服务器之间自动传输启动文件。

向/etc/default/tftpd-hpa中添加以下行:

RUN_DAEMON="yes"
OPTIONS="-l -s /var/lib/tftpboot/"

接着,创建一个启动文件夹。

$ sudo mkdir -p /var/lib/tftpboot/pxelinux.cfg

复制引导程序镜像。

$ sudo cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftpboot

像下面这样创建一个默认启动配置文件。

$ sudo vi /tftpboot/pxelinux.cfg/default

LABEL Ubuntu
KERNEL vmlinuz
APPEND root=/dev/nfs initrd=initrd.img nfsroot=10.10.101.1:/nfsroot ip=dhcp rw

注意:

  • “root=/dev/nfs”表示服务器上的网络文件系统(不需要修改)。
  • “initrd=initrd.img”是一个用于系统启动的启动脚本。
  • “nfsroot=10.10.101.1/nfsroot”指明了服务器的IP地址以及NFS共享文件夹的名称。用你的服务器地址来替换掉IP地址。
  • “ip=dhcp”表示客户端电脑使用DHCP寻址方案。
  • “rw”表示NFS共享是可读/可写的。

最后,重启TFTPD服务。

sudo /etc/init.d/tftpd-hpa restart

第三步:配置DHCP服务

你还需要在NFS服务器上配置DHCP服务来允许使用/var/lib/tftpboot/pxelinux.0启动。假设你在使用10.10.101.0作为子网,你的配置可能看起来像下面这样子。

$ sudo vi /etc/dhcp3/dhcpd.conf

allow booting;
allow bootp;
subnet 10.10.101.0 netmask 255.255.255.0 {
    range 10.10.101.2 10.10.101.254;
    option broadcast-address 10.10.101.255;
    option routers 10.10.101.1;
    filename "/pxelinux.0";
}

然后重启DHCP服务。

$ sudo service isc-dhcp-server restart

第四步:配置NFS服务器

创建一个保存客户机根文件系统目录的文件夹。

$ sudo mkdir /nfsroot

接着,设置NFS服务器导出客户机根文件系统。向/etc/exports添加以下行来实现。

/nfsroot             *(rw,no_root_squash,async,insecure,no_subtree_check)

运行下列命令来重新载入修改过的/etc/exports。

$ sudo exportfs -rv

默认情况下,Ubuntu在initrd镜像中不提供网络启动支持。因此你需要创建一个新的initrd.img文件。首先添加下列行到/etc/initramfs-tools/initramfs.conf中。

BOOT=nfs
MODULES=netboot

然后运行下列命令来创建一个新的initrd.img。

$ sudo mkinitramfs -o /var/lib/tftpboot/initrd.img

将新的内核镜像文件复制到/var/lib/tftpboot中。

$ sudo cp /boot/vmlinuz-`uname -r` /var/lib/tfftpboot/vmlinuz

是时候将整个根文件系统拷贝到/nfsroot中了。

假设您使用的是一个全新的Ubuntu服务器安装,你只需将文件系统拷贝到NFS的根之中。

$ sudo cp -ax / /nfsroot

然后通过文本编辑器打开/nfsroot/etc/fstab 并添加以下行。

/dev/nfs       /               nfs    defaults          1       1

文件夹/var/lib/tftpboot应拥有全局读写权限。否则客户机无法从网络启动。

$ sudo chmod -R 777 /var/lib/tfftpboot

最后,为了避免任何服务器设置出现错误,我推荐对运行DHCP服务的网卡使用静态IP。举个例子,如果网卡名为eth0,你的/etc/network/interfaces中的配置应该看起来像这样:

iface eth0 inet static
    address 10.10.101.1
    netmask 255.255.255.0
    broadcast 10.10.101.255
    network 10.10.101.0

第五步:启动无盘客户机

在您完成了服务器上的配置之后,从网络启动你的客户机。要从网络启动一般你只需修改BIOS设置中的启动优先顺序即可。

如果客户机启动成功,您的无盘环境就配置好了。无需做任何修改就可以任意添加一台或多台客户端电脑。


via: http://xmodulo.com/2014/06/diskless-boot-linux-machine.html

译者:alim0x 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3511-1.html

Linux:树莓派微计算机新玩法:构建免费个人云计算服务器

Tonido公司现在推出了为树莓派Raspberry Pi微型计算机系统打造的免费软件,可以将你的信用卡大小的树莓派设备变成个人云计算服务器。Tonido公司在iPhone、安卓系统、黑莓系统以及 WP平台上都有配套的应用。通过个人云服务器以及Tonido的应用可以使你在移动设备之间同步各种文档,分享内容给好友以及串流音乐媒体等,享受个人云 服务。

Linux:树莓派微计算机新玩法:构建免费个人云计算服务器
Linux:树莓派微计算机新玩法:构建免费个人云计算服务器

该软件可以免费地运行在Raspbian或Paspbmc OS系统上,首先输入以下命令进行安装:

sudo mkdir /usr/local/tonido
cd /usr/local/tonido
sudo wget http://patch.codelathe.com/tonido/live/installer/armv6l-rpi/tonido.tar.gz
sudo tar-zxvf tonido.tar.gz
./tonido.sh start

然后进入你的树莓派计算机的10001端口进行安装设定:

http://["raspberrypi ip address"]:10001

更多安装说明与软件下载请进入:

http://www.tonido.com/tonido-for-raspberry-pi-2/

Linux:树莓派微计算机新玩法:构建免费个人云计算服务器
Linux:树莓派微计算机新玩法:构建免费个人云计算服务器

来源:http://www.cnbeta.com/articles/315589.htm

Linux:[快速技巧]通过命令在 Debian/Ubuntu 中设置默认浏览器

Linux:[快速技巧]通过命令在 Debian/Ubuntu 中设置默认浏览器
Linux:[快速技巧]通过命令在 Debian/Ubuntu 中设置默认浏览器

嘿,伙计们!

在这篇文章中,我们将使用终端设置默认浏览器。

虽然,使用浏览器主界面来设置默认浏览器很方便,但是有时,你需要远程来操作。

要做到这一点,你只需打开终端,然后执行下述命令:

sudo update-alternatives --config x-www-browser

之后输入你想设置为默认浏览器的号码,这样就搞定了!

截图如下:

图片1

成功了吗?


via: http://www.unixmen.com/quick-tip-set-default-browser-debianubuntu-using-terminal/

译者:su-kaiyao 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3520-1.html

Linux:tripwire-文件指纹

Linux:tripwire-文件指纹
Linux:tripwire-文件指纹
Tripwire是目前最为著名的unix下文件系统完整性检查的软件工具,这一软件采用的技术核心就是对每个要监控的文件产生一个数字签名,保留下来。当文件现在的数字签名与保留的数字签名不一致时,那么现在这个文件必定被改动过了。 Tripwire可以对要求校验的系统文件进行类似md5的运行,而生成一个唯一的标识,即“快照”snapshot。当这些系统文件的大小、inode号、权限、时间等任意属性被修改后,再次运行Tripwire,其会进行前后属性的对比,并生成相关的详细报告。

  1、下载并安装

[root@ipython ~]# wget http://nchc.dl.sourceforge.net/project/tripwire/tripwire-src/tripwire-2.4.2.2/tripwire-2.4.2.2-src.tar.bz2[root@ipython ~]# tar jxf tripwire-2.4.2.2-src.tar.bz2
[root@ipython ~]# cd tripwire-2.4.2.2-src
[root@ipython tripwire-2.4.2.2-src]#./configure --prefix=/software/tripwire
[root@ipython tripwire-2.4.2.2-src]# make
[root@ipython tripwire-2.4.2.2-src]# make install
############INSTALL 交互#################Press ENTER to view the LicenseAgreement.       ###回车阅读协议
license agreement.[donot accept] accept		###同意协议Continuewith installation?[y/n] y		###确认继续安装Enter the site keyfile passphrase:              ###需要记住的keyfileVerify the site keyfile passphrase:             ###重复Enter the local keyfile passphrase:             ###需要记住的local keyfileVerify the local keyfile passphrase:            ###重复Please enter your site passphrase:              ###输入Please enter your site passphrase:              ###输入############交互结束,完成安装#################[root@ipython tripwire-2.4.2.2-src]# ls /software/tripwire/etc/| sort
ipython.me-local.key		####加密本地密钥文件
site.key			####加密站点密钥文件
tw.cfg				####加密配置变量文件
tw.pol				####加密策略文件
twcfg.txt			####定义数据库、策略文件和Tripwire可执行文件的位置
twpol.txt			####定义检测的对象及违规时采取的行为

 2、初始化(生成基准数据库)

[root@ipython ~]#/software/tripwire/sbin/tripwire --init
Please enter your local passphrase:###键入密码,后面省略此交互......Wrote database file:/software/tripwire/lib/tripwire/ipython.me.twd
The database was successfully generated.

 3、第一次完整性检查,和常用检查参数

[root@ipython ~]#/software/tripwire/sbin/tripwire --check
##默认检查报告存放路径##/software/tripwire/lib/tripwire/report/##指定存放路径##[root@ipython ~]#/software/tripwire/sbin/tripwire --check --twrfile ./test.twr
###Email 发送报告###[root@ipython ~]#/software/tripwire/sbin/tripwire --check --email-report
###指定Email 报告的级别###[root@ipython ~]#/software/tripwire/sbin/tripwire --check --email-report --email-report-level 2###使用指定严重性等级的规则进行检查###[root@ipython ~]#/software/tripwire/sbin/tripwire --check --severity 80###使用指定的规则名检查##[root@ipython ~]#/software/tripwire/sbin/tripwire --check --rule-name rulename
###只检查指定的文件或目录[root@ipython ~]#/software/tripwire/sbin/tripwire --check object1 object2 object3
###检查是忽略某属性###[root@ipython ~]#/software/tripwire/sbin/tripwire --check --ignore "property, property, property, property"###获取帮助[root@ipython ~]#/software/tripwire/sbin/tripwire --help all
##检视报告##[root@ipython ~]#/software/tripwire/sbin/twprint --print-report --twrfile ./test.twr
##重定向加密报告的内容##[root@ipython ~]#/software/tripwire/sbin/twprint --print-report --twrfile ./test.twr > output.text
##指定报告输出时的级别##[root@ipython ~]#/software/tripwire/sbin/twprint --print-report --report-level 4--twrfile ./test.twr > output.text

 4、升级基准数据库文件

###升级的目的是很正常的,因为check 是基于基准数据的###[root@ipython ~]#/software/tripwire/sbin/tripwire --update --twrfile ./test.twr
###检测后立即自动update###[root@ipython ~]#/software/tripwire/sbin/tripwire --check --interactive 

 5、升级策略文件

###更新策略稳健,需要修改策略的规则,先将策略重定向出来###[root@ipython ~]#/software/tripwire/sbin/twadmin --print-polfile > twpol.txt
###照猫画虎修改吧,然后update###[root@ipython ~]#/software/tripwire/sbin/tripwire --update-policy twpol.txt
Parsing policy file:/root/twpol.txt
Please enter your local passphrase:Please enter your site passphrase:

 6、修改site key 和 local key

###修改前记得备份下###[root@ipython ~]#/software/tripwire/sbin/twadmin --generate-keys --site-keyfile /software/tripwire/etc/site.key
[root@ipython ~]#/software/tripwire/sbin/twadmin --generate-keys --local-keyfile /software/tripwire/etc/site.key
#配置文件通过site key 假面,数据文件和报告文件用local key 加密#[root@ipython ~]#/software/tripwire/sbin/twadmin --encrypt --site-keyfile /software/tripwire/etc/site.key
[root@ipython ~]#/software/tripwire/sbin/twadmin --encrypt --local-keyfile /software/tripwire/etc/ipython.me-local.key

 

来源:http://www.ipython.me/centos/tripwire-file-md5.html

Linux:命令行星期二——第六部分

不管怎样,让我们继续我们今天的日程吧:输入/输出重定向。

我们已经用过的大多数命令,都把他们的结果张贴到了终端显示中。然而,我们也可以让这些命令的显示放进一个文件、设备中,或者作为其它命令的输入,一切都在重定向

标准输出

那么,命令行程序主要是怎么工作的呢?它们会将命令的结果丢给一个叫做标准输出的设备,然后,标准输出会将这些结果发送到你的显示设备上,这样你就可以畅快地阅读这些信息了。然而,你也可以让命令的结果显示到一个文本文件中,像这样,用“>”字符(我的例子):

man zypper > man.txt

这儿我所干的是, 我想要获得zypper的一个帮助页。但是,我想要把它放到一个文本文件中去,因而我可以在我需要他们的时候(例如,在论坛、IRC寻求帮助时)很方便地读取这些结果。所以,这个命令做的是,保存man zypper输出结果到我的家目录中的man.txt,这样你可以看到,我可以用gedit来打开它:

Linux:命令行星期二——第六部分
Linux:命令行星期二——第六部分

如果我重复了该命令,或者使用不同的命令重定向到了同名文件,那么它就会被一次又一次地覆盖。所以,在那种情况下,如果我想要把输出结果重定向并附加到现存文件中,我唯一能做的事情就是下一次使用“>>”来替换“>”。

标准输入

许多命令也可以接受来自称之为标准输入的设备的输入。默认情况下,输入来自键盘,然而也可以来自一个文件。要重定向它,使用跟前面相反的字符:‘<’。

请看下面的例子:

sort < man.txt

管道

要想把多个命令连接到一起,你可以使用管道。管道所要做的是,将一个命令的标准输出注入到另一个命令的标准输入。肖茨先生的最爱:

ls – l | less

通过使用‘| less’这个小把戏,你可以让任何命令滚动输出。 过滤器

过滤器

过滤器是管道中常用的程序。过滤器获取标准输入,对它进行操作,然后把结果发送到标准输出。它们可以以一种相当强大的方式处理信息。这儿提供了一个程序列表,大多数都是用作过滤器的。它们可以用于执行、查询,或者将帮助页重定向到它们,然后再重定向到一个文件!

过滤器:sort, uniq, grep (我们发现这一个东西遍布论坛,因此我建议大家深入研究一下), fmt, pr, head, tail, tr, sed, awk。

结束

我们只剩下几个课程来阐述CLI的基本用法了,到成熟期的时候,我希望大家都会对CLI兴趣会增多一点了,也希望大家在萧条期也进行一些探索!而在你们动手干的时候,我希望你们…… 玩得不亦乐乎!


via: https://news.opensuse.org/2014/07/30/command-line-somedays-part-six/

作者:Nenad Latinović 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3522-1.html

Linux:10个有用的Linux命令面试问题及答案

Linux命令行,以及用户使用Linux命令进行Linux shell交互,是Linux最吸引人的地方,也是面试中最普遍的话题之一。在这篇文章中,我们将提出10个面试中很重要问题,这肯定能拓宽你的知识面。

Linux:10个有用的Linux命令面试问题及答案
Linux:10个有用的Linux命令面试问题及答案

1. 如何暂停一个正在运行的进程,把其放在后台(不运行)?

答案:为了停止正在运行的进程,让其在后台(不运行),我们可以使用组合键 Ctrl+Z。(LCTT译注:如果希望其在后台运行,还需要使用bg命令并指定其Ctrl+Z得到的任务号,才可以在后台运行。)

2. 什么是安装Linux所需的最小分区数量,以及如何查看系统启动信息?

答案:单独一个“/”根分区足以执行所有的系统任务,但是强烈建议安装Linux时,需要至少三个分区:/、/boot 和 swap分区。一个IDE硬盘驱动器支持高达63个分区,SCSI硬盘驱动器支持超过15个分区。(LCTT译注:此处原文表述有误,径改)

为了检查启动信息,我们可以使用cat或者dmesg命令,如下所示:

#cat /var/log/messages

或者

#dmesg

3. 在你的Linux机器上跟踪系统事件的守护进程名是什么?

答案:’syslogd’,它负责跟踪系统信息,并将跟踪日志存储在特定的日志文件里。

4. 在“/”根分区运行’fsck’命令的最低要求是什么?

答案:“/”根分区必须挂载为只读模式才能运行fsck,读写模式则不行。

5. 如何按层次结构复制/home目录到另一个目录?

答案:Linux的’cpio’命令可以实现效果。’cpio’可以按层次结构地复制文件和目录层次结构到另一个位置。(LCTT译注:实际上使用cpio的很少,而是使用cp -r较多)

6. 在Linux中,怎样实现日志文件的自动循环?

答案:’logrotate’提供日志自动循环功能(LCTT译注:将旧的日志切断,保存为.1,.2之类的文件名,并在下次切断时,逐个覆盖,并丢弃最老的)。

7. 怎样知道Linux中是谁在调度工作?

答案:使用’at’命令加上’-l’选项,就可以查出。

8. 如何在不解压tar包的前提下,查看包里的内容?

答案:使用’tar -tvf’。选项‘t’(显示内容),‘v’(详细报告tar处理的文件信息),‘f’(使用档案文件或者设备)

9. 什么是页面错误,它是怎么发生的?

答案:当一个程序请求内存中不存在的数据时,就会产生页面错误,导致的结果就是程序停止。(LCTT译注,此处page fault页面错误,和内存页未命中的页面错误,不是一回事。)

10. 什么是在程序中返回码?

答案:返回码是shell的特性。返回码显示了程序的状态,一个成功的程序执行后返回‘0’,&&可以用来决定那个应用程序先执行。(LCTT译注,据网友反馈,其实返回码不仅仅是Shell的特性,而应该是POSIX系统的系统级特性。)

好了,文章要结束了。不久以后,我还会在这分享其余有趣文章的,记得和我们保持联系。还有,别忘了在评论栏里面向我们提供您的宝贵意见。

(LCTT译注:本文写了太多译注,一方面有我们翻译校对不严谨的问题,另外原文也存在一些问题。网友们能火眼金睛指出问题,并不尽信书,这非常好。所以我重新校对了一遍,以期解决这些不足——如果还有不对之处,欢迎大家补充讨论。谢谢大家。)


via: http://www.tecmint.com/10-useful-interview-questions-and-answers-on-linux-commands/

原文作者:Avishek Kumar

译者:su-kaiyao 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3532-1.html

Linux:在 ubuntu 下使用 Pushbullet Indicator 向 Android/iOS 设备推送文件

Linux:在 ubuntu 下使用 Pushbullet Indicator 向 Android/iOS 设备推送文件
Linux:在 ubuntu 下使用 Pushbullet Indicator 向 Android/iOS 设备推送文件

Pushbullet是一款iOS和Android设备与桌面系统互相传输文件、链接、图片的APP应用,Pushbullet可以在任何装有Firefox或Chrome 浏览器的操作系统上安装使用。

如果你不是浏览器扩展插件的粉丝,却依然想使用桌面应用Pushbullet in Ubuntu 14.04的话,你可以使用由 Atareao开发 的Pushbullet Indicator。 Pushbullet Indicator 小应用正在开发阶段,并不具备官方windows桌面版应用的所有功能, 但是已经足够大家入门使用了。

在Ubuntu 14.04 和 Linux Mint 17 下安装Pushbullet Indicator小应用

打开一个终端,并且使用以下命令

sudo add-apt-repository ppa:atareao/atareao
sudo apt-get update
sudo apt-get install pushbullet-indicator

以上个人软件包不支持运行在Ubuntu 13.10.版本

在Ubuntu 14.04 和 Linux Mint 17 下使用Pushbullet Indicator小应用

  • 创建一个Pushbullet账号

  • 在Android/iOS设备上安装Pushbullet

  • 在Ubuntu 或者Linux Mint系统安装Pushbullet Indicator小应用以后,运行。第一次启动时,会提供一些Pushbullet账号连接的选项。如图:

Linux:在 ubuntu 下使用 Pushbullet Indicator 向 Android/iOS 设备推送文件
Linux:在 ubuntu 下使用 Pushbullet Indicator 向 Android/iOS 设备推送文件
  • 当连接完成时,你也应该从下图设备标签中命名你的设备。如果你想Pushbullet在每次开机时自动启动,你可以在从preference设备中
  • 点击打开Autostart按钮自动启动(如上图所示)

  • 当你做完这一步,你会看见 Pushbullet indicator 小应用出现在Unity panel。

Linux:在 ubuntu 下使用 Pushbullet Indicator 向 Android/iOS 设备推送文件
Linux:在 ubuntu 下使用 Pushbullet Indicator 向 Android/iOS 设备推送文件
  • 点击indicator,选择想要向其发送数据的智能手机(已经连接到你的Pushbullet的设备)
Linux:在 ubuntu 下使用 Pushbullet Indicator 向 Android/iOS 设备推送文件
Linux:在 ubuntu 下使用 Pushbullet Indicator 向 Android/iOS 设备推送文件
  • 你将会在其他设备上接收到一个接收文件的通知。然后,你可以通过Pushbullet app应用获取所有的通知消息。

  • 安卓设备也可以接到来电、短信和其他类型的通知。

  • 如果你从你的移动设备向桌面发送一个文件的话,你将会接到以下通知。

Linux:在 ubuntu 下使用 Pushbullet Indicator 向 Android/iOS 设备推送文件
Linux:在 ubuntu 下使用 Pushbullet Indicator 向 Android/iOS 设备推送文件
  • 这些文件不会自动的保存在某个目录下。获取其他设备发送来的文件,可以去indicator目录查看最后推送(Show last push),显示你最后推送的。点击下载文件到你选择的目录中。

为Pushbullet安装Nautilus扩展

另一个可选的建议,你可以为Pushbullet安装Nautilus扩展,使它可以通过右键目录直接发送文件。使用以下命令安装。

sudo apt-get install nautilus-pushbullet

但是,在重启后你必须重新授权。

请在评论区分享你使用Pushbullet Indicator小应用的经验,朋友们,再见.


via: http://itsfoss.com/pushbullet-indicator-ubuntu/

作者:Abhishek 译者:lfzark 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3534-1.html

Linux:服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?

编辑推荐!本文来自知乎的袁昊洋,是我见过的关于如何选择服务器操作系统的最有理有据的文章,而且富有实践基础。小编基本上同意全文观点——当然,这并不是说大家就不应该选择其他的操作系统做服务器——甚至你选择Windows XP做服务器都有你的道理。大家有什么选择,希望也发表你的观点。

首先的首先,我想请各位玩家,你们不要自己最近新玩上什么就觉得什么好,然后大肆的推荐什么好不好!负点责任好不好!人家是服务器,有些时候选错一个发行版本会痛苦死一批人!

是,你现在终于发现有个版本叫 Ubuntu 了,好爽啊,那么多包,随便 apt-get , 3万个包躺在仓库里面不用编译。好爽啊!几乎所有软件都有最新版本用!唉?过两天你发现 Ubuntu 原来是从 Debian 来的,Debian 才叫牛啊,完全社区运作,包的数量一点都不少啊。再过两天发现 Gentoo 啦,哇塞,牛啊!性能的极致优化,编译编译再编译,configure , configure 再 configure ,精简到极致。再过两天 Gentoo 玩腻了,不就是编译么~ 唉? 原来还有 Arch 啊,这个不错啊,想编译的编译,不想编译的也有默认包。然后2个月没 pacman 更新过的系统,更新一下全挂了。

你的意识形态,走在任何一个阶段都认为这个阶段是最好的选择。但事实并不是这样的,这只是你的兴趣而已。

Linux:服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?
Linux:服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?

要讨论这个问题,先要知道两大发行版本的区别在哪里。RedHat 和 Debian。

一、版本定义

RedHat 是由红帽公司维护的发行版本。其 RedHat 9 是最后一个以 RedHat 为名的发行版本。在 RH9 之后,版本开始分为社区维护的 Fedora 和 企业使用的 EL。而我们所说的 CentOS X 就是从 RHEL X 编译过来的。所以本质上,CentOS 的目标用户,就是企业的服务器。

CentOS 是有 release 概念的,何为 release 概念?当某个版本定下时,其绝大多数软件包,包括 Kernel 在内,都已经确定了版本。在该 release 下,没有特殊情况,大版本号不发生变化。

举例,CentOS 6 某个 Kernel 版本:

2.6.32-358.el6.x86_64 

2.6.32 为 kernel 版本号,358 为打包版本号,打包版本表示该包第几次打包。对于 RHEL 来说,一个 kernel 打包个 500 700 次是很正常的事情。

再比如一些软件,1.1.3 是版本,如果该软件自身的定义,最后一位是 bugfix 版本,倒数第二位是功能版本,那么你在 RHEL 里面,很少会看到功能更新!通常只会看到 bugfix 更新!也就是只会看到小版本号更新。

Debian 是由社区维护、贡献的发行版本,其从选包、打包、都是由社区组织,分散行动的。

Debian 是没有真正意义的 release 概念的。Debian 有众多仓库,stable,testing,unstable ,experimental. Debian 组织系统的方式是,一个软件先进入 experimental, 放一段时间,有 bug 修 bug,没 bug 了,过段时间挪入 unstable ,如此循环最终挪到 stable 里面。所以在这种情况下,Debian 的系统中,是没有一个稳定版本的概念。今天你用 kernel 3.2.1-87 ,明天就给你更新到 kernel 3.3.2-5 。

——– 补充内容 ——-

我觉得我已经把我所谓的 release 概念解释的很清楚了,但是评论里面还有人在和我说 Debian 是有 release。我说的 release 不是那种自己划个时间线,叫个名字的概念。而是版本维护的概念。

@刘世伟 说 Debian 也是这样的,那好吧,我证明给你看一下。

你从这里 Debian — 在 wheezy 中的 linux-image-3.2.0-4-amd64 软件包详细信息 可以拿到现在 Debian stable 的 Linux kernel 打包,下载下来,解压缩,在

usr/share/doc/linux-image-3.2.0-4-amd64 目录下面有一个 changelog.Debian ,grep 一下:

grep wheezy changelog.Debian
linux (3.2.57-3) wheezy; urgency=medium
linux (3.2.57-2) wheezy; urgency=medium
linux (3.2.57-1) wheezy; urgency=medium
linux (3.2.54-2) wheezy; urgency=high
linux (3.2.54-1) wheezy; urgency=high
linux (3.2.53-2) wheezy; urgency=high
linux (3.2.53-1) wheezy; urgency=medium
linux (3.2.51-1) wheezy; urgency=low
linux (3.2.46-1+deb7u1) wheezy-security; urgency=low
linux (3.2.46-1) wheezy; urgency=low
linux (3.2.41-2+deb7u2) wheezy-security; urgency=high
linux (3.2.41-2+deb7u1) wheezy-security; urgency=high

起码在 wheezy 里面(stable) 里面,他从 3.2.41 走到了 3.2.57 , 同时…… 你们可以看到 每个版本也就打包 1-2 次,1-2次啊!而且 Debian 的 unstable 走到 stable 真的就是随便走走的。

linux (3.2.41-2+deb7u1) 是第一个 stable 版本,他的上一个版本是

linux (3.2.41-2) unstable ,好,3.2.41 第二次打包,加了一次 patch 就变成 stable 了

linux (3.2.41-1) unstable , 得,41 就打了一次

linux (3.2.39-2) unstable , 39 也就打两次。

从这个过程,你可以看出,Debian 总体上,还是在跟着 Kernel Source 的,为啥?没人啊!靠零散的人打 patch 还不如依赖 Kernel 本身的小版本更新。

RedHat 呢?

放一个 RHEL 6.4 的 Release Note

https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/6.4_Technical_Notes/kernel.html

RHEL , 是不跟 kernel source 的小版本号的,自己整合 bugfix ,主要是安全相关的补丁。

为什么不跟 kernel source 呢?

主要还是目标用户的不同,就像我下面驱动这块要解释的。RHEL 的目标用户,是企业的 Server 的,他的 Kernel 里面,已经太多的东西被替换掉了。磁盘、网卡、各种各样的驱动。而 Kernel source 尽管只走小版本号,还是不太靠谱的。频繁的拿过来风险也大。

kernel 其实走到 2.6 以后,就没有一个真正稳定的概念了。反正就是一路往前走。当然 2.6.32.xx 的确是以 bugfix 为主的。但是这个量太大了,各种各样鸡毛蒜皮,RHEL 不是全都拿进来的。

你们一定要和我争论版本的问题,行,我不和你们争,Debian Stable 是有版本的~ 你们满意了?这种一个 kernel 打包 2次的状态,你们爱用就用好了。无所谓的。

但是有 版本的也只是 stable,testing 我可从来没见过。

说实话,我真的花了心思想多找一点 Debian 的信息,

11年进入 stable 的 6.0 , 最近确实还有一个更新,在 08 Apr 2014 。

http://metadata.ftp-master.debian.org/changelogs//main/l/linux-2.6/linux-2.6_2.6.32-48squeeze5_changelog

09年发布的 lenny 也就是 5.0 ,根本已经连信息都很难找了。如果谁能找到 lenny 麻烦给一个 kernel 的 changelog

—– 补充结束 ——-

而其继承者 Ubuntu,他是有 release 概念的,比如 9.04 ,10.06 等等,当他确定了 release 之后,他也不会在这个版本中做太大的版本变化。

但是问题是,他学到了 CentOS 的形,没有学到 CentOS 的精华。为什么?因为他又想追求新(一年两个版本),又想学人家吃服务器市场。这是完全相互矛盾的一件事情。新,好办,只要跟着 Debian 走,experimental 仓库里面永远是最新的东西。拿过来,测试测试,重打包,发布!

稳定?(Ubuntu-Server) 这就难了,这需要不断的人力投入,Debian 自然不会帮你做这件事。自己做?Ubuntu 尝试了几次,目前我没看到成功。几乎都是草草放弃。

二、维护的力量

你们知道什么叫维护一个服务器用的发行版本么?

CentOS 4.0 2005-03-09

CentOS 4.9 2011-03-02

6年

Ubuntu 8.04 LTS April 24, 2008

Ubuntu 8.04.4 LTS January 28, 2010

1年9个月

你说好的 LTS 呢???

Ubuntu 10.04 LTS April 29, 2010

Ubuntu 10.04.4 LTS February 16, 2012

说好的 LTS 呢?

说 End of the Date 是3年整就是一个笑话,只要下个 release 一出,上个 release 收到的更新数量就可怜。

这才是 RedHat 的实力!你只要用我的发行版本,你不用有后顾之忧!Ubuntu 呢?开玩笑,即使是 LTS,在新版本出来以后 LTS 几乎不更新好么。补丁?从来没见过!也就是 LTS 的真正寿命也就 6个月-1年。你敢用?你敢给你们公司用?

某天某个软件爆出类似最近 openssl 的漏洞,用 CentOS 5 的用户第二天拿到了升级的 rpm。用 Debian 的用户收到了一个大版本更新,同时由于依赖关系必须更新 glibc, kernel 等等包。用 Ubuntu 的用户收到官方回复:“apt-get dist-upgrade”

这就是这几种发行版本在维护上的区别。

我们再说回 RHEL,很多人不懂,以为 Ubuntu “新”,RHEL “老” 。

你的服务器上有一块 Broadcom 的网卡,CentOS 6(2.6.32-358.el6.x86_64) 用户 modinfo 了一下

filename: /lib/modules/2.6.32-358.6.1.el6.x86_64/kernel/drivers/net/tg3.ko
firmware: tigon/tg3_tso5.bin
firmware: tigon/tg3_tso.bin
firmware: tigon/tg3.bin
version: 3.124

Debian testing(3.12-1) 用户 modinfo 了一下

filename: /lib/modules/3.12-1-amd64/kernel/drivers/net/ethernet/broadcom/tg3.ko
firmware: tigon/tg3_tso5.bin
firmware: tigon/tg3_tso.bin
firmware: tigon/tg3.bin
version: 3.133

你知道 http://kernel.org 的最新的 2.6.32 带的是哪个版本的 tg3 驱动么?

#define DRV_MODULE_VERSION "3.102"
#define DRV_MODULE_RELDATE "September 1, 2009"

CentOS “老”么?谁在将最新的驱动打入老的 kernel?谁在测试新驱动与老 kernel 的兼容性?RH啊!!这些都是人力啊,这些都是财力啊。

RH 在保证稳定、兼容的同时,尽可能的给服务器用户最全的设备匹配,最新的驱动支持。而这一切!你都不用担心稳定性、兼容性,因为 RH 没有更新大版本,没有带来 庞大 feature 的更新。

还有一个例子:

google RFS patch in linux kernel Linux 2.6.35 中的 RPS 功能。

这简直就是 Linux 服务器用户梦寐以求的功能好不好,你不用再担心多核CPU被浪费,你不用花很多钱买昂贵的多 irq 网卡。但是要 2.6.35 才有哦~

但是你不用担心,CentOS 6 (2.6.32) 已经将RPS整合进 2.6.32 的内核中了。

你看到Ubuntu做这种事情了?Ubuntu 在忙什么?在忙着今年再发一个版本啊!

RHEL 为什么做?因为他的用户是服务器!RPS 这种事情PC根本就用不到好不好。

我回到最开头。我也用 Ubuntu 做过产品,虽然不是服务器。但是最后的结果并不好。我听说过一个同事的上家公司用 Ubuntu 做服务器,千级别的量。聊了一下发现和我预测的差不多,痛苦不堪。

基本的痛苦流程是这样的

遇到一个问题->发现只有更新软件版本才能解决->这个自己当前的版本已经不提供该软件版本->发现自己编译不过,依赖太重->决定 dist-upgrade -> 发现需要跨度N个 release -> 测试 dist-upgrade -> 10台机器,2台成功,8台失败,失败的现象不同 -> 痛苦的解决各种问题-> 成功 dist-upgrade -> 发现公司业务程序需要重新编译->与开发人员沟通 解释升级的重要性 -> 开发人员重新调试、测试一些列用到的库的新版本->交付新版本

CentOS 用户基本是这样的:以下是最近真实对话

“xxx,新闻你看到了么 openssl 爆漏洞了”

“啊?不知道啊,我看看去”

—-

puppet 操作一下 10分钟以后

“老板,补丁已经出来了,更新了,有 ssl 的 apache 都已经自动重启过了”

结束~

 

最后再解释一下,我之前的评论

“不会用就别怪系统不好。推荐 Debian/Ubuntu 跑 Server 是一件很不负责的事情。”

任何 Linux 发行版本,在理论上都是一样的。只不过操作有的方便,有的麻烦!是,yum 是比 apt 弱(这就是企业维护和社区维护的区别,企业自己维护不需要这么多功能)但是任何能在 A 发行版本上实现的效果,一定是能在 B 上实现的。你甚至可以按照玩 Gentoo 的思路玩 CentOS,编译么!你自己打 RPM 啊,你自己缩减依赖关系啊,你可以说麻烦,但是你不可能说不能实现。

所以,我还是要重说一遍:“不会用就别怪系统不好”!这不是歧视,这不是嘲讽,这是让你认清事实之后能把时间花在更加有用的地方!

第二句!“推荐 Debian/Ubuntu 跑 Server 是一件很不负责的事情。” 这是血和泪的教训!你不想听无所谓,但是总有一些人冒着要被戴“不友善”的帽子,也要告诉你这个事实!

我再来补充一句,没有不尊敬的意思。但是大多数圈内用 Gentoo — 类似豆瓣还是 VeryCD 这样的公司,你们当时做出这个决策的人基本上都是把自己的 兴趣 > 公司 利益了。潜在的,这其实是一种不负责任的行为,会直接的导致公司的维护成本的增加。

你真的以为你用 Gentoo 做到的性能,CentOS 做不到么?

你真的以为你们一个小 team 打包的质量会一定比 RH 一家公司的工作人员要牛么?

如果你当时真的这么以为,只能证明你当时还不会用罢了。

如果我今天告诉大家,我要做一个 http 的服务器,我不用 apache 不用 nginx,为了性能我要用 xxx 为基础重写一套出来。我相信绝大多数人会问同样的问题,“你觉得你写的能比 ng 好么?”

再回头看看那时候你们自己吧。

来源:http://www.zhihu.com/question/19599986

Linux:Keepalived 配置和使用

keepalived主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。keepalived主要目的在于,其自身启动一个服务,能够实现工作在双节点或多个节点上,并且可以在内核生效的ipvs规则其中当前持有资源的节点被称为活跃节点,另外的节点被称为备节点被称为 Master/Backup。

 

VRRP(如果有学习过TCPIP,这一块很好理解):

虚拟路由器冗余协议(VRRP)是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器,它负责转发数据包到这些虚拟 IP 地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的 IP 地址可以作为终端主机的默认第一跳路由器。使用 VRRP 的好处是有更高的默认路径的可用性而无需在每个终端主机上配置动态路由或路由发现协议。 VRRP 包封装在 IP 包中发送。

 VRRP优先级别:

	VRRP每个节点是有自己的优先级的,一般优先级是从0-255,数字越大优先级越高因此可以这么定义:假如要有一初始化的状态,其中一节点优先级100另一节点优先级99,那么毫无疑问,谁的优先级高谁就是主节点所有的节点刚启动后上线都是backup状态,需通过选举的方式选择master,如果其他节点没有响应则将自己提升为master
通告机制:如果节点之间master出现故障,其会自动转移当前角色,这时我们的管理员应该知道其已切换角色keepalived支持邮件发送机制,如果其状态发生改变的话可以通过邮件方式发送给管理员,使管理员第一时间可以查看其活动状态,方便之后的运维工作

 keepalived核心组成部分

  1. vrrp的实现
  2. virtual_server:基于vrrp作为所谓通告机制之上的
  3. vrrp_script:以外部脚本方式进行检测

 

keepalived

keepalived

 KeepAlived的安装:

[root@Nginx-one ~]# tar zxf keepalived-1.2.13.tar.gz
[root@Nginx-one ~]# cd keepalived-1.2.13[root@Nginx-one keepalived-1.2.13]# yum install kernel-devel openssl-devel libnl-devel
[root@Nginx-one keepalived-1.2.13]#./configure --prefix=/ --mandir=/usr/local/share/man/--with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64/[root@Nginx-one keepalived-1.2.13]# make && make install
Keepalived configuration
------------------------Keepalived version       :1.2.13        ##version##Compiler: gcc				##编译工具##Compiler flags           :-g -O2	##参数##ExtraLib:-lssl -lcrypto -lcrypt 	##扩展库##Use IPVS Framework:Yes                  ##LVS核心代码框架,不使用LVS可以编译时disable-lvs##
IPVS sync daemon support :Yes           ##IPVS同步进程,是否开启取决于 IPVS FRAMEWORK###
IPVS use libnl           :Yes           ##是否使用libnl库##
fwmark socket support    :Yes           ##套接字框架##Use VRRP Framework:Yes                  ##VRRP框架,keepalived的核心进程vrrpd##Use VRRP VMAC            :Yes           ##VRRP Virtual mac##
SNMP support             :No
SHA1 support             :NoUseDebug flags           :No[root@Nginx-one keepalived-1.2.13]# make && make install

 KeepAlived的所有配置都在一个配置文件里设置,支持的配置可分为以下三类:

1、全局配置(global configure)2、VRRPD配置3、LVS配置

很明显,全局配置就是对整个keepalived生效的配置,不管是否使用LVS,VRRPD是keepalived的核心,LVS配置只在要使用keepalived来配置和管理LVS时使用,如果仅使用keepalived来做HA,LVS不需要配置。配置文件都是以块(block)形式组织的,每个块都在{}范围内,#和!表示注释。

 全局定义(global definition)

global_defs {
   notification_email {##指定keepalived在发生事件(如切换)需要发送Email的对象,多个写多行##
     itchenyi@gmail.com
   }
   notification_email_from itchenyi@gmail.com
   smtp_server 127.0.0.1##SMTP服务器##
   smtp_connect_timeout 30##链接超时时间##
   router_id Nginx-one			##路由标识,这里用主机名##}

 

VRRPD配置(VRRP同步组(syncchroization group) 和 VRRP实例 (VRRP instance))

不 使用SYNC Group的话,如果路由有2个网段,一个内网,一个外网,每个网段开启一个VRRP实例,假设VRRP配置为检查内网,那么当外网出现问题 时,VRRPD会认为自己是健康的,则不会发送Master和Backup的切换,从而导致问题,Sync Group可以把两个实例都放入Sync Group,这样的话,Group 里任何一个实例出现问题都会发生切换。

vrrp_instance VI_1 {   ##虚拟路由标识##
state MASTER           ##初始状态,默认,选举产生后才可以升级为Master ,这里明确定义其为Master##interface eth1         ##选举通过那个网卡接口##
virtual_router_id 10   ##虚拟路由的ID号,一般不大于255,可选IP最后一段使用##
priority 100           ##初始优先级,选举过程中判断的依据,和路由的概念一样##
advert_int 1           ##检查间隔,默认1s##
authentication {       ##认证机制##
auth_type PASS         ##认证方式,PASS为明文##
auth_pass ipython      ##认证密码##}
virtual_ipaddress {    ##虚拟地址池##1.1.1.100}}###后面的配置参数 先删删掉吧###

 

配置Backup 配置如下:

[root@nginx-two keepalived-1.2.13]# cat /software/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
     itchenyi@gmail.com
   }
   notification_email_from itchenyi@gmail.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id nginx-two
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 20
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass ipython
    }
    virtual_ipaddress {
        1.1.1.100
    }
}
###其他配置:####
	nopreempt 设置为不抢占,这个配置只能设置在state为BACKUP的节点上,并且这个机器的优先级必须比另一台高
	preempt_delay 抢占延迟,默认5分钟
	debug debug级别
	notify_master 切换到Master时执行的脚本
##start##
[root@Nginx-one keepalived-1.2.13]# service keepalived start
Starting keepalived:   [  OK  ]
###观察其日志文件###
[root@Nginx-one keepalived-1.2.13]# tail -f /var/log/messages
Aug  3 00:02:12 Nginx-one Keepalived[8177]: Starting Keepalived v1.2.13 (08/03,2014)
Aug  3 00:02:12 Nginx-one Keepalived[8178]: Starting Healthcheck child process, pid=8180
Aug  3 00:02:12 Nginx-one Keepalived[8178]: Starting VRRP child process, pid=8181
####当前的IP地址####
Aug  3 00:02:13 Nginx-one Keepalived_vrrp[8181]: Netlink reflector reports IP 1.1.1.10 added
Aug  3 00:02:13 Nginx-one Keepalived_vrrp[8181]: Netlink reflector reports IP fe80::20c:29ff:fecb:90a2 added
Aug  3 00:02:13 Nginx-one Keepalived_vrrp[8181]: Registering Kernel netlink reflector
Aug  3 00:02:13 Nginx-one Keepalived_vrrp[8181]: Registering Kernel netlink command channel
Aug  3 00:02:13 Nginx-one Keepalived_healthcheckers[8180]: Netlink reflector reports IP 1.1.1.10 added
Aug  3 00:02:13 Nginx-one Keepalived_healthcheckers[8180]: Netlink reflector reports IP fe80::20c:29ff:fecb:90a2 added
Aug  3 00:02:13 Nginx-one Keepalived_healthcheckers[8180]: Registering Kernel netlink reflector
Aug  3 00:02:13 Nginx-one Keepalived_vrrp[8181]: Registering gratuitous ARP shared channel
Aug  3 00:02:13 Nginx-one Keepalived_healthcheckers[8180]: Registering Kernel netlink command channel
Aug  3 00:02:13 Nginx-one Keepalived_vrrp[8181]: Opening file '/etc/keepalived/keepalived.conf'.
Aug  3 00:02:13 Nginx-one Keepalived_vrrp[8181]: Configuration is using : 62834 Bytes
Aug  3 00:02:13 Nginx-one Keepalived_vrrp[8181]: Using LinkWatch kernel netlink reflector...
Aug  3 00:02:13 Nginx-one Keepalived_vrrp[8181]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
###打开并加载配置文件####
Aug  3 00:02:13 Nginx-one Keepalived_healthcheckers[8180]: Opening file '/etc/keepalived/keepalived.conf'.
Aug  3 00:02:13 Nginx-one Keepalived_healthcheckers[8180]: Configuration is using : 7377 Bytes
Aug  3 00:02:13 Nginx-one Keepalived_healthcheckers[8180]: Using LinkWatch kernel netlink reflector...
####切换为Master 状态####
Aug  3 00:02:14 Nginx-one Keepalived_vrrp[8181]: VRRP_Instance(VI_1) Transition to MASTER STATE
Aug  3 00:02:15 Nginx-one Keepalived_vrrp[8181]: VRRP_Instance(VI_1) Entering MASTER STATE
Aug  3 00:02:15 Nginx-one Keepalived_vrrp[8181]: VRRP_Instance(VI_1) setting protocol VIPs.
####在接口上添加VIP###
Aug  3 00:02:15 Nginx-one Keepalived_vrrp[8181]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 1.1.1.100
Aug  3 00:02:15 Nginx-one Keepalived_healthcheckers[8180]: Netlink reflector reports IP 1.1.1.100 added
Aug  3 00:02:20 Nginx-one Keepalived_vrrp[8181]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 1.1.1.100
###查看是否添加VIP###
[root@Nginx-one keepalived-1.2.13]# ip a show|awk '/inet /'
    inet 127.0.0.1/8 scope host lo
    inet 1.1.1.10/8 brd 1.255.255.255 scope global eth1
    inet 1.1.1.100/32 scope global eth1
停止MASTER,查看BACKUP的状态转移
[root@Nginx-one keepalived-1.2.13]# service keepalived stop
Stopping keepalived:                                       [  OK  ]
[root@nginx-two keepalived-1.2.13]# tail -f /var/log/messages
Aug  3 00:05:01 nginx-two Keepalived_vrrp[5148]: Using LinkWatch kernel netlink reflector...
Aug  3 00:05:01 nginx-two Keepalived_vrrp[5148]: VRRP_Instance(VI_1) Entering BACKUP STATE
Aug  3 00:05:01 nginx-two Keepalived_healthcheckers[5147]: Using LinkWatch kernel netlink reflector...
Aug  3 00:05:01 nginx-two Keepalived_vrrp[5148]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
Aug  3 00:05:40 nginx-two Keepalived_vrrp[5148]: VRRP_Instance(VI_1) Transition to MASTER STATE
Aug  3 00:05:41 nginx-two Keepalived_vrrp[5148]: VRRP_Instance(VI_1) Entering MASTER STATE
Aug  3 00:05:41 nginx-two Keepalived_vrrp[5148]: VRRP_Instance(VI_1) setting protocol VIPs.
Aug  3 00:05:41 nginx-two Keepalived_healthcheckers[5147]: Netlink reflector reports IP 1.1.1.100 added
Aug  3 00:05:41 nginx-two Keepalived_vrrp[5148]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 1.1.1.100
Aug  3 00:05:46 nginx-two Keepalived_vrrp[5148]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 1.1.1.100
####和路由协议一样,当MASTER上线被检测到会抢占VIP,可以想象的到,Keepalived也支持非抢占模式,只有BACKUP在变成MASTER后宕机了,才会转移VIP,说起来怎么这么绕口####

 

定义Keepalived的检测机制

###一只简单的脚本判断nginx 是否在工作###[root@nginx-two ~]# cat nginx_check.sh
#!/bin/bash
alive=`netstat -pant|awk '/0.0.0.0:80/&&/LISTEN/'|wc -l`if[ $alive -eq 1];then   exit 0else   exit 1 fi###增加keepalived配置###
vrrp_script nginx_check
{
    script "/root/nginx_check.sh"
    interval 1      ###检测时间间隔 1s###
    weigh -60      ###如果条件成立,权重-60###}####将track_script块加入instance 配置块####
    track_script
    {
        nginx_check
    }[root@Nginx-one ~]# service keepalived restart
Stopping keepalived:[  OK  ]Starting keepalived:[  OK  ]###无须质疑,只要nginx 的80端口是正常监听的,主就还是主###[root@Nginx-one ~]# ip a show|awk '/inet /'
    inet 127.0.0.1/8 scope host lo
    inet 1.1.1.10/8 brd 1.255.255.255 scope global eth1
    inet 1.1.1.100/32 scope global eth1
###停止Nginx服务###[root@Nginx-one ~]# service nginx stop
Stopping nginx:[  OK  ]###看看日志###Aug300:52:13Nginx-one Keepalived_vrrp[8490]: VRRP_Script(nginx_check) failed
Aug300:52:14Nginx-one Keepalived_vrrp[8490]: VRRP_Instance(VI_1)Entering FAULT STATE
Aug300:52:14Nginx-one Keepalived_vrrp[8490]: VRRP_Instance(VI_1) removing protocol VIPs.Aug300:52:14Nginx-one Keepalived_vrrp[8490]: VRRP_Instance(VI_1)Nowin FAULT state
Aug300:52:14Nginx-one Keepalived_healthcheckers[8489]:Netlink reflector reports IP 1.1.1.100 removed
###Backup机器变成Master了###[root@nginx-two ~]# ip a show|awk '/inet /'
    inet 127.0.0.1/8 scope host lo
    inet 1.1.1.20/8 brd 1.255.255.255 scope global eth1
    inet 1.1.1.100/32 scope global eth1
 

来源:http://www.ipython.me/centos/keepalived-config-using.html

Linux:东半球最先进的debug技巧

Linux:东半球最先进的debug技巧
Linux:东半球最先进的debug技巧

不论是什么行业里,能让人最兴奋的事情通常都是解决新奇的、高难度问题带来的刺激。在我的工作中,经常会遇到很多bug,乍一看,它们都是不可能的。不是不可能解决,而是完全不可能出现。就好象最前沿的科技揭示了一个新的奇怪的逻辑现象,以至于人的大脑完全无法理解。

当然,这里我总结的这些bug都是很独特的,如果你想说是否能有某种最先进的系统性的方法能将这些bug归类,统一解决,那是愚蠢的,就好象一个人无法认识到自己在犯错而避免过错一样。不管怎样,下面的这些debug原则对我是十分有效的,而且我相信,对大多数程序员也都是有效的。

  • 你改错了文件
  • 你改对了文件,但却是在别人的机器上
  • 你改对了文件,但忘了保存
  • 你该对了文件,但忘了重新编译
  • 你认为你把那个东西开启了,但实际上你把它关闭了
  • 你认为你把那个东西关闭了,但实际上你把它开启了
  • 会议中,你应该用心听。
  • 你运行了错误的版本
  • 你运行了正确的版本,但却是在别人的机器上
  • 你改正了问题,但忘了提交
  • 你改正了问题,也提交了,但忘了push到版本库中
  • 你改正了问题,也提交了,也push了。然而,很多用户的工作都依赖于之前有问题的版本,于是你必须回滚。

我非常虔诚的向大家奉送这些debug原则,任何一次debug都不可能只使用其中的一个方法解决。我真挚的希望大家通过对这些debug原则的思考能获得意想不到的收获。

来源:http://www.techug.com/cutting-edge-debugging

Linux:简捷安装Tor浏览器到Ubuntu 14.04和Linux Mint 17中

Linux:简捷安装Tor浏览器到Ubuntu 14.04和Linux Mint 17中
Linux:简捷安装Tor浏览器到Ubuntu 14.04和Linux Mint 17中

牢记美国国家安全局对全世界政府和国民的窥视的尴尬结局吧,隐私日益成为许多人关心的焦点。如果你也关注在线安全性并想要保护自己不受网络监视,Tor项目是当前可用的最佳选择。

Tor项目有它自己的Tor浏览器,该浏览器基于Firefox并开启了用户隐私保护配置,并通过捆绑Tor和Vidalia工具进行匿名访问。。虽然你可以下载Tor浏览器并使用源码安装,但是我们将介绍一种更为便捷的方式,来将它安装到Ubuntu 14.04和Linux Mint 17中。

如何在Ubuntu 14.04和Linux Mint 17中安装Tor浏览器

多亏了Webupd8,我们可以方便地通过PPA将Tor浏览器到Ubuntu和其它基于Ubuntu的OS中(如果你对源代码安装很感冒)。打开终端(Ctrl+Alt+T)并使用以下命令进行安装:

sudo add-apt-repository ppa:webupd8team/tor-browser
sudo apt-get update
sudo apt-get install tor-browser

以上PPA在Ubuntu 12.04和其它基于该版本的Linux发行版中可合法使用。

卸载Tor浏览器

如果你想要卸载Tor浏览器,使用下面的命令即可:

sudo apt-get remove tor-browser
rm -r ~/.tor-browser-en

我希望这个快速测试对你在Ubuntu 14.04和Linux Mint 17中便捷安装Tor浏览器有所帮助。如有任何问题或者建议欢迎随时提出。


via: http://itsfoss.com/install-tar-browser-ubuntu-linux-mint-17/

作者:Abhishek 译者:GOLinux 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3566-1.html

Linux:解决DNS污染与劫持之使用特殊DNS端口

Linux:解决DNS污染与劫持之使用特殊DNS端口
Linux:解决DNS污染与劫持之使用特殊DNS端口

os:ubuntu 12.04 LTS

软件:dnsmasq

dns测试:

dig www.facebook.com @8.8.8.8 +short
37.61.54.158  

在wiki词条域名服务器缓存污染中可以发现37.61.54.158在虚假ip地址中,说明此dns已遭污染。

dig www.facebook.com @208.67.222.222 -p 443
31.13.79.49  

31.13.79.49为facebook的正确地址。google的dns服务不支持特殊端口查询,但opendns支持,其ip为208.67.222.222,208.67.222.220,支持的特殊端口为443,5353。

在ubuntu中,我们可以用dnsmasq来指定被污染ip用特殊端口查询.

从Ubuntu 12.04开始网络管理器默认开启了dnsmasq,但出于安全的考虑没有开启其缓存功能。这个改动至少在我这里导致了一些问题,比如偶尔出现网速变慢。 经过尝试,可以完全禁用该服务,或者设置使用谷歌DNS服务,同时开启dnsmasq的本地缓存(可以大幅提高重复访问网站时的响应速度)。

完全禁用的方法:

sudo vim /etc/NetworkManager/NetworkManager.conf

注释掉里面的dns=dnsmasq然后重启网络管理器

sudo restart network-manager

重新安装完整dnsmasq:

sudo apt-get install dnsmasq

 然后

sudo vi /etc/resolv.conf

 确保resolv.conf内容为:

nameserver 127.0.0.1

 然后

sudo vim /etc/dnsmasq.conf

直接在文件最后添加:

listen-address=127.0.0.1
bind-interfaces
cache-size=100000
domain-needed
resolv-file=/etc/resolv.dnsmasq
server=/facebook.com/208.67.222.222#5353 

 其中

server=/facebook.com/208.67.222.222#5353

即可指定访问facebook网站时向opendns的5353端口进行dns请求,以此类推。这个设置支持泛解析,比如

server=/com/208.67.222.222#5353

即指定所有.com域名。

重启dnsmasq:

sudo service dnsmasq restart

 再测试dns:

dig www.facebook.com +short

 若返回31.13.79.49或其他不在虚假ip表里的ip即成功。


ps:用命令

ps -fC dnsmasq|more

 查阅得知dnsmasq在ubuntu中的dns设置在/var/run/dnsmasq/resolv.conf中。dnsmasq的日志记录在/var/log/syslog中。

来源:http://www.cnblogs.com/jnxb/p/3900013.html

Linux:Linux系统中‘dmesg’命令处理故障和收集系统信息的7种用法

‘dmesg’命令显示linux内核的环形缓冲区信息,我们可以从中获得诸如系统架构、cpu、挂载的硬件,RAM等多个运行级别的大量的系统信息。当计算机启动时,系统内核(操作系统的核心部分)将会被加载到内存中。在加载的过程中会显示很多的信息,在这些信息中我们可以看到内核检测硬件设备。

Linux:Linux系统中‘dmesg’命令处理故障和收集系统信息的7种用法
Linux:Linux系统中‘dmesg’命令处理故障和收集系统信息的7种用法

dmesg 命令的使用范例

‘dmesg’命令设备故障的诊断是非常重要的。在‘dmesg’命令的帮助下进行硬件的连接或断开连接操作时,我们可以看到硬件的检测或者断开连接的信息。‘dmesg’命令在多数基于LinuxUnix的操作系统中都可以使用。

下面我们展示一些最负盛名的‘dmesg’命令工具以及其实际使用举例。‘dmesg’命令的使用语法如下。

# dmesg [options...]

1. 列出加载到内核中的所有驱动

我们可以使用如‘more’。 ‘tail’, ‘less ’或者‘grep’文字处理工具来处理‘dmesg’命令的输出。由于dmesg日志的输出不适合在一页中完全显示,因此我们使用管道(pipe)将其输出送到more或者less命令单页显示。

[root@tecmint.com ~]# dmesg | more
[root@tecmint.com ~]# dmesg | less

输出

[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.11.0-13-generic (buildd@aatxe) (gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 17:26:33 UTC 2013
(Ubuntu 3.11.0-13.20-generic 3.11.6)
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   NSC Geode by NSC
[    0.000000]   Cyrix CyrixInstead
[    0.000000]   Centaur CentaurHauls
[    0.000000]   Transmeta GenuineTMx86
[    0.000000]   Transmeta TransmetaCPU
[    0.000000]   UMC UMC UMC UMC
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[    0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000007dc08bff] usable
[    0.000000] BIOS-e820: [mem 0x000000007dc08c00-0x000000007dc5cbff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x000000007dc5cc00-0x000000007dc5ebff] ACPI data
[    0.000000] BIOS-e820: [mem 0x000000007dc5ec00-0x000000007fffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fed003ff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fed20000-0x00000000fed9ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000feefffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ffb00000-0x00000000ffffffff] reserved
[    0.000000] NX (Execute Disable) protection: active
.....

2. 列出所有被检测到的硬件

要显示所有被内核检测到的硬盘设备,你可以使用‘grep’命令搜索‘sda’关键词,如下:

[root@tecmint.com ~]# dmesg | grep sda
[    1.280971] sd 2:0:0:0: [sda] 488281250 512-byte logical blocks: (250 GB/232 GiB)
[    1.281014] sd 2:0:0:0: [sda] Write Protect is off
[    1.281016] sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00
[    1.281039] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[    1.359585]  sda: sda1 sda2 < sda5 sda6 sda7 sda8 >
[    1.360052] sd 2:0:0:0: [sda] Attached SCSI disk
[    2.347887] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
[   22.928440] Adding 3905532k swap on /dev/sda6.  Priority:-1 extents:1 across:3905532k FS
[   23.950543] EXT4-fs (sda1): re-mounted. Opts: errors=remount-ro
[   24.134016] EXT4-fs (sda5): mounted filesystem with ordered data mode. Opts: (null)
[   24.330762] EXT4-fs (sda7): mounted filesystem with ordered data mode. Opts: (null)
[   24.561015] EXT4-fs (sda8): mounted filesystem with ordered data mode. Opts: (null)

注解 ‘sda’表示第一块 SATA硬盘,‘sdb’表示第二块SATA硬盘。若想查看IDE硬盘搜索‘hda’或‘hdb’关键词。

3. 只输出dmesg命令的前20行日志

在‘dmesg’命令后跟随‘head’命令来显示开始几行,‘dmesg | head -20′命令将显示开始的前20行。

[root@tecmint.com ~]# dmesg | head  -20
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.11.0-13-generic (buildd@aatxe) (gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 17:26:33 UTC 2013 (Ubuntu 3.11.0-13.20-generic 3.11.6)
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   NSC Geode by NSC
[    0.000000]   Cyrix CyrixInstead
[    0.000000]   Centaur CentaurHauls
[    0.000000]   Transmeta GenuineTMx86
[    0.000000]   Transmeta TransmetaCPU
[    0.000000]   UMC UMC UMC UMC
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
[    0.000000] BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000007dc08bff] usable
[    0.000000] BIOS-e820: [mem 0x000000007dc08c00-0x000000007dc5cbff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x000000007dc5cc00-0x000000007dc5ebff] ACPI data
[    0.000000] BIOS-e820: [mem 0x000000007dc5ec00-0x000000007fffffff] reserved

4. 只输出dmesg命令最后20行日志

在‘dmesg’命令后跟随‘tail’命令(‘ dmesg | tail -20’)来输出‘dmesg’命令的最后20行日志,当你插入可移动设备时它是非常有用的。

[root@tecmint.com ~]# dmesg | tail -20
parport0: PC-style at 0x378, irq 7 [PCSPP,TRISTATE]
ppdev: user-space parallel port driver
EXT4-fs (sda1): mounted filesystem with ordered data mode
Adding 2097144k swap on /dev/sda2.  Priority:-1 extents:1 across:2097144k
readahead-disable-service: delaying service auditd
ip_tables: (C) 2000-2006 Netfilter Core Team
nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
NET: Registered protocol family 10
lo: Disabled Privacy Extensions
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Slow work thread pool: Starting up
Slow work thread pool: Ready
FS-Cache: Loaded
CacheFiles: Loaded
CacheFiles: Security denies permission to nominate security context: error -95
eth0: no IPv6 routers present
type=1305 audit(1398268784.593:18630): audit_enabled=0 old=1 auid=4294967295 ses=4294967295 res=1
readahead-collector: starting delayed service auditd
readahead-collector: sorting
readahead-collector: finished

5. 搜索包含特定字符串的被检测到的硬件

由于‘dmesg’命令的输出实在太长了,在其中搜索某个特定的字符串是非常困难的。因此,有必要过滤出一些包含‘usb’ ‘dma’ ‘tty’ ‘memory’等字符串的日志行。grep 命令 的‘-i’选项表示忽略大小写。

[root@tecmint.com log]# dmesg | grep -i usb
[root@tecmint.com log]# dmesg | grep -i dma
[root@tecmint.com log]# dmesg | grep -i tty
[root@tecmint.com log]# dmesg | grep -i memory

输出

[    0.000000] Scanning 1 areas for low memory corruption
[    0.000000] initial memory mapped: [mem 0x00000000-0x01ffffff]
[    0.000000] Base memory trampoline at [c009b000] 9b000 size 16384
[    0.000000] init_memory_mapping: [mem 0x00000000-0x000fffff]
[    0.000000] init_memory_mapping: [mem 0x37800000-0x379fffff]
[    0.000000] init_memory_mapping: [mem 0x34000000-0x377fffff]
[    0.000000] init_memory_mapping: [mem 0x00100000-0x33ffffff]
[    0.000000] init_memory_mapping: [mem 0x37a00000-0x37bfdfff]
[    0.000000] Early memory node ranges
[    0.000000] PM: Registered nosave memory: [mem 0x0009f000-0x000effff]
[    0.000000] PM: Registered nosave memory: [mem 0x000f0000-0x000fffff]
[    0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
[    0.000000] Memory: 2003288K/2059928K available (6352K kernel code, 607K rwdata, 2640K rodata, 880K init, 908K bss, 56640K reserved, 1146920K highmem)
[    0.000000] virtual kernel memory layout:
[    0.004291] Initializing cgroup subsys memory
[    0.004609] Freeing SMP alternatives memory: 28K (c1a3e000 - c1a45000)
[    0.899622] Freeing initrd memory: 23616K (f51d0000 - f68e0000)
[    0.899813] Scanning for low memory corruption every 60 seconds
[    0.946323] agpgart-intel 0000:00:00.0: detected 32768K stolen memory
[    1.360318] Freeing unused kernel memory: 880K (c1962000 - c1a3e000)
[    1.429066] [drm] Memory usable by graphics device = 2048M

6. 清空dmesg缓冲区日志

我们可以使用如下命令来清空dmesg的日志。该命令会清空dmesg环形缓冲区中的日志。但是你依然可以查看存储在‘/var/log/dmesg’文件中的日志。你连接任何的设备都会产生dmesg日志输出。

[root@tecmint.com log]# dmesg -c

7. 实时监控dmesg日志输出

在某些发行版中可以使用命令‘tail -f /var/log/dmesg’来实时监控dmesg的日志输出。

[root@tecmint.com log]# watch "dmesg | tail -20"

结论:dmesg命令在系统dmesg记录实时更改或产生的情况下是非常有用的。你可以使用man dmesg来获取更多关于dmesg的信息。


Narad Shrestha

他在IT领域拥有超过10年的丰富经验,其中包括各种Linux发行版,开源软件和网络工作。 Narad始终坚持与他人分享IT知识和自如地运用新技术。


via: http://www.tecmint.com/dmesg-commands/

译者:cvsher 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3587-1.html

Linux:命令行星期二——第七部分

嗨,极客们,我已经检查了我们的课程,今天我们在八章课程里的第七部分。这就是说下周二我们还有一次课程,但也是最后一次“命令行星期二”课程。所以,今天,我们讨论一些关于权限的问题!

Linux:命令行星期二——第七部分
Linux:命令行星期二——第七部分

众所周知,一台机器可能会有多名用户共同使用。为了保证用户之间互不干扰,就需要分配不同的权限。我们已经讨论了文件权限的问题,你可以轻轻点此回顾一下:

Linux:命令行星期二——第七部分
Linux:命令行星期二——第七部分

chmod

chmod命令被用来修改目录或者文件的权限。为了修改权限,首先你得输入chmod命令,之后你得输入规范的权限修改,然后你就可以把目录或者文件的权限修改成你想要的。这可以采用多种方式完成,但是肖茨先生喜欢八进制表示法。

把权限想象成一系列的位,每一个不为空的权限槽就是1,空的权限槽就是0。举个例子:

rwx = 111
rw- = 110

等等

看一下二进制表示法:

rwx = 111 --> in binary = 7
rw- = 110 --> in binary = 6
r-x = 101 --> in binary = 5
r-- = 100 --> in binary = 4

现在,如果你想把一个文件的权限改为:文件所有者和文件所有组拥有读,写,执行权限,但是其他用户没有该文件任何权限,我们可以这样做:

chmod 770 example_file

su 和 sudo

有些时候普通用户需要成为超级用户,这样才能完成一些任务(通常是一些安装软件任务)。为了暂时的获取超级用户权限,我们可以使用su程序,输入:

su

输入你的超级用户密码,你就成为超级用户了。但是,警告:别忘记用一会之后(不需要的话)就退出超级用户模式。

在openSUSE和Ubuntu也其它的一些可选工具,它叫做sudo,sudo只是在某些方面和su不同,它是分配给制定用户的特殊命令,不像su,你可以用你自己用户的密码执行sudo,而不需要超级用户密码,举个例子:

sudo zypper in goodiegoodie

修改文件和组所有权

想要改变文件的所有者,你可以在超级用户模式下运行chown,举个例子,如果我想把文件的所有权从‘nenad’改为‘suse’,我可以这样做:

su
[输入密码]
chown suse example_file

同样地,我也可以改变组的所有权,使用稍有不同的chgrp命令,很简单:

chgrp suse_group example_file

下一次

正如我所阐述的,下一次我们就会结束这个系列。在此之后,相信你会做出自己的选择,和我一起徜徉在终端的黑暗之中,只有一个绿色的闪烁光标作为灯塔。在那之前,极客们,记住

….享受更多的乐趣!


via: https://news.opensuse.org/2014/08/05/command-line-tuesdays-part-seven/

作者:Nenad Latinović 译者:su-kaiyao 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3588-1.html

Linux:一个purge参数引发的惨案——从线上hbase数据被删事故说起

在写这篇blog前,我的心情久久不能平静,虽然明白运维工作如履薄冰,但没有料到这么一个细小的疏漏会带来如此严重的灾难。这是一起其他公司误用puppet参数引发的事故,但是这个参数我也曾被“坑过”。

Linux:一个purge参数引发的惨案——从线上hbase数据被删事故说起
Linux:一个purge参数引发的惨案——从线上hbase数据被删事故说起

先说说这起事故,在周二下午,安静了一天的某个技术交流群,突然有个惊慌失措的同学在群里说,他拿第三方的puppet hbase module来管理线上hbase集群,结果这个模块在管理数据文件夹时,使用了一个purge参数把几乎所有的线上数据都删完了。他已经和领导汇报了情 况,那边正在紧急讨论处理方案。他在做好打包走人的准备的同时,仍抱有一丝希望来询问我们有没有办法恢复数据,大家纷纷为他献计献策… 我就想起两年前,我第一次尝试使用puppet-apache模块管理apache服务,apache::init类中默认设置了purge_configs参数为True,导致我把apache目录下的所有vhost文件删掉了,万幸的是我是在开发环境发现了这个问题。   那么,我们来看看这个“邪恶”的purge参数是什么样子的:

file  {'/var/lib/data_directory':
   xxxx => xxx,
   ......
   recurse => true,
   purge => true
}

 file是puppet的默认resource type,用于管理文件或者文件夹。在管理文件夹时,只有当设置了recurse为true的情况下,purge参数才会生效。这段逻辑的意思是要清空 /var/lib/data_directory目录下所有非puppet管理的文件,purge参数通常的目的是清理管理目录以及防止被他人恶意添加本不该存在的文件。但也因为这段逻辑,就把hbase数据目录下的文件全部清空了。 从这次事故中,我们可以看到很多问题: 1. 部署代码的上线居然没有通过开发和测试环境的验证2. 使用第三方模块时,竟然不阅读源码或者README文件,也没有运行测试3. 上线没有审批流程,上线负责人的失职4. …..  首先,有一个观念需要矫正,有些人认为部署逻辑不属于开发范畴,往往编写后就直接上线,其实只要涉及到代码的变更,无论是业务逻辑还是部署逻辑,都需要通过开发环境和测试环境的验证。那么如何做好部署逻辑的验证工作? 对于编写puppet来实现部署逻辑的工程师来说:少一个花括号或者分号,就可能导致代码无法运行;遗漏某个class或者某个参数就会使节点 无法到达期望的状态;错误的执行顺序,甚至可能会导致系统崩溃或者网络不可达。为如何保证所编写的manifests符合你的预期? 

1. 语法检查

 和其他的编程语言一样,语法检查是基本步骤,因此使用puppet解析器做语法检查是最基础也是必不可少的验证工作。你可以使用puppet parser validate命令来检查某个manifest文件: 例如,我在logserver.pp中的$eth0_netmask变量后面漏掉了逗号:

puppet parser validate logserver.pp
Error: Could not parse for environment production: Syntax error at 'eth0_netmask' at sunfire/manifests/logserver.pp:6:3

 对于erb template,你可以使用 erb -P -x -T ‘-‘ $1 | ruby -c命令来做检查。我在route-eth.erb中漏掉了if判断语句的结束标记,此时执行语法检测会发生以下提示:

route-eth.erb:1: syntax error, unexpected '<'
<%= @internal_network %> via <%= @internal_gateway %>

 

2. 代码风格检查

  每个语言都有一套规范的语法风格指南,puppet也不例外:https://docs.puppetlabs.com/guides/style_guide.htm我们可以使用Github的Tim sharpe所开发的puppet-lint工具来分析你所写的manifests文件。 例如检查一个manifests文件: 

puppet-lint manifests/init.pp
WARNING: class inheriting from params class on line 339
WARNING: line has more than 80 characters on line 47
WARNING: line has more than 80 characters on line 167

 如果你希望检查整个puppet mainifest目录,你需要添加: require ‘puppet-lint/tasks/puppet-lint’ 到Rakefile里,然后运行rake lint即可。 在某些情况下,你不得不关闭某些检查,例如,想要关闭80 character check,你可以如下运行: 

puppet-lint --no-80chars-check /path/to/my/manifest.pp

需要注意的是,puppet-lint仅作代码风格的检查,不能替代语法检查。

 

 3. 模块测试

  你可以使用rspec来确保所有的模块符合预期。举一个例子,你希望编写一个测试来确保当使用puppet-keystone模块时,keystone包被正确地安装,系统中添加了keystone用户和组,可以编写一个keystone_spec.rb文件来做测试:

     it { should contain_package('keystone').with(
        'ensure' => param_hash['package_ensure']
      ) }
      it { should contain_group('keystone').with(
          'ensure' => 'present',
          'system' => true
      ) }
      it { should contain_user('keystone').with(
        'ensure' => 'present',
        'gid'    => 'keystone',
        'system' => true
      ) } 

 随后执行rspec来验证这些测试能否通过。

如果希望集成到rake命令中去,我们可以在Rakefile里添加:

require 'puppetlabs_spec_helper/rake_tasks'

 随后使用以下命令来完成相应的spec执行模块测试:

rake spec              # Run spec tests in a clean fixtures directory
rake spec_clean        # Clean up the fixtures directory
rake spec_prep         # Create the fixtures directory
rake spec_standalone   # Run spec tests on an existing fixtures directory

 

因此,在使用从github或者puppetforge下载的module时,阅读README和测试用例是非常重要的,如果我当时仔细阅读了 apache::init的测试用例,也不会出现所谓被坑的问题,因为人家明明在apache_spec.rb里写有对/etc/apache /sites-enabled目录的测试:

    it { should contain_file("/etc/httpd/conf.d").with(
      'ensure'  => 'directory',
      'recurse' => 'true',
      'purge'   => 'true',
      'notify'  => 'Class[Apache::Service]',
      'require' => 'Package[httpd]'
      )
    }

 

4.开发环境和测试环境的验证

最终部署逻辑能否上线到生产环境,还需要在开发环境和测试环境进行验证。可以使用目前流行的vagrant,Openstack等工具搭建一个测试 平台,调用API创建符合生产环境的集群,通过puppet做软件安装和配置,验证部署逻辑是否符合预期。开发环境和测试环境的不同点在于,测试环境的所 有变更与线上环境完全一致,不允许有任何的人工干预。

至此,一个通过验证的puppet部署逻辑可以release了,打上tag,可以准备发布到线上了。当然不能少了线上变更流程,写下在此次线上变更的详细操作以及回滚机制。

来源:http://www.cnblogs.com/yuxc/p/3909066.html

Linux:面向对象分析与设计—四色原型模式(彩色建模、领域无关模型)

1.背景介绍

至今我都清楚的记得我第一次被面试官问起什么叫”建模“技术时的情景,那是好 几年前的事情了,当时是胸有成竹的去面试一个有关系统分析、设计的.NET高级软件工程师岗位。面试官几乎没问我有关.NET方面的任何技术实现,他就简 单的问了问:“你如何把握你所分析出来的系统的正确性?”,我当时有点小激动,觉得这个问题应该很简单嘛,都是概念而已,让他直接点问,结果他来一句: “你懂建模吗?,能给我解释一下建模的作用吗?“,接着他出了一个小例子,让我对这个例子进行建模,要考虑到各种扩展性、业务稳定性的关键点,要边建模边 说出为什么要这么建模,要说出思路。他最后重点强调了一下:“创建出来的模型是不允许跟任何具体的代码、工具有关联的”。

在我现在看来,他的意思也就是说创建出来的UML类图模型是领域无关模型(领域通用模型),可以用任何一种编程技术去实现他,作为建模者不需要考虑这些实现细节,考虑的越多越容易分散你对真实业务的等价建模,容易犯技术人员的通病(用技术的思维来考虑业务)。

我当时心想这个容易啊,不就是用UML搞点图出来做做秀嘛,体现出分析、设计 的高端嘛,其他还能有啥作用;其实我当时之所以这么想是因为我对UML、建模也尝试过学习、理解和运用,结果我发现这就是一个作秀的工具罢了,对这个东西 很不屑,甚至对软件工程中的“建模”领域有一种抵触心理。

我当时随口说了一些我学习UML建模时的心得,心想这个也就是最终答案了,因为它确实就是这个作用(”作秀“),然后我通过代码驱动建模,倒着推导出UML的类图,结果和我意料的差不多;基本上都覆盖了这个小例子的几大方面,反正面试官不知道我是如何得出这个UML类图的,只有天知道,我是通过先构建代码模型然后反方向推到出类图模型的,嘴上说的跟心理想的完全是相反的。

在我感觉非常良好的等着面试官接着问下一个问题的时候,情况出现了。面试官说 我漏掉了东西,说我没有充分考虑到业务场景,没有将业务概念中的关键概念划分清楚,甚至疏忽了很重小的领域实体属性,按照我这个模型图开发出来的软件是不 能够满足现在的业务要求的。我当时就蒙了,啥叫关键概念,哪个概念不是关键概念啊,又有哪里不能用了,心理有点委屈,一时不理解,觉得面试官在为难我。

其实我现在能明白当时面试官说的是什么意思,他是指我未能清晰的表达出各个类 的职责,看上去每个类扮演的角色都是一样的,无非就是属性、方法这些类元素,我未能捕获到核心领域概念,未能站在领域考虑建模,而是站在代码的层面上来从 低往上看的,很多东西是看不清楚的,说白了,开发人员拿到这个类图能否明白自己将要面对的领域,如果能明白,此时类图模型是健康的,如果不明白那就是有问 题的,因为模型图不是给自己看的,而是给整个团队交流共享的。

后来我自己调整了一下心情,就算面试失败我也要有总结才行,面试本来就是一个被虐的过程。(“佛曰:此时正是修行时”,就当是锻炼好了。)

我虚心的向面试官请教我这个模型图哪里有问题,他指出了有可能我这辈子都无法 看见的分析盲点,他说这个问题是程序员用技术思维来分析建模的通病。为什么他能看见这些盲点,而我不能,我很想知道这其中的精髓,我当时就要求降薪到这里 来学习,面试官不降薪愿意让我过来,他也是一个对技术有追求的人吧。但是后来我有特殊事情未能去贵公司就职,此后我一直遗憾,这个建模精髓我有可能一辈子 都搞不懂了。

现在我能明白,其实如果用代码级别的分析思维来辅助你建模就一定会有盲点,因 为代码级别的“设计模式”,“设计原则”并非建模时的“分析模式”,这是两个不同的问题域,也就是说彼此用在不同的业务领域的,不能够一概而论,如果交叉 使用就会误导你目前的重心,你会往里面添油加醋。

“建模”这个非常抽象且神圣的词是多么的霸气,貌似是已经触及软件工程的最高境界了;崇拜,自卑;搞软件开发也有几年了,居然连建模都不懂;那一夜我彻底失眠了,从那以后我在技术上充满了无助感,为什么?因为我已经清楚自己要想在软件领域有一定的成果,必须学会对真实世界建模,从那开始”建模“一词在我脑子的已经和UML关系不大了。

之后我在软件分析、设计的海洋里苦苦寻找这个曾经在我面前就像流星一样划过的”建模金钥匙“,有了它我就可以去一个神圣的世界。辗转反侧几年过去了,在前不久我终于知道“建模的金钥匙”是什么了,这类东西在网络上很少见,写的很少,下面我们来详细了解它。

2.问自己,UML对你来说有意义吗?它帮助过你对系统的分析、建模吗?

我想学过软件开发的人都多多少少了解UML,简单讲它就是一个用来建模的语言,你可以纯粹的把它理解成是一个画图工具,定义了一些元素,用来表达不同的概念。这里我们关心的是UML类图,也就是用来进行面向对象结构建模用的,通过各种不同的图形来表达抽象的对象结构。

图1:简单的订单类图

Linux:面向对象分析与设计—四色原型模式(彩色建模、领域无关模型)
Linux:面向对象分析与设计—四色原型模式(彩色建模、领域无关模型)

上图是一个很简单的“订单”与“产品”相关的类图,我们都能懂这里面的意思, 因为我们对这块的业务很了解;知道在什么地方应该有什么,比如Order中的计算商品总价的算法,有相关业务背景的人都知道这里是会存在的极大逻辑变化的 地方,所以我们需要通过接口来隔离这块逻辑。

我们之所以能够画出这张类图跟UML这个语言本身其实没关系,重要的是你对相 关的业务非常之了解,在你脑子里可以不使用UML来建模,你可以用任何一个草图来建模,也就是说UML并不等于建模,这个要清楚的认识。那我们使用UML 有何用?它并没有帮助我们来分析系统;没错,UML从某个角度讲它没有直接帮助我们对系统尽心分析建模,帮助我们分析建模的是那些业务知识,懂业务的人可 以不使用UML来建模,随便用一种图形表示法来说明业务概念即可。其实UML只不过是一个通用的模型表达语言而已,是用来帮助我们交流模型用的,并非是建 模的思想和方法。

既然UML不能够帮助我们分析系统,那我们如何才能准确的建模出我们不是很熟 悉的领域呢?我们必须承认,领域专家如果懂技术肯定是建模的最适合人选,但是现实并非这样,需要我们技术人员去熟悉领域然后创建模型,但是这中间难免会漏 掉重要的业务概念,因为毕竟从真实的业务到最终的模型是有一个过程的,而最让我们无助的是在这个过程中没有任何可行的指导思想可以借鉴的,只有通过经验来 把握最终的质量。

总是通过经验来建模不符合软件行业的发展方法,显然不行,这种建模技术难道不可以传递吗?答案是可以传递的,说明这个可以传递的技术正是本文的目的。我们继续往下看。

3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及

上节中其实已经抛出建模的核心问题域了,只不过不是很明显;我们用本节来重点突出这个长久以来一直困扰我们建模者的问题域,以引起我们对它的重视,因为它也是软件工程中的一个重要的研究领域。

如本节标题所说,其实我们被一个建模时所产生的一个缝隙隔开了,而这个缝隙很长一段时间内没有人关注过,也没有引起相关重视,所以导致我们的建模技术很难提升。

建模是一个过程,这个过程大概是这样子的,需要我们将真实的业务场景准确的用某种建模语言表达出来,换句话说用什么建模语言表达出来很容易,重点是如何得出这个模型,而得出这个模型的过程就是我们这里所说的建模缝隙。

图2:

Linux:面向对象分析与设计—四色原型模式(彩色建模、领域无关模型)
Linux:面向对象分析与设计—四色原型模式(彩色建模、领域无关模型)

从“业务概念”到“类模型”中间夹着一个“建模过程”,这个地方其实一直以来 就是分析建模的鸿沟,这个空白的地方一直没有成熟的经验可以学习。在我们对当前分析的业务不是很了解的时候如何正确的建出对应的类模型,表层的领域概念我 们可以根据自己的经验去够发现它,但是这毕竟是无法传递的知识。很多OOAD的书籍甚至包括很多软件工程中的经典书籍都未给出这里的答案,如果用一句准确 的技术术语来形容这个过程的话,其实就是缺少一套建模分析模式,缺少一个可以让我们不管针对什么样的业务进行分析时都是一套不变的指导模式。我 想这个问题对我们建模者来说肯定是共同的问题,我们需要解决它。只有这样我们才不会遇见自己所不熟悉的业务领域时而束手无策,当然你可以说你也一样可以进 行OOA,但是你一定会漏掉什么的,这是分析盲点,是没有正确指导思想的必然结果。正如上图中的”下订单“和”退货“两个核心的领域模型未能在右边的”类 模型“中建模出来,大部分开发人员的通病就是无法识别出潜在的领域概念,认为”表层“ 的领域概念就是类模型中的”实体“,其实这样我们到最后就回到了表驱动的开发过程当中去,因为你只有通过E-R模型来思考时才能发现这种平面的结构,但是 这又和正确的软件开发访问论背道而驰了。

4.四色原型模式填补这个历史缝隙,让我们真的看见OOAD的希望

本节我们将讨论一个分析模式,它存在有一段时间了,值得我们高兴的是它就是专 门用来解决上述小节中阐述的“分析”鸿沟的,通过这套模式我们几乎可以分析任何一个业务领域,再也不用怕由于自己对该领域不熟悉而漏掉了重要的领域模型, 而导致代码混乱、难以重构的最大问题就是丢失重要的领域概念,让各个对象的职责未能正确的在自己的空间中。

这个分析模式就是”四色原型“模式,根据名字我们就可以大概猜出它是基于四个概念来分析我们的业务概念,下面我们来了解一下哪四个概念:

1.实体:也可以叫做物品,表示一个参与者,比如:客户、商品。

2.角色:实体、时刻时段的角色,如:订单的配送类型,用户的等级角色。

3.描述:用来对实体、时刻时段的公共属性进行描述,比如:客户实体的地址描述,这部分信息是可以通用的。

4.时刻时段:实体在某个时间段内的参与事件,如:订单,某个客户在某个时间段内购买了某个商品。此概念就是用来跟踪实体发生的所有需要跟踪的事件。

当我们使用四色原型模式去分析业务概念时就很难丢失领域概念,下面我们依然以上面的业务领域为例使用四色原型模式进行分析。

图3:

Linux:面向对象分析与设计—四色原型模式(彩色建模、领域无关模型)
Linux:面向对象分析与设计—四色原型模式(彩色建模、领域无关模型)

基本上我们可以使用四色原型模式去直接套某个业务领域,我们可以根据模式的思 想来推断领域模型是否需要四色中的一种。这样我们基本上不会漏掉重要的业务概念。通过将“四色原型”模式与“RUP”制品中的“业务词汇表”、”补充性规 格说明“集合可以完成美妙的OOAD敏捷过程。使用四色原型模式来验收RUP过程制品中的业务词汇表,可以判断出自己是否遗漏了重要的业务分支。

可以说四色原型模式是通往OOAD之门的金钥匙,有了它我才相信我们现在分析的系统是OO的。

模型是让人去阅读理解的,上图中我们很难看出哪个是”实体“哪个是”角色“哪个是”时刻时段“和”描述“,所以大师们借鉴了其他领域的彩色思想来创建软件模型,这样我们就够能一眼的看出模型的具体意思,带来强大的视觉冲击力,下节我们详细的来看看彩色建模。

5.在四色原型上运用彩色建模增强视觉冲击力

为了能够突出模型的视觉效果,在四色原型上运用不同的颜色来增加模型的视觉冲击力。使用彩色模型能够激发人类天生的视觉敏感性,让人一目了然的知道整体的模型是个什么结构。

图4:

Linux:面向对象分析与设计—四色原型模式(彩色建模、领域无关模型)
Linux:面向对象分析与设计—四色原型模式(彩色建模、领域无关模型)

使用绿色来表示实体(参与者),使用黄色表示角色,使用灰色表示描述,使用桃红色表示时刻时段。当然这里的颜色不是很准确,由于我对颜色分的不是很清楚,所以未能调出最合适的颜色,但是差不多也就行了。

这样当我们面对一个大型的UML类图模型时就可以一眼识别出每个模型所代表的概念它的职责也就清晰明了了。

6.通过四色原型模式建模出领域无关模型

建模时我们是不需要考虑该模型将要被什么技术落地,也就是说该模型是领域(技 术、工具、平台)无关的,可以使用任何技术来实现它。通过四色原型模式构建出来的模型图更具有可塑性,概念非常的清晰,所有的模型都是概念明确的,不存在 人为的设计在里面,对于任何一个建模者来说这是非常宝贵的建模技术。如果没有四色原型模式的背景,每个建模者都根据自己的经验来假设出很多主观的模型出 来,其实这部分模型是很难让别人理解的,因为每个人的理解角度不同,得出的模型自然也就差别很大,所以建模时使用四色原型模式是一个比较通用的模式,得出 的最后模型也是一个通用的且团队交流也是通用的。

技术无关是领域无关模型的一个面,领域无关也有另外一层含义,当我们有了四色原型模式时你是否发现你具有了征服所有业务领域的秘诀,就好比E-R模型一样,一个可以用无边际的抽象的模式,这个模式由四色基本的原型组成,而这个四个原型也是领域无关模型。

7.结束语:建模时你可以不考虑具体实现,但是建模者要懂技术实现

尽管建模高手会告诉我们建模时不要去考虑最后具体用什么技术去实现它,其实跟 你说这个话的人要么就是精通某个技术的高手,要么就是一个理论主义者,只知道画图而不知道如何具体落地领域模型的分析员,前者其实他已经做到心中有数了, 为什么这么说,因为不懂技术实现的人来建模时是无法创建出能用的模型的,因为概念毕竟是概念,一旦落地到代码上、架构上一切都变了,并不是那么的简单直接 落地的,需要考虑到读写、业务流、职责等等问题,这里面是有很强的技术问题在里面的。

好了文章到此结束,希望本文能对那些对OOAD、UML、建模有兴趣的朋友起到一个抛砖引玉的作用,对本文的内容想进一步学习的可以参考《彩色建模》一书,这本书是OOAD大师[Peter coad]所著,谢谢大家。

来源:http://www.cnblogs.com/wangiqngpei557/p/3908337.html

Linux:Linux有问必答:如何检查我是否处于一个运行着的screen会话中

问题:我经常使用screen命令来运行多个伪终端会话。好多次,我发现都记不得自己是否在一个screen会话中,还是在一个常规终端中。是否有一种简便的方法来检查我是否在一个运行着的screen会话中?

一个快捷而又简单的方法来检查你是否处于一个screen伪终端中,还是在一个常规终端中,就是检查STY环境变量。当调用了screen,就会把STY变量值设置为会话名。因此,如果STY环境变量被设置为任何非空字符串,就意味着你正处于一个screen会话中。

 $ echo $STY

2858.pts-3.my_host

然而,请注意,上面的方法只有当你是在本地计算机上运行screen命令的时候。如果你从本地计算机的screen会话中SSH到任何远程计算机上,远程计算机上的STY变量不会被设置,尽管在技术上看,你仍然处于一个screen会话中。

事实上,一个更为可靠的检查你是否处于一个screen会话中的方法,是按“Ctrl-a”+“Ctrl-t”。如果你处于screen会话中,终端会在底部显示时间信息。

Linux:Linux有问必答:如何检查我是否处于一个运行着的screen会话中
Linux:Linux有问必答:如何检查我是否处于一个运行着的screen会话中

via: http://ask.xmodulo.com/check-running-screen-session.html

译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3608-1.html

Linux:Echo命令实例

echo命令是内建的shell命令,用于显示变量的值或者打印一行文本

echo命令在构建shell脚本时扮演着重要的角色。

语法:

# echo [Options] [String]

方括号中的项目是可选的。字符串可以定义为字符的有限序列(如字母,数字,符号,标点符号)。

当echo命令不带任何选项或字符串使用时,它会在显示屏上返回一个空白行,后面换一行跟上命令提示符。这是因为按下回车键就是发送一个信号给系统以开始一个新行,而echo重复了该信号。

选项:

  • -n 不要输出衍生的新行
  • -e 启用反斜线转义解释
  • -E 禁用反斜线转义解释(默认)

如果使用-e选项,则可以使用如下转义序列:

  • 反斜线
  • a 警告(BEL)
  • b 反斜线
  • c 不产生进一步输出
  • e 转义
  • f 换页
  • n 新行
  • r 换行字符
  • t 水平制表
  • v 垂直制表
  • NNN 八进制值表示的字节NNN(1到3个数字)
  • xHH 十六进制值表示的字节NNN(1到2个数字)

样例:1 显示系统定义的变量的值

使用set命令,我们可以列出系统定义的变量。而要打印这些变量的值,我们可以使用echo命令:

jack@localhost:~$ echo $USER
jack
jack@localhost:~$ echo $HOME
/home/jack

样例:2 显示用户定义的变量的值

jack@nextstep4it:~$ var1=`date`
jack@nextstep4it:~$ echo "Today's date  time is : $var1"
Today's date  time is : Mon Jul 28 13:11:37 IST 2014

样例:3 显示文本字符串

jack@nextstep4it:~$ echo " Hi this echo command testing"
Hi this echo command testing

样例:4 在echo命令中使用反斜线

jack@nextstep4it:~$ echo -e "Ubuntu bis bthe bbest bDesktop bOS"

上述命令将打印:

UbuntuisthebestDesktopOS

样例:5 在echo命令中使用制表符空格

nextstep4it@nextstep4it:~$ echo -e "Ubuntu tis tthe tbest tDesktop tOS"

上述命令将显示如下输出:

Ubuntu is the best Desktop OS

样例:6 在echo命令中使用垂直制表符

jack@nextstep4it:~$ echo -e "Ubuntu vis vthe vbest vDesktop vOS"
Ubuntu
       is
              the
                     best
                            Desktop
                                          OS

样例:7 设置echo命令彩色输出

echo命令可以修改字体类型,字体背景色以及字体颜色,转义序列33可以用于改变字体属性。要使转义序列生效,必须使用-e选项。下面列出了部分转义代码:

  • [0m: 正常
  • [1m: 粗体
  • [4m: 字体加上下划线
  • [7m: 逆转前景和背景色
  • [8m: 不可见字符
  • [9m: 跨行字体
  • [30m: 灰色字体
  • [31m: 红色字体
  • [32m: 绿色字体
  • [33m: 棕色字体
  • [34m: 蓝色字体
  • [35m: 紫色字体
  • [36m: 浅蓝色字体
  • [37m: 浅灰字体
  • [38m: 黑色字体
  • [40m: 黑色背景
  • [41m: 红色背景
  • [42m: 绿色背景
  • [43m: 棕色背景
  • [44m: 蓝色背景
  • [45m: 紫色背景
  • [46m: 浅蓝色背景
  • [47m: 浅灰色背景

下面的命令将用红色打印输出。

jack@nextstep4it:~$ echo -e "33[31mMagic of Linux33[0m"
Magic of Linux

下面的命令将以粗体以及红色背景打印出“Magic of Linux”。

nextstep4it@nextstep4it:~$ echo -e "33[1m33[41mMagic of Linux33[0m"
Magic of Linux

via: http://www.nextstep4it.com/categories/unix-command/echo-command/

译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3592-1.html

Linux:Linux 内核的测试和调试(1)

Linux 内核测试哲学

不管是开源还是闭源,所有软件的开发流程中,测试是一个重要的、不可或缺的环节,Linux 内核也不例外。开发人员自测、系统测试、回归测试、压力测试,都有各自不同的目的,但是从更高一个层次上看,这些测试的最终目的又是一样的:保证软件能一直运行下去,当有新功能加进去时,要保证新功能可以正常工作。

在软件释出 release 版之前,不用回归测试就能保证稳定性,并且尽量避免在软件发布后被用户发现 bug。调试被用户发现的 bug 是一项非常浪费时间和精力的工作。因此测试是一项非常重要的工作。不像闭源和专有的操作系统,Linux 内核的开发过程是完全开放的。这种处理方式即是它的优点,也是它的缺点。多个开发者持续增加新功能、修 bug、不断集成与测试 —— 当环境有新的硬件或功能时,这种开发方式能够保证内核能持续工作。在开源项目中,开发者与用户共享测试的结果,这也是开源项目与闭源项目之间的一个很重要的差别。

几乎所有 Linux 内核开发者都是活跃的 Linux 用户。内核测试人员不一定非得是内核开发者,相反,用户和开发者如果对新增的代码不是很熟悉,他们的测试效果会比代码开发人员自己测试的效果要好很多。也就是说,开发者的单元自测能验证软件的功能,但并不能保证在其他代码、其他功能、其他软件、硬件环境下面运行时会出现什么问题。开发者无法预料、也没有机会和资源来测试所有环境。因此,用户在 Linux 内核开发过程中起到非常重要的角色。

现在我们已经了解了持续集成测试的重要性,接下来我们会详细介绍测试的知识。但在此之前,我还是向你介绍一下开发的过程,以便让大家了解它是怎么工作的,以及如何把补丁打进内核主线。

全世界共有3000多个内核开发者为 Linux 内核贡献代码,每天都有新代码添加到内核,结果是大概2个月就能产生一个release ,包括几个稳定版和扩展稳定版。新功能的开发与已发布的稳定版集成测试流程在同时进行。

关于开发流程的详细描述,请参考Greg Kroah-Hartman 的 Linux 内核开发的介绍

Linux:Linux 内核的测试和调试(1)
Linux:Linux 内核的测试和调试(1)

这份教程适合与初学者以及有经验的内核开发者,如果你想加入到内核开发者行列,那么它也适合你。有经验的开发人员可以跳过那些介绍基础测试和调试的章节。

这份教程介绍如何测试和调试 Linux 内核、工具、脚本以及在回归测试和集成测试中使用的调试机制。另外,本文还会介绍如何使用 git 把针对一个 bug 的补丁分离出来,再介绍把你的补丁提交到内核的邮件列表之前需要做些什么。我将会使用 Linux PM 作为测试它调试的对象。尽管本文讨论的是 Linux 内核,但是介绍的方法也适用于任何其他软件开发项目。

配置开发与测试的系统

第一步,找一个满足你需求的开发环境,x86-64 是一个比较理想的选择,除非你必须用特别的架构。

第二步,安装 Linux 发行版,我推荐 Ubuntu,所以本教程会介绍基于 Ubuntu 的配置过程。你可以参考如何使用 Ubuntu 来安装一个 Ubuntu 系统。

在开发和测试环境,最好要保证你的 boot 分区有足够的空间来存放内核文件。你可以为 boot 分区留下 3GB 空间,或把 boot 分区直接放到根目录下,这样 boot 分区可以使用整个磁盘的空间。

安装好操作系统后,确保 root 用户可用,确保你的用户身份可以使用 sudo 命令。你的系统也许已经安装了 build-essential,它是编译内核必备的软件包,如果没安装,运行下面的命令:

sudo apt-get install build-essential

然后运行下面的命令,保证你的系统能够交叉编译内核。下面的 ncurses-dev 安装包是运行 make menuconfig 命令必须用到的。

sudo apt-get install binutils-multiarch
sudo apt-get install ncurses-dev
sudo apt-get install alien

然后安装一些每个内核开发者都会用到的工具包:

sudo apt-get install git
sudo apt-get install cscope
sudo apt-get install meld
sudo apt-get install gitk

如果你喜欢把内核通过交叉编译以支持非 x86_64 架构的环境,请参考在 x86_64 上交叉编译 Linux 内核

稳定的内核

使用 git 克隆一个稳定的内核,然后编译安装。你可以参考Linux 内核结构来找到最新的稳定版和开发主线。

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

上面的步骤将会创建一个新的目录,名为 linux-stable,并把源码下载到里面。

你也可以直接下载压缩包并解压出源码,无需使用 git:

tar xvf linux-3.x.y.tar.xz

via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,0

译者:bazz2 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3593-1.html

Linux:如何在Oh-My-Zsh中启用Heroku命令补全功能

Heroku客户端是创建和管理Heroku应用的命令行界面工具。

Linux:如何在Oh-My-Zsh中启用Heroku命令补全功能
Linux:如何在Oh-My-Zsh中启用Heroku命令补全功能

需求:

本文不是讲关于heroku的知识,也不是讲关于heroku的使用细节,而是仅仅展示给用户他们怎样可以使用oh-my-zsh来方便地敲入heroku命令。此外你还应该安装heroku toolbelt来进行本文的相应的操作。对于Ubuntu和Debian发行版,你可以通过运行下面的命令来安装:

wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh

打开终端,用你在[这里]创建的用户登陆heroku:

heroku login
Enter your Heroku credentials.
Email: enockseth@unixmen.com
Password (输入是隐藏的):
Authentication successful.

这显示heroku正在运行。

用你惯用的文本编辑器打开.zshrc

vim .zshrc
Linux:如何在Oh-My-Zsh中启用Heroku命令补全功能
Linux:如何在Oh-My-Zsh中启用Heroku命令补全功能

这里,git是唯一默认启用的插件。

在下图显示的插件选择区添加heroku

Linux:如何在Oh-My-Zsh中启用Heroku命令补全功能
Linux:如何在Oh-My-Zsh中启用Heroku命令补全功能

重启终端,输入heroku,按下tab键,到此就搞定啦:

Linux:如何在Oh-My-Zsh中启用Heroku命令补全功能
Linux:如何在Oh-My-Zsh中启用Heroku命令补全功能

via: http://www.unixmen.com/enable-tab-complete-heroku-commands-oh-zsh/

译者:JonathanKang 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3594-1.html

Linux:Linux有问必答:如何查看Linux上程序或进程用到的库

Linux:Linux有问必答:如何查看Linux上程序或进程用到的库
Linux:Linux有问必答:如何查看Linux上程序或进程用到的库

问题:我想知道当我调用一个特定的可执行文件在运行时载入了哪些共享库。是否有方法可以明确Linux上可执行程序或运行进程的共享库依赖关系?

查看可执行程序的共享库依赖关系

要找出某个特定可执行依赖的库,可以使用ldd命令。这个命令调用动态链接器去找到程序的库文件依赖关系。

$ ldd /path/to/program
Linux:Linux有问必答:如何查看Linux上程序或进程用到的库
Linux:Linux有问必答:如何查看Linux上程序或进程用到的库

注意!并不推荐为任何不可信的第三方可执行程序运行ldd,因为某些版本的ldd可能会直接调用可执行程序来明确其库文件依赖关系,这样可能不安全。

取而代之的是用一个更安全的方式来显示一个未知应用程序二进制文件的库文件依赖,使用如下命令:

$ objdump -p /path/to/program | grep NEEDED

查看运行进程的共享库依赖关系

如果你想要找出被一个运行中的进程载入的共享库,你可以使用pldd命令,它会显示出在运行时被载入一个进程里的所有共享对象。

$ sudo pldd 

注意你需要root权限去执行pldd命令。

Linux:Linux有问必答:如何查看Linux上程序或进程用到的库
Linux:Linux有问必答:如何查看Linux上程序或进程用到的库

或者,也可以选择一个叫做pmap的命令行工具。它报告一个进程的内存映射,也能显示出运行进程的库文件依赖。

$ sudo pmap 
Linux:Linux有问必答:如何查看Linux上程序或进程用到的库
Linux:Linux有问必答:如何查看Linux上程序或进程用到的库

via: http://ask.xmodulo.com/check-library-dependency-program-process-linux.html

译者:KayGuoWhu 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3609-1.html

Linux:十大编程算法助程序员走上大神之路

Linux:十大编程算法助程序员走上大神之路
Linux:十大编程算法助程序员走上大神之路

算法一:快速排序算法

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

算法步骤:

1 从数列中挑出一个元素,称为 “基准”(pivot),

2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

Linux:十大编程算法助程序员走上大神之路
Linux:十大编程算法助程序员走上大神之路

算法二:堆排序算法

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

堆排序的平均时间复杂度为Ο(nlogn) 。

算法步骤:

创建一个堆H[0..n-1]

把堆首(最大值)和堆尾互换

3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置

4. 重复步骤2,直到堆的尺寸为1

Linux:十大编程算法助程序员走上大神之路
Linux:十大编程算法助程序员走上大神之路

算法三:归并排序

归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

算法步骤:

1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置

3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

4. 重复步骤3直到某一指针达到序列尾

5. 将另一序列剩下的所有元素直接复制到合并序列尾

Linux:十大编程算法助程序员走上大神之路
Linux:十大编程算法助程序员走上大神之路

算法四:二分查找算法

二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜 素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组 为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn) 。

算法五:BFPRT(线性查找算法)

BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPRT可以保证在最坏情况下仍为线性时间复杂度。该算法的思想与快速排序思想相似,当然,为使得算法在最坏情况下,依然能达到o(n)的时间复杂 度,五位算法作者做了精妙的处理。

算法步骤:

1. 将n个元素每5个一组,分成n/5(上界)组。

2. 取出每一组的中位数,任意排序方法,比如插入排序。

3. 递归的调用selection算法查找上一步中所有中位数的中位数,设为x,偶数个中位数的情况下设定为选取中间小的一个。

4. 用x来分割数组,设小于等于x的个数为k,大于x的个数即为n-k。

5. 若i==k,返回x;若ik,在大于x的元素中递归查找第i-k小的元素。

终止条件:n=1时,返回的即是i小元素。

来源:http://www.evget.com/article/2014/7/23/21356.html

Linux:[小技巧]修复Moka图标主题丢失的扬声器图标

Moka是一个漂亮的图标主题,它在Ubuntu可用的最佳图标主题中扮演着重要的角色。但在Ubuntu 14.04中,Moka有那么点小缺憾。如果你在Ubuntu 14.04的Unity中使用摩卡,你会发现用于调节声音的扬声器图标不见了:

Linux:[小技巧]修复Moka图标主题丢失的扬声器图标
Linux:[小技巧]修复Moka图标主题丢失的扬声器图标

使用Moka图标主题时修复丢失的声音图标

虽然你可能已经添加的官方Moka PPA源,但为了检查起见,再次添加它吧:

sudo add-apt-repository ppa:moka/stable
sudo apt-get update

现在,接下来要做的是安装单色面板图标。使用下面的命令来安装:

sudo apt-get install faba-mono-icons

一旦你安装完Faba单色图标后,将你的图标主题从Moka修改为Faba。这会给你Unity中的Moka图标主题的顶部面板配上漂亮的单色图标:

Linux:[小技巧]修复Moka图标主题丢失的扬声器图标
Linux:[小技巧]修复Moka图标主题丢失的扬声器图标

我希望这会帮助你修复丢失的声音图标。享受Moka带来的点点滴滴吧。


via: http://itsfoss.com/fix-missing-speaker-icon-from-moka/

原文作者:Abhishek

译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3595-1.html

Linux:如何用CentOS上的SARG日志分析器来分析Squid日志

Linux:如何用CentOS上的SARG日志分析器来分析Squid日志
Linux:如何用CentOS上的SARG日志分析器来分析Squid日志

上一节教程中,我们展示了如何在CentOS上使用Squid配置透明代理。Squid提供了很多有用的特性,但是分析一个原始Squid日志文件并不直接。比如,你如何分析下面Squid日志中的时间戳和数字?

1404788984.429   1162 172.17.1.23 TCP_MISS/302 436 GET http://facebook.com/ - DIRECT/173.252.110.27 text/html
1404788985.046  12416 172.17.1.23 TCP_MISS/200 4169 CONNECT stats.pusher.com:443 - DIRECT/173.255.223.127 -
1404788986.124    174 172.17.1.23 TCP_MISS/200 955 POST http://ocsp.digicert.com/ - DIRECT/117.18.237.29 application/ocsp-response
1404788989.738    342 172.17.1.23 TCP_MISS/200 3890 CONNECT www.google.com:443 - DIRECT/74.125.200.106 -
1404788989.757    226 172.17.1.23 TCP_MISS/200 942 POST http://clients1.google.com/ocsp - DIRECT/74.125.200.113 application/ocsp-response
1404788990.839   3939 172.17.1.23 TCP_MISS/200 78944 CONNECT fbstatic-a.akamaihd.net:443 - DIRECT/184.26.162.35 -
1404788990.846   2148 172.17.1.23 TCP_MISS/200 118947 CONNECT fbstatic-a.akamaihd.net:443 - DIRECT/184.26.162.35 -
1404788990.849   2151 172.17.1.23 TCP_MISS/200 76809 CONNECT fbstatic-a.akamaihd.net:443 - DIRECT/184.26.162.35 -
1404788991.140    611 172.17.1.23 TCP_MISS/200 110073 CONNECT fbstatic-a.akamaihd.net:443 - DIRECT/184.26.162.35 –

我们使用yum来安装安装必要的依赖。

# yum install gcc make wget httpd crond

在启动时加载必要的服务

# service httpd start; service crond start
# chkconfig httpd on; chkconfig crond on

现在我们下载并解压SARG

# wget http://downloads.sourceforge.net/project/sarg/sarg/sarg-2.3.8/sarg-2.3.8.tar.gz?
# tar zxvf sarg-2.3.8.tar.gz
# cd sarg-2.3.8

注意: 对于64位的Linux,log.c的源代码需要用下面的文件打补丁。

1506c1506
<            if (fprintf(ufile->file, "%st%st%st%st%"PRIi64"t%st%ldt%sn",dia,hora,ip,url,nbytes,code,elap_time,smartfilter)<=0) {
---
>            if (fprintf(ufile->file, "%st%st%st%st%"PRIi64"t%st%ldt%sn",dia,hora,ip,url,(int64_t)nbytes,code,elap_time,smartfilter)<=0) {
1513c1513
<                fprintf(fp_log, "%st%st%st%st%st%"PRIi64"t%st%ldt%sn",dia,hora,user,ip,url,nbytes,code,elap_time,smartfilter);
---
>                fprintf(fp_log, "%st%st%st%st%st%"PRIi64"t%st%ldt%sn",dia,hora,user,ip,url,(int64_t)nbytes,code,elap_time,smartfilter);
1564c1564
<                printf("LEN=t%"PRIi64"n",nbytes);
---
>                printf("LEN=t%"PRIi64"n",(int64_t)nbytes);

如下继续并编译/安装SARG

# ./configure
# make
# make install

SARG安装之后,配置文件可以按你的要求修改。下面是一个SARG配置的例子。

# vim /usr/local/etc/sarg.conf

access_log /var/log/squid/access.log
temporary_dir /tmp
output_dir /var/www/html/squid-reports
date_format e     ## We use Europian DD-MM-YYYY format here ##
## we don’t want multiple reports for single day/week/month ##
overwrite_report yes

现在是时候测试运行了,我们用调试模式运行sarg来查看是否存在错误。

# sarg -x

如果i一切正常,sarg会根系Squid日志,并在/var/www/html/squid-reports下创建报告。报告也可以在浏览器中通过地址http://<服务器IP>/squid-reports/访问。

Linux:如何用CentOS上的SARG日志分析器来分析Squid日志
Linux:如何用CentOS上的SARG日志分析器来分析Squid日志

、SARG可以用于创建日、周、月度报告。时间范围用“-d”参数来指定,值的形式很可能为day-n、 week-n 或者 month-n,n的值为向前推移的天/周/月的数量。比如,使用week-1,SARG会生成之前一星期的报告。使用day-2,SARG会生成之前两天的报告。

作为演示,我们会准备一个计划任务来每天运行SARG。

# vim /etc/cron.daily/sarg

#!/bin/sh
/usr/local/bin/sarg -d day-1

文件需要可执行权限。

# chmod 755 /usr/local/bin/sarg

现在SARG应该会每天准备关于Squid管理的流量报告。这些报告可以很容易地通过SARG网络接口访问。

总结一下,SARG一款基于网络的工具,它可以分析Squid日志,并以更详细的方式展示分析。系统管理员可以利用SARG来监视哪些网站被访问了,并跟踪访问量最大的网站和用户。本教程包含了SARG配置工作。你可以进一步自定义配置来满足自己的要求。

希望这篇教程对您有帮助。


Sarmed Rahman

Sarmed Rahman是一名孟加拉国的IT专业人士。他坚持时不时地写作技术文章,并坚信技术可以通过分享而提高。在空闲时间里,他喜欢打游戏,喜欢和朋友一起度过。


via: http://xmodulo.com/2014/07/analyze-squid-logs-sarg-log-analyzer-centos.html

译者:geekpi 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3616-1.html

Linux:5个让Cinnamon桌面环境完美运行在ubuntu上的方法

Linux:5个让Cinnamon桌面环境完美运行在ubuntu上的方法
Linux:5个让Cinnamon桌面环境完美运行在ubuntu上的方法

Cinnamon桌面环境最新稳定版本发行了,ubuntu用户可以去安装使用了

在已经安装好的基础上,我们可以做一些微调来拥有更棒的体验 。

你的Ubuntu如果没有安装Cinnamon,你可以参照我们之前的文章进行安装

更改Mint菜单图标

Mint菜单图标是Cinnamon的特色之一,它给予用户一种简单、快速、熟悉的方式来搜索、打开、组织应用程序,默认情况下,菜单使用启动程序项中的Linux Mint Logo。既然你是在ubuntu系统下使用它,而不是Mint,为什么不使用ubuntu熟悉的橙色朋友圈logo来替换原有的菜单图标呢?

实现很简单:

Linux:5个让Cinnamon桌面环境完美运行在ubuntu上的方法
Linux:5个让Cinnamon桌面环境完美运行在ubuntu上的方法

想要将Cinnamon菜单图标改变为ubuntu风格的,只需点击applet,选择‘config‘,在设置窗口,就会出现‘Use a custom icon‘,然后你就输入下面的路径来使用ubuntu logo了:

/usr/share/icons/ubuntu-mono-dark/actions/24/package-supported.svg

你可以使用任何支持的图片类型,只需要在刚才的填写区域写入正确的图片路径,或者点击后面的方框来打开文件选择器,选择你要使用的图标。

尝试Cinnamon主题

Linux:5个让Cinnamon桌面环境完美运行在ubuntu上的方法
Linux:5个让Cinnamon桌面环境完美运行在ubuntu上的方法

和GNOME Shell一样,Cinnamon也支持自定义主题,我所说的主题并不只是应用程序的GTK主题和简单的窗口装饰,而是将面板,菜单,程序等等结合为一个整体的视觉风格。

不用离开桌面就可以浏览、下载Cinnamon主题。打开Cinnamon Settings tool中的Appearance pane,然后选择‘Online Themes‘。

下面是一些受欢迎的主题:

  • Android Holo — Android 4.x style theme
  • Zukitwo — Sleek, stylish and light
  • Minty — Dark theme with bold green accents
  • Metro — Based on the visual style of Windows 8.

找出你最喜欢的布局

Unity认为应用程序启动器永远只应该固定地待在屏幕的一侧,但是Cinnamon并不这样认为,它可以让你重新设计最符合你的桌面布局。

手动面板可以增加,编辑和移动,或选择三种预设的布局。

Linux:5个让Cinnamon桌面环境完美运行在ubuntu上的方法
Linux:5个让Cinnamon桌面环境完美运行在ubuntu上的方法

打开Settings > Panel > Layout Options > Panel Layout,然后下面这几个中选择:

  • Traditional — 这是默认的布局,控制面板在屏幕的顶部
  • Flipped ——和Traditional一样,控制面板在屏幕顶部
  • Classic ——两个控制面板,一个在顶部,一个在底部

你需要注销或者重启Cinnamon才能生效。

添加面板小程序

Linux:5个让Cinnamon桌面环境完美运行在ubuntu上的方法
Linux:5个让Cinnamon桌面环境完美运行在ubuntu上的方法

Cinnamon和GNOE Shell一样具有可扩展性,丰富的社区插件和扩展程序提供了额外的特性和功能,比如天气,系统监测,窗口管理工具等,这些都可以被浏览,安装并能从桌面直接启动。

选择控制面板,右键点击要添加小程序,选择 ‘…Add Appls to the Panel‘,一些著名的小程序如下:

  • Weather – does what it forecasts (ho ho)
  • Stark Menu – Clone of the Windows 7 Start Menu
  • Screenshot — Easy way to grab screenshots with delay

改变日期的显示格式

Cinnamon的时间日期程序很方便,它可以让你很容易就记住日期

但是它显示时间的默认格式是24小时制,但是我们很容易就能调整时钟格式

右击然后选择‘Configure‘,在设置窗口中出现“Use a custom date format“的选择框上打勾,或者使用下面的几种格式(复制粘帖粗体字段)

  • %B %e, %I:%M %p (July 13, 7:19 PM)
  • %m/%d/%Y (07/13/2014)
  • %l:%M %p (7:19 PM)

改变立马生效,如果中途发生了错误,你可以取消自定义时间格式选项恢复到默认状态

更多

在Cinnamon桌面环境中只有少部分定制选择供使用者使用,但是我们认为上述所讲的调整是不断探索的很好跳板,通过下面的评论栏让我们了解你最喜欢的调整是什么吧,你可以通过Facebook或者Google+


via: http://www.omgubuntu.co.uk/2014/07/5-things-installing-cinnamon-ubuntu

译者:su-kaiyao 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-3610-1.html

Linux:给linux用户的11个高级MySQL数据库面试问题和答案

我们已经发表了两篇MySQL的文章,非常感谢Tecmint社区的大力支持。这是MySQL面试系列的第三篇文章,并且在面试专栏中排第16。

Linux:给linux用户的11个高级MySQL数据库面试问题和答案
Linux:给linux用户的11个高级MySQL数据库面试问题和答案

因为有大家的支持,我们才能做到现在,感谢你们这一路上对我们的支持.在这篇文章中,我们将主要针对MySQL的实用技巧,讲讲面试中相关的问题.

1. 如何使用SELECT语句找到你正在运行的服务器的版本并打印出当前数据库的名称?

:下面的语句的结果会显示服务器的版本和当前的数据库名称

 mysql> SELECT VERSION(), DATABASE();
 +-------------------------+------------+
 | VERSION()               | DATABASE() |
 +-------------------------+------------+
 | 5.5.34-0ubuntu0.13.10.1 | NULL       |
 +-------------------------+------------+
 1 row in set (0.06 sec)

在Database一列中显示NULL是因为我们当前没有选择任何数据库。因此,使用下面的语句先选择一个数据库,就能看到相应的结果。

mysql> use Tecmint;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select VERSION(), DATABASE();
+-------------------------+------------+
| VERSION()               | DATABASE() |
+-------------------------+------------+
| 5.5.34-0ubuntu0.13.10.1 | tecmint    |
+-------------------------+------------+
1 row in set (0.00 sec)

2. 使用非运算符(!)从表”Tecmint”中列出除了”SAM”以外的所有user记录

:使用下面的语句

mysql> SELECT * FROM Tecmint WHERE user !=SAM;
+---------------------+---------+---------+---------+---------+-------+
| date                | user    | host   | root     | local   | size  |
+---------------------+---------+---------+---------+---------+-------+
| 2001-05-14 14:42:21 | Anthony | venus  | barb     | venus   | 98151 |
| 2001-05-15 08:50:57 | TIM     | venus  | phil     | venus   | 978   |
+---------------------+---------+---------+---------+---------+-------+

3. ‘AND’运算符有可能带着非运算符(!)一起用吗?

:当我们使用‘=’号时用‘AND’连接,用‘!=’时用‘OR’连接,下面是‘=’和AND运算符一起用的例子

mysql> SELECT * FROM mail WHERE user = SAM AND root = phil

‘!=’和OR运算符的例子

mysql> SELECT * FROM mail WHERE user != SAM OR root != phil
+---------------------+---------+---------+---------+---------+-------+
| date                | user    | host    | root    | local   | size  |
+---------------------+---------+---------+---------+---------+-------+
| 2001-05-14 14:42:21 | Anthony | venus   | barb    | venus   | 98151 |
+---------------------+---------+---------+---------+---------+-------+
  • = : 等于
  • != : 不等于
  • ! : 代表“非”的运算符

AND和OR在MySQL中被看作连接运算符

4. IFNULL()当打在MySQL中有什么作用?

:使用IFNULL()方法能使MySQL中的查询更加精确。IFNULL()方法将会测试它的第一个参数,若不为NULL则返回该参数的值,否则返回第二个参数的值

mysql> SELECT name, IFNULL(id,'Unknown') AS 'id' FROM taxpayer;
+---------+---------+
| name    | id      |
+---------+---------+
| bernina | 198-48  |
| bertha  | Unknown |
| ben     | Unknown |
| bill    | 475-83  |
+---------+---------+

5. 如果你只想知道从一个结果集的开头或者结尾开始的特定几条记录,该如何实现?

:我们需要把LIMIT语句接在ORDER BY语句后使用,以达到上述效果。

显示一行记录

mysql> SELECT * FROM name LIMIT 1;
+----+------+------------+-------+----------------------+------+
| id | name | birth      | color | foods                | cats |
+----+------+------------+-------+----------------------+------+
| 1  | Fred | 1970-04-13 | black | lutefisk,fadge,pizza | 0    |
+----+------+------------+-------+----------------------+------+

显示5行记录

mysql> SELECT * FROM profile LIMIT 5;
+----+------+------------+-------+-----------------------+------+
| id | name | birth      | color | foods                 | cats |
+----+------+------------+-------+-----------------------+------+
| 1  | Fred | 1970-04-13 | black | lutefisk,fadge,pizza  | 0    |
| 2  | Mort | 1969-09-30 | white | burrito,curry,eggroll | 3    |
| 3  | Brit | 1957-12-01 | red   | burrito,curry,pizza   | 1    |
| 4  | Carl | 1973-11-02 | red   | eggroll,pizza         | 4    |
| 5  | Sean | 1963-07-04 | blue  | burrito,curry         | 5    |
+----+------+------------+-------+-----------------------+------+

显示按照ORDER BY排序后的第一条记录

mysql> SELECT * FROM profile ORDER BY birth LIMIT 1;
+----+------+------------+-------+----------------+------+
| id | name | birth      | color | foods          | cats |
+----+------+------------+-------+----------------+------+
| 9  | Dick | 1952-08-20 | green | lutefisk,fadge | 0    |
+----+------+------------+-------+----------------+------+

6. Oracle 和 MySQL该如何选择,为什么?

:它们都有各自的优点和缺点。考虑到时间因素,我倾向于MySQL。

选择MySQL而不选orcale的原因

  • MySQL开源
  • MySQL轻便快捷
  • MySQL对命令行和图形界面的支持都很好
  • MySQL支持通过Query Browser进行管理

7. MySQL中如何得到当前日期?

:在MySQL中获取当前日期就是如下的SELECT语句这么简单。

mysql> SELECT CURRENT_DATE();
+----------------+
| CURRENT_DATE() |
+----------------+
| 2014-06-17     |
+----------------+

8. MySQL中如何将表导出为XML文件?

:我们可以使用’-e'(export)选项来把MySQL表或整个数据库导出到XML文件。当处理大型表的时候我们可能需要手动导出,不过对于小表的话可以直接使用想phpMyAdmin等这样的工具。

mysql -u USER_NAME -xml -e 'SELECT * FROM table_name' > table_name.xml

上面的例子中USER_NAME是数据库的用户名,table_name是待导出为xml文件的表名,table_name.xml是存放数据的xml文件

9. MySQL_pconnect是什么? 它和MySQL_connect有什么区别?

:MySQL_pconnect()打开一个持久的数据库连接,这意味着数据库不是在每次页面加载的时候被打开一个新连接,因此我们不能使用MySQL_close()来关闭一个持久的连接。

MySQL_pconnect和MySQL_connect最简要的区别是:

与MySQL_pconnect不同,MySQL_connect在每次页面被加载的时候打开连接,这个连接可以使用MySQL_close()语句来关闭。

10. 当你需要查看一个名为’mysql’的数据库中’user’表中的所有索引时,你会如何做?

:下面的命令将会显示出‘user’表中所有的索引

mysql> show index from user;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user  |          0 | PRIMARY  |            1 | Host        | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| user  |          0 | PRIMARY  |            2 | User        | A         |           4 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

11. 什么是CSV表?

:CSV是逗号分隔值(Comma-Separated Values)或也被称为字符分隔值(Character-Separated Values)的缩写。CSV表以纯文本和表格形式来存储数据。

每一条记录都使用特定的分隔符隔开(如逗号,分号,…),并且每条记录都有着顺序相同的列。CSV表最广泛地被用来存储用于导入和导出的电话联系人,并能够用来存储任何类型的纯文本数据。

以上就是这次要讲的全部内容。我还会带来其他你们应该会喜欢的有趣的文章。到那时敬请关注并访问Tecmint,不要忘了在下方的评论栏中留下你们的宝贵意见。


via: http://www.tecmint.com/mysql-advance-interview-questions/

译者:GOLinux 校对:ReiNoir

本文由 LCTT 原创翻译,Linux中国 荣誉推出

 

来源:https://linux.cn/article-3618-1.html