Browsed by
标签:Linux

好烂啊有点差凑合看看还不错很精彩 (No Ratings Yet)
Loading...
111 views
Linux查看具體版本號

Linux查看具體版本號

共3個命令:

uname-a

[admin@devMachine099 ~]$ uname -a
Linux devMachine099 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
You have mail in /var/spool/mail/admin
[admin@devMachine099 ~]$ ifconfig
eth0 Link encap:Ethernet HWaddr 52:54:00:3C:1A:0C
inet addr:192.168.1.256 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::5054:ff:fe3c:1a0c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:238280625 errors:0 dropped:0 overruns:0 frame:0
TX packets:275735424 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:33821257025 (31.4 GiB) TX bytes:48149177772 (44.8 GiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:660055 errors:0 dropped:0 overruns:0 frame:0
TX packets:660055 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:72324160 (68.9 MiB) TX bytes:72324160 (68.9 MiB)

virbr0 Link encap:Ethernet HWaddr 52:54:00:B8:AA:B1
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

uname

[admin@devMachine099 ~]$ uname
Linux

cat /proc/version

[admin@devMachine099 ~]$ cat /proc/version
Linux version 2.6.32-358.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Fri Feb 22 00:31:26 UTC 2013

uname -r

[admin@devMachine099 ~]$ uname -r
2.6.32-358.el6.x86_64

lsb_release -a

[admin@devMachine099 ~]$ lsb_release -a
LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description: CentOS release 6.4 (Final)
Release: 6.4
Codename: Final
You have mail in /var/spool/mail/admin

cat /etc/issue

admin@localhost rstudio$ cat /etc/issue
CentOS release 6.6 (Final)
Kernel \r on an \m

-end-

好烂啊有点差凑合看看还不错很精彩 (No Ratings Yet)
Loading...
159 views
自己动手做一个迷你 Linux

自己动手做一个迷你 Linux

DIY:自己动手做一个迷你 Linux 系统

简介: 本文将带领大家构建一个迷你型的 Linux 系统。它占用的硬盘空间远小于 16M 字节,但是却包括了 XFree86 的 X Window 窗口系统。

目标

本文要构建的这个迷你型的 Linux 系统只能在一台特定的单机上运行,如果读者朋友们有兴趣的话,在这个系统的基础上加以改进,是可以构建出通用的、可以在大多数常规 PC 机上即插即用的系统来的。但是这已经不在本文的话题之内了,读者朋友们如果有兴趣,可以通过我的电子邮件和我讨论其中的细节问题。

我们的目标 Linux 系统运行在一台普通的 Intel 386 PC 机上,可以有硬盘,也可以不要硬盘,而用 Flash Disk 来代替。如果是用 Flash 盘的话,需要能够支持从 Flash 盘启动,而且 Flash 盘的大小要在 16M 字节或者以上。我们希望用户一开机启动,就直接进入 X Window 图形界面,运行事先指定好的程序。不需要用户输入用户名和密码进行登录。

我们设定的这个目标有点像一个 X Terminal 终端工作站。稍加改进,还可以做成干脆无盘的形式,也就是说,连 16M 的 Flash 盘也不要了。不过,这也超出了本文的话题了。读者朋友们如果有兴趣,可以来信和我进行讨论。

系统启动

因为我们要考虑从 Flash 盘进行启动,所以我们选择用 LILO 作为我们的 Boot Loader,而不选用 GRUB。这是考虑到 GRUB 有较强的对硬盘和文件系统的识别能力,而 Flash 盘到底不是标准的硬盘,并且我们选用的文件系统 GRUB 又不一定认识,搞不好的话 GRUB 反 会弄巧成拙。而 LILO 就简单的多了,它在硬盘开始的 MBR 写入一个小程序,这个小程序不经过文件系统,直接从硬盘扇区号,读出 Kernel Image 装入内存。这样,保险系数就大大增加。并且也给了我们自由选用文件系统的余地。那么,我们要如何安装 LILO 呢?

首先,我们要找一块普通的 800M 左右的 IDE 硬盘,连在目标机器的 IDE 线上。这样在我们的目标机器上,IDE1 上挂的是 Flash 盘,IDE2 上挂的是一块工作硬盘。我们用标准的步骤在 IDE2 的标准硬盘上装上一个 Debian GNU/Linux 系统。当然,如果读者朋友们手头没有 Debian,也可以装 Red Hat 系统。装好工作系统之后,要首先做一些裁减工作,把不必要的 Service 和 X Window 等等东西都删掉。这样做的目的是增进系统启动速度,因为我们在后面的工作中,肯定要不停的重新启动机器,所以启动速度对我们的工作效率是很关键的。

装好工作系统之后,在 Falsh 盘上做一个 Ext2 文件系统,这个用 mke2fs 这个命令就可以完成。由于 Flash 盘是接在 IDE1 上的,所以在 Linux 里面,它的身份是 /dev/hda。本文作者在操作的时候,把整个 Flash 盘划分了一个整个的分区,所以,调用 mke2fs 的时候,处理的是 /dev/hda1。读者朋友们应该可以直接在 /dev/hda 上做一个 Ext2 文件系统,而不用事先分区。

在 Flash 盘上做好了文件系统之后,就可以把一个编译好的内核映像文件 vmlinuz 拷贝到 Flash 盘上了。注意,必须要先把这个 vmlinuz 映像文件拷贝到 Flash 盘上,然后才能在 Flash 盘上安装 LILO。不然的话,LILO 到时候可是会 LILILILI 打结巴的,因为它会找不到 Kernel Image 在 Flash 盘上的位置的,那样的话 Flash 盘也就启动不起来了。还有,如果读者朋友们在 Flash 盘上用的是一个压缩的文件系统的话,到时候 LILO 也会出问题,它虽然能正确的找到 Kernel Image 在硬盘上的起始位置,但是它却没有办法处理被文件系统重新压缩过的这个 Kernel Image,不知道该如何把它展开到内存中去。

把 Kernel Image 拷贝过去以后,我们就可以动手编辑一份 lilo.conf 文件,这份文件可以就放在工作系统上就行了。但是注意在 lilo.conf 中索引的文件名的路径可要写对。这些路径名都是在工作系统上看上去的路径名。比如,如果 Flash 盘 Mount 在 /mnt 目录下面,那么,在 lilo.conf 中,vmlinuz 的路径名就是 /mnt/vmlinuz。注意这一点千万不要搞错。不然的话,如果一不小心把工作系统的 LILO 给破坏掉了,那就麻烦了。编辑好了 lilo.conf,然后再运行 lilo 命令,注意,要告诉它用这个新的 lilo.conf 文件,而不要用 /etc/lilo.conf。

安装好 LILO 之后,我们可以立即重新启动,测试一下。首先在 BIOS 里面,设置成从 IDE1 开始启动,如果我们看到 LILO 的提示符,按回车后还能看到 Kernel 输出的消息,这就算是 LILO 的安装成功了。记得这个操作的方法,以后每次我们更新 Flash 盘上的 Kernel Image,都记得要更新 LILO。也就是说,要重新运行一遍 lilo 命令。

编译内核

试验成功 LILO 的安装以后,我们开始考虑编译一个新的内核。当然,要编译新的内核,我们首先要进入我们的工作系统。这里有两个办法进入工作系统,一是在 BIOS 里面设置从 IDE2 启动,当然,这就要求当初安装工作系统的时候,要把 LILO 安装在 /dev/hdb 上;另一个办法是还是从 IDE1 启动,不改变 BIOS 的设置,但是在看到 LILO 的提示符的时候,要键入 linux root=/dev/hdb1,最前面的 linux 是在 lilo.conf 里面定义的一个 entry,我们只采用这个 entry 所指定的 Kernel Image,但是用 /dev/hdb1 作为 root 文件系统。两个办法可能有的时候一个比另一个好,更方便一些。这就要看具体的情况了。不过,它们的设置并不是互相冲突的。

在编译内核的时候,由于我们的内核是只有一台机器使用的,所以我们应该对它的情况了如指掌;另外一方面,为了减低不必要的复杂性,我们 决定不用 kernel module 的支持,而把所有需要的东西直接编译到内核的里面。这样编译出来的内核,在一台普通的 586 主板上,把所有必要的功能都加进去,一般也不到 800K 字节。所以,这个办法是可行的。而且减低了 init scripts 的复杂程度。从运行方面来考虑,由于需要的 kernel 代码反正是要装载到内存中的,所以并不会引起内存的浪费。

在我们的目标平台上,我们希望使用 USB 存储设备。还有一点要注意的,就是对 Frame buffer 的支持。这主要是为了支持 XFree86。一般说来,如果我们的显卡是 XFree86 直接支持的,那当然最好,也就不需要 frame buffer 的内核支持。但是如果 XFree86 不支持我们的显卡,我们可以考虑用 VESA 模式。但是 XFree86 的 VESA 卡支持运行起来不太漂亮,还有安全方面的问题,有时在启动和退出 X Window 的时候会出现花屏。所以我们可以采用 kernel 的 vesa 模式的 frame buffer,然后用 xfree86 的 linux frame buffer 的驱动程序。这样一般就看不到花屏的现象了,而且安全方面也没有任何问题。

devfs 也是我们感兴趣的话题。如果 kernel 不使用 devfs,那么系统上的 root 文件系统就要有 /dev 目录下面的所有内容。这些内容可以用 /dev/MAKEDEV 脚本来建立,也可以用 mknod 手工一个一个来建。这个方法有其自身的好处。但是它的缺点是麻烦,而且和 kernel 的状态又并不一致。相反的,如果使用了 devfs,我们就再也不用担心 /dev 目录下面的任何事情了。/dev 目录下面的项目会有 kernel 的代码自己负责。实际使用起来的效果,对内存的消耗并不明显。所以我们选择 devfs。

busybox

有了 LILO 和 kernel image 之后,接下来,我们要安排 root 文件系统。由于 flash 盘的空间只有 16M 字节,可以说,这是对我们最大的挑战。这里首先要向大家介绍小型嵌入式 Linux 系统安排 root 文件系统时的一个常用的利器:BusyBox。

Busybox 是 Debian GNU/Linux 的大名鼎鼎的 Bruce Perens 首先开发,使用在 Debian 的安装程序中。后来又有许多 Debian developers 贡献力量,这其中尤推 busybox 目前的维护者 Erik Andersen,他患有癌症,可是却是一名优秀的自由软件开发者。

Busybox 编译出一个单个的独立执行程序,就叫做 busybox。但是它可以根据配置,执行 ash shell 的功能,以及几十个各种小应用程序的功能。这其中包括有一个迷你的 vi 编辑器,系统不可或缺的 /sbin/init 程序,以及其他诸如 sed, ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat … 等等这些都是一个正常的系统上必不可少的,但是如果我们把这些程序的原件拿过来的话,它们的体积加在一起,让人吃不消。可是 busybox 有全部的这么多功能,大小也不过 100K 左右。而且,用户还可以根据自己的需要,决定到底要在 busybox 中编译进哪几个应用程序的功能。这样的话,busybox 的体积就可以进一步缩小了。

使用 busybox 也很简单。只要建一个符号链接,比方 ln -s /bin/busybox /bin/ls,那么,执行 /bin/ls 的时候,busybox 就会执行 ls 的功能,也会按照 ls 的方式处理命令行参数。又比如 ln -s /bin/busybox /sbin/init,这样我们就有了系统运行不可或缺的 /sbin/init 程序了。当然,这里的前提是,你在 busybox 中编译进去了这两个程序的功能。

这里面要提出注意的一点是,busybox 的 init 程序所认识的 /etc/inittab 的格式非常简单,而且和常规的 inittab 文件的格式不一样。所以读者朋友们在为这个 busybox 的 init 写 inittab 的时候,要注意一下不同的语法。至于细节,就不在我们这里多说了,请大家参考 Busybox 的用户手册。

从启动到进入 shell

busybox 安装好以后,我们就可以考虑重新启动,一直到进入 shell 提示符了。这之前,我们要准备一下 /etc 目录下的几个重要的文件,而且要把 busybox 用到的 library 也拷贝过来。

用 ldd 命令,后面跟要分析的二进制程序的路径名,就可以知道一个二进制程序,或者是一个 library 文件之间的互相依赖关系,比如 busybox 就依赖于 libc.so 和 ld-linux.so ,我们有了这些知识,就可把动手把所有需要的 library 拷贝到 flash 盘上。由于我们的 flash 盘说大不大,说小倒也不小,有 16M 字节之多。我们直接就用 Glibc 的文件也没有太多问题。如果读者朋友们有特殊的需要,觉得 Glibc 太庞大了的话,可以考虑用 uClibc,这是一个非常小巧的 libc 库,功能当然没有 Glibc 全,但是足够一个嵌入式系统使用了。本文就不再介绍 uClibc 了。

库程序拷贝过来以后,我们就可以考虑系统启动的步骤了。启动的时候,先是 lilo,接下来就是 kernel,kernel 初始化之后,就调用 /sbin/init,然后由 init 解释 /etc/inittab 运行各种各样的东西。inittab 会指导 init 去调用一个最重要的系统初始化程序 /etc/init.d/rcS,我们将要在 rcS 中完成各个文件系统的 mount,此外,还有在 rcS 中调用 dhcp 程序,把网络架起来。rcS 执行完了以后,init 就会在一个 console 上,按照 inittab 的指示开一个 shell,或者是开 getty + login,这样用户就会看到提示输入用户名的提示符。我们这里为了简单起见,先直接进入 shell,然后等到调试成功以后,再改成直接进入 X Window。

关于 inittab 的语法,我们上面已经提到过了,希望读者朋友们去查权威的 busybox 的用户手册。这里,我们先要讲一下文件系统的构成情况。

安排文件系统

大家已经看到,我们的 root 文件系统为了避免麻烦,用的是标准的 ext2 文件系统。由于我们的硬盘空间很小,只有不到 16M,而且我们还要在上面放上 X Window,所以,如果我们全部用 ext2 的话,Flash 盘的有限空间会很快耗尽。我们唯一的选择是采用一个适当的压缩文件系统。考虑到 /usr 目录下面的内容在系统运行的时候,是不需要被改写的。我们决定选择只读的压缩文件系统 cramfs 来容纳 /usr 目录下面的全部内容。

cramfs 是 Linus Torvalds 本人开发的一个适用于嵌入式系统的小文件系统。由于它是只读的,所以,虽然它采取了 zlib 做压缩,但是它还是可以做到高效的随机读取。既然 cramfs 不会影响系统读取文件的速度,又是一个高度压缩的文件系统,对于我们,它就是一个相当不错的选择了。

我们首先把 /usr 目录下的全部内容制成一个 cramfs 的 image 文件。这可以用 mkcramfs 命令完成。得到了这个 usr.img 文件之后,我们还要考虑怎样才能在系统运行的时候,把这个 image 文件 mount 上来,成为一个可用的文件系统。由于这个 image 文件不是一个通常意义上的 block 设备,我们必须采用 loopback 设备来完成这一任务。具体说来,就是在前面提到的 /etc/init.d/rcS 脚本的前面部分,加上一行 mount 命令:

mount -o loop -t cramfs /usr.img /usr

 

这样,就可以经由 loopback 设备,把 usr.img 这个 cramfs 的 image 文件 mount 到 /usr 目录上去了。哦,对了,由于要用到 loopback 设备,读者朋友们在编译内核的时候,别忘了加入内核对这个设备的支持。对于系统今后的运行来说,这个 mount 的效果是透明的。cramfs 的压缩效率一般都能达到将近 50%,而我们的系统上绝大部分的内容是位于 /usr 目录下面,这样一来,原本可能要用到 18M 的 Flash 盘,现在可能只需要 11M 就可以了。一个 14M 的 /usr 目录,给压缩成了仅仅 7M。

上面考虑了压缩问题,下面还要考虑到,Flash 盘毕竟不像普通硬盘,多次的擦写毕竟不太好,所以我们考虑,在需要多次擦写的地方,使用内存来做。这个任务,我们考虑用 tmpfs 来完成。至于 tmpfs 和经典的 ramdisk 的比较,我们这里就不多说了。一般说来,tmpfs 更加灵活一些,tmpfs 的大小不像 ramdisk,可以顺着用户的需要增长或者缩小。我们选择把 /tmp、/var 等几个目录做成 tmpfs。这只需要我们在 /etc/fstab 里面加上两行类似下面的文字就可以了:

none /var tmpfs default 0 0

 

然后别忘了在 /etc/init.d/rcS 里面靠近开头的地方,加上 mount -a。这样,就可以把 /etc/fstab 里面指定的所有的文件系统都 mount 上来了。

X Window

进行到这里,读者朋友们可能会以为,X Window 的安装可能会很复杂。其实不然,由于我们上面的架子搭好了,X Window 的安装非常简单,只需要把几个关键的程序拷贝过来就可以了。一般说来,只需要 /usr/X11R6 目录下面的 bin 和 lib 两个目录。然后,根据用户各自的需要,还可以做大幅的裁减。比如,如果你的局域网上有一个开放的 xfs 字体服务器的话,你可以把所有本地的字体都删掉,而使用远端的字体服务器。如果只需要运行有限的程序,别忘了把没有用的 library 都删掉。此外,还可以把多余的 X Window 的 driver 都删掉,只保留本机的显示卡所需要的 driver 就可以了。

当然,这一关免不了要做多次测试。

其它技巧

如果你的工作系统式在另外一台机器上,通过局域网和本机互联的话,ssh 是一个不错的工具。此外,ssh 中带的 scp 用起来和普通的 cp 拷贝程序差不多,非常方便。用 ssh 和 scp 来共享文件,远程试验,你就可以不需要在办公室里跑来跑去的了。

如果你需要一个 MS Windows 上运行的 X Server 和 xfs 字体服务器,可以考虑包括在 Red Hat 的 Cygwin 工具箱中的 XFree86 系统。

 

参考资料

关于作者

赵蔚,自由职业者。我的网络日记位于 http://www.advogato.org/person/zhaoway/。上面列有我在网络上发表的其它的文章。欢迎读者朋友们来信和我讨论问题。

赵蔚 (zhaoway@public1.ptt.js.cn), 自由职业者, Author company

from:

http://www.ibm.com/developerworks/cn/linux/embed/diy/

-end-

好烂啊有点差凑合看看还不错很精彩 (No Ratings Yet)
Loading...
164 views
好烂啊有点差凑合看看还不错很精彩 (No Ratings Yet)
Loading...
424 views
seq command in Linux

seq command in Linux

SEQ(1) User Commands SEQ(1)

NAME
seq – print a sequence of numbers

SYNOPSIS
seq [OPTION]… LAST
seq [OPTION]… FIRST LAST
seq [OPTION]… FIRST INCREMENT LAST

DESCRIPTION
Print numbers from FIRST to LAST, in steps of INCREMENT.

-f, –format=FORMAT
use printf style floating-point FORMAT

-s, –separator=STRING
use STRING to separate numbers (default: \n)

-w, –equal-width
equalize width by padding with leading zeroes

–help display this help and exit

–version
output version information and exit

If FIRST or INCREMENT is omitted, it defaults to 1. That is, an omitted INCREMENT
defaults to 1 even when LAST is smaller than FIRST. FIRST, INCREMENT, and LAST are inter-
preted as floating point values. INCREMENT is usually positive if FIRST is smaller than
LAST, and INCREMENT is usually negative if FIRST is greater than LAST. FORMAT must be
suitable for printing one argument of type 鈥榙ouble鈥 it defaults to %.PRECf if FIRST,
INCREMENT, and LAST are all fixed point decimal numbers with maximum precision PREC, and
to %g otherwise.

AUTHOR
Written by Ulrich Drepper.

REPORTING BUGS
Report seq bugs to bug-coreutils@gnu.org
GNU coreutils home page:
General help using GNU software:
Report seq translation bugs to

使用示例见:

seq bash

-end-

好烂啊有点差凑合看看还不错很精彩 (No Ratings Yet)
Loading...
441 views
如何开始你的CTF比赛之旅

如何开始你的CTF比赛之旅

在过去的两个星期里,我已经在DEFCON 22 CTF里检测出了两个不同的问题:“shitsco”和“nonameyet”。感谢所有的意见和评论,我遇到的最常见的问题是:“我怎么才能在CTFs里开始?”在不久前我问过自己一样的问题,所以我想要给出些对你追求CTFs的建议和资源。最简单的方法就是注册一个介绍CTF的帐号,如CSAWPico CTFMicrocorruption或是其他的。通过实践、耐心和奉献精神,你的技能会随着时间而提高。

如果你对CTF竞争环境之外的问题有兴趣,这里有一些CTF比赛问题的集锦。挑战往往也是有多种不同的难度级别,注意解决最简单的问题。难易程度是根据你的个人技能的程度决定的,如果你的长处是取证,但是你对加密不在行,取证问题将会成为得分点而相比之下加密问题就会拖后腿。CTF组织者对此有同样的感知,这是为什么对于CTF比赛的评价是很大的挑战性。

如果你已经亲自尝试过几个基础问题且仍然苦恼,现在有很多自学的机会!CTF比赛主要表现以下几个技能上:逆向工程、密码学、ACM编程、web漏洞、二进制练习、网络和取证。可以从中选择并关注一个你已经上手的技能方向。

1、逆向工程。我强烈建议你得到一个IDA Pro的副本,这有免费版和学生认证书。尝试下crack me的问题。写出你的C语言代码,然后进行反编译。重复这个过程,同时更改编译器的选项和程序逻辑。在编译的二进制文件中“if”声明和“select”语句有什么不同?我建议你专注于一个单一的原始架构:x86、x86_64或是ARM。在处理器手册中查找你要找的,参考有:

《Practical Reverse Engineering》

《Reversing: Secrets of Reverse Engineering》

《The IDA Pro Book》

2、加密。虽然这不是我自己的强项,但这里有一些参考还是要看看的:

《Applied Cryptography》

《Practical Cryptography》

Cryptography I

3、ACM编程。选择一个高层次的语言,我推荐使用Python或Ruby。对于Python而言,阅读下《Dive into Python》和找一些你要加入的项目。值得一提的是Metasploit是用Ruby编写的。关于算法和数据结构的计算机科学课也要在此类中要走很长的路。看看来自CTF和其他编程的挑战,战胜他们。专注于创建一个解决方法而不是最快或是最好的方法,特别是在你刚刚开始的时候。

4、web漏洞。有很多的网络编程技术,在CTF中最流行的就是PHP和SQL。php.net网站(译者注:需翻墙)是一个梦幻的语言参考,只要搜索你好奇的功能。PHP之后,看到网页上存在的挑战的最常见的方法就是使用Python或Ruby脚本。主要到技术有重叠,这有一本关于网络安全漏洞的好书,是《黑客攻防技术宝典:Web实战篇》。除此之外,在学习了一些基本技术之后,你可能也想通过比较流行的免费软件工具来取得一些经验。这些在CTF竞争中也可能会偶尔用到,这些加密会和你凭经验得到的加密重叠。

5、二进制练习。这是我个人的爱好,我建议你在进入二进制练习前要完成逆向工程的学习。这有几个你可以独立学习的常见类型漏洞:栈溢出堆溢出,对于初学者的格式字符串漏洞。很多是通过练习思维来辨别漏洞的类型。学习以往的漏洞是进入二进制门槛的最好途径。推荐你可以阅读:

《黑客:漏洞发掘的艺术》

《黑客攻防技术宝典:系统实战篇》

《The Art of Software Security Assessment》

6)取证/网络。大多数的CTF团队往往有“一个”负责取证的人。我不是那种人,但是我建议你学习如何使用010 hex editor,不要怕做出荒谬、疯狂、随机的猜测这些问题运行的结果是怎样。

最后,Dan Guido和公司最近推出了CTF领域指南,会对以上几个主题的介绍有很好的帮助。

How to get started in ctf?
The First setp. Get Answering system shell . like HMAC Code execution bypass adminlogin
Second step. copy flag to you Hard Drive
Third step. post the flag one by one in system
So you can get money and Honor come back home

from:

http://www.endgame.com/blog/how-to-get-started-in-ctf.html

-end-

好烂啊有点差凑合看看还不错很精彩 (No Ratings Yet)
Loading...
231 views
Memory Overcommit in Linux

Memory Overcommit in Linux

理解Linux的memory overcommit

Memory Overcommit的意思是操作系统承诺给进程的内存大小超过了实际可用的内存。一个保守的操作系统不会允许memory overcommit,有多少就分配多少,再申请就没有了,这其实有些浪费内存,因为进程实际使用到的内存往往比申请的内存要少,比如某个进程malloc()了200MB内存,但实际上只用到了100MB,按照UNIX/Linux的算法,物理内存页的分配发生在使用的瞬间,而不是在申请的瞬间,也就是说未用到的100MB内存根本就没有分配,这100MB内存就闲置了。下面这个概念很重要,是理解memory overcommit的关键:commit(或overcommit)针对的是内存申请,内存申请不等于内存分配,内存只在实际用到的时候才分配。

Linux是允许memory overcommit的,只要你来申请内存我就给你,寄希望于进程实际上用不到那么多内存,但万一用到那么多了呢?那就会发生类似“银行挤兑”的危机,现金(内存)不足了。Linux设计了一个OOM killer机制(OOM = out-of-memory)来处理这种危机:挑选一个进程出来杀死,以腾出部分内存,如果还不够就继续杀…也可通过设置内核参数 vm.panic_on_oom 使得发生OOM时自动重启系统。这都是有风险的机制,重启有可能造成业务中断,杀死进程也有可能导致业务中断,我自己的这个小网站就碰到过这种问题,参见前文。所以Linux 2.6之后允许通过内核参数 vm.overcommit_memory 禁止memory overcommit。

内核参数 vm.overcommit_memory 接受三种取值:

  • 0 – Heuristic overcommit handling. 这是缺省值,它允许overcommit,但过于明目张胆的overcommit会被拒绝,比如malloc一次性申请的内存大小就超过了系统总内存。Heuristic的意思是“试探式的”,内核利用某种算法(对该算法的详细解释请看文末)猜测你的内存申请是否合理,它认为不合理就会拒绝overcommit。
  • 1 – Always overcommit. 允许overcommit,对内存申请来者不拒。
  • 2 – Don’t overcommit. 禁止overcommit。

关于禁止overcommit (vm.overcommit_memory=2) ,需要知道的是,怎样才算是overcommit呢?kernel设有一个阈值,申请的内存总数超过这个阈值就算overcommit,在/proc/meminfo中可以看到这个阈值的大小:

CommitLimit 就是overcommit的阈值,申请的内存总数超过CommitLimit的话就算是overcommit。
这个阈值是如何计算出来的呢?它既不是物理内存的大小,也不是free memory的大小,它是通过内核参数vm.overcommit_ratio或vm.overcommit_kbytes间接设置的,公式如下:
【CommitLimit = (Physical RAM * vm.overcommit_ratio / 100) + Swap】

注:
vm.overcommit_ratio 是内核参数,缺省值是50,表示物理内存的50%。如果你不想使用比率,也可以直接指定内存的字节数大小,通过另一个内核参数 vm.overcommit_kbytes 即可;
如果使用了huge pages,那么需要从物理内存中减去,公式变成:
CommitLimit = ([total RAM] – [total huge TLB RAM]) * vm.overcommit_ratio / 100 + swap
参见https://access.redhat.com/solutions/665023

/proc/meminfo中的 Committed_AS 表示所有进程已经申请的内存总大小,(注意是已经申请的,不是已经分配的),如果 Committed_AS 超过 CommitLimit 就表示发生了 overcommit,超出越多表示 overcommit 越严重。Committed_AS 的含义换一种说法就是,如果要绝对保证不发生OOM (out of memory) 需要多少物理内存。

“sar -r”是查看内存使用状况的常用工具,它的输出结果中有两个与overcommit有关,kbcommit 和 %commit:
kbcommit对应/proc/meminfo中的 Committed_AS;
%commit的计算公式并没有采用 CommitLimit作分母,而是Committed_AS/(MemTotal+SwapTotal),意思是_内存申请_占_物理内存与交换区之和_的百分比。

附:对Heuristic overcommit算法的解释

内核参数 vm.overcommit_memory 的值0,1,2对应的源代码如下,其中heuristic overcommit对应的是OVERCOMMIT_GUESS:

Heuristic overcommit算法在以下函数中实现,基本上可以这么理解:
单次申请的内存大小不能超过 【free memory + free swap + pagecache的大小 + SLAB中可回收的部分】,否则本次申请就会失败。

 

参考:
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting
https://www.win.tue.nl/~aeb/linux/lk/lk-9.html
https://www.kernel.org/doc/Documentation/sysctl/vm.txt
http://lwn.net/Articles/28345/

from:

理解Linux的memory overcommit

-end-

好烂啊有点差凑合看看还不错很精彩 (No Ratings Yet)
Loading...
477 views
湾区日报是如何运作的

湾区日报是如何运作的

Updated April 17, 2016

这篇文章第一版是2015年5月份写的,现在看来有点“过时”了。是的,几个月的时间是能改变很多事情的。所以我决定每隔一段时间把这篇文章更新一次。


湾区日报是什么?

湾区日报是一个在旧金山工作的工程师运营的个人博客。该博客每天挑选5篇他主观认为高质量的文章,针对每篇文章拟一个中文标题写一两句简单评论,通过将近10个渠道(比如网站iOS app微博微信Twitter等)推荐给读者们。

写这篇文章的“我”就是这个工程师。湾区日报不是一个公司,也不是一个创业项目。只是我的一个 side project。从 2014年8月6日发第一期以后,运营至今。

看上去很简单,对吧?我一开始做的时候也觉得很简单,很没技术含量,任何有高中文凭具有简单电脑知识的人都能运营这种博客。但为什么同一道命题作文,每个人写的内容不一样,有人能写离题有人能写满分作文?为什么大家都会写字,有人“竟然”能成为作家并靠写字为生?

每天的内容是如何发出的?

我在每天利用零散时间发现新文章,然后直觉认为是好文章的就收藏在Pocket 里。发现新文章的渠道很多,排名不分先后:Hacker NewsMediumQuora,我订阅的很多博客的RSS,各种社交网络上看到的文章,头脑中突然对某个主题感兴趣临时搜来的文章,与同事交谈中得知的文章等。

我也利用白天的各种零散时间读一两篇文章。但一般都是晚上回家吃完晚饭后,再开始用完整的时间专心读。每天读的文章数量不一定,有时候一天读20几篇,勉强挑出5篇;有时候一天读了5篇,但都觉得很不错,就不读其他的了。这个过程一般要花1到3个钟头。

我一般用 iPad 读文章,然后多任务打开 Slack,在里面跟我的小机器人(wanqu-ops)对话,有点像程序员工作的时候敲命令行一样。我会告诉小机器人,这是一篇文章的链接,然后它会自动提取文章的标题,url的slug,图片等信息,最后插入到后台数据库;每5篇文章自动生成新的一期,自动生成当天的日期(北京时间)以及当天的期号(比如第502期)。总之,我只要把链接扔给这个小机器人,它就能帮我做这些繁琐的事情了 --一个普通网站的小编会怎么做?会用CMS,然后一项一项手动输入,这个过程不会花太多时间,可能每天十几分钟吧;但我实在太懒了,连每天花这十几分钟都不舍得。

下一步要写简评。我也是跟小机器人对话,比如 “wq post 2672 title 这是一篇好文章” ,就是告诉它:我要把编号 2672 的文章标题改成 “这是一篇好文章”。同理,可以录入文章简评等内容。下图是我在 iPad 上读文章然后用 Slack 写简评:

凑足5篇文章后,我最后给小机器人下达命令:把这期的内容发出。然后它就自动把内容更新到网站,消息推送给 iOS app 的用户,自动发布到微博TwitterFacebook等社交平台。

总之,手动操作的部分主要是读文章与写简评。剩下的繁琐的操作,都是由程序自动完成的。同一道命题作文,程序员的写法是和普通网站小编不一样的;不同程序员的写法也会不同。

背后的技术

我为湾区日报这个 side project 写了一些代码。由于只是 side project,我对它的期望不高,力求用最简单的做法,花最少的时间,用最“快糙猛”的方法实现我想要的功能。

网站与后台架构

2014年8月份,湾区日报只是处于”闹着玩”的阶段,没有严肃要做的意思。所以那个时期的湾区日报网站只是一些静态网页,用 Pelican 生成的。

之后的网站换成了 WordPress。换了几个不同的主题。甚至还花了些钱买了 Product Hunt 的主题。

到了2015年3月份的某个周末,我也不知道哪根筋接错了,就宅在家里一天,从头写了现在的这个网站。主要用 Python/Django,Celery,RabbitMQ,Postgres 以及 Redis 搭建的。

为什么用Django?为什么能在一天做一个网站?很简单,我在过去两三年自己写了大大小小10几个 Web App,都是写着玩的 side project,都是用 Django/Postgres 搭建的,只是一个套路而已。将自己以前写的代码复制粘贴,当然可以很快拼凑一个网站出来了。况且,第一版的网站远比现在大家看到的这个网站简单得多;现在这个版本的网站是经过1年多时间不断改进的成果。

所有网站基本都能简化成这个架构:Web App,Datastore,Async Worker,Task Queue,以及 Scheduler。其中,Web App就是跑网站代码接受用户的访问请求,所有耗时间的task(比如发邮件,发微博,数据统计等)都扔到Task Queue上,然后Async Worker从Task Queue抓task过来离线处理;而Scheduler就是定时跑程序,很多网站直接用的Cron。

对于湾区日报,Web App就是Django App,用uwsgi跑N个进程,用supervisord 来管理进程,前面挂一个 nginx 当 load balancer。Database用的是PostgresRedis 。其中,大部分需要永久存储的数据都在Postgres中,而Redis存的是文章的访问数与一些只需保留一两天的数据。Task Queue是用RabbitMQ。Scheduler用的是Celery Beat。而Async Worker是Celery。下图是湾区日报后台简单的架构:

湾区日报的所有这些后台的大大小小20几个进程是跑在3台 DigitalOcean 的虚拟机上(每个月花$50多)。按照访问量的增长速度,这样的架构估计至少可以支撑到2020年 — 大家整天在科技媒体上看到每天动辄几百万几千万访问量,可能都忘了世界上大部分的网站其实访问量都非常非常少的吧。当然,我在这3台虚拟机上也跑了其他的 side project,也不算浪费计算资源。我自己还有一些简单的小项目放在Bluehost上,与别人共享主机(没有root权限),就是图个便宜(每月低于$5)。

iOS App

2015年5月份的时候,用了一个周末写了 iOS App。完完全全用 Swift 写的,很不错的体验。前面说了,这只是一个 side project,所以期望不高,我是可以厚着脸皮上线质量低劣的一个周末写的 app 的,反正也没什么人用,以后慢慢改进就是了。

后台的 Api 也是 Django App(抽象出一些通用的内部 api 与网站共用),也是跑了 个 uwsgi 进程然后用 nginx 做 load balancer。

在开发第一版 App 的那个周末,除了完成基本的功能(浏览文章)外,还加入:

  • Crash report(用 Crashlytics),第一时间通知我用户的 app crash 了,方便我调试;
  • Google Anlytics,监测用户使用 app 的情况,比如多少人在线,哪个页面比较多人访问,哪个按钮比较多人点击等;
  • Appirater,提醒那些使用了几次 App 的用户去 App Store 给个好评;
  • PSUpdateApp,提醒用户有新版本了,快及时更新。

这些都只是套路而已。尽管不是 iOS 开发人员,但至少要有这么一个意识。上线一个产品,最基本的东西都要有:收集 metrics,收集 crash 的信息,更新提醒等 --开始做 app 之前有跟同事打听了一下应该用哪些工具,少走了不少弯路。详见这篇博文:两天四夜上线一个 App

发布系统

湾区日报这个博客有很多推送的渠道。现代博客与10年前的博客不同:10年前的博客就是一个网站,而现代的博客形式多样,同一份内容会以不同的形式通过不同的渠道出现在读者面前。

前面介绍到我用 Slack 与机器人对话。这机器人就是 Hubot -- 它解析我发出的命令,然后调用我在 Django App 里提供的 REST api 发布文章;当文章的状态由 pending 变成 published后,将触发一些 Celery tasks;每个 task 负责一个渠道的发布任务,比如一个task发布到微博,一个task发布到reddit等。

微博:调用微博 api 发布。凡是微博的帖子底部有 “来自 湾区日报BayArea” 字样的,都是由发布系统自动发布的。

微信:理论上,成为认证用户后,可以调用 api 自动发消息给订阅者们。但我没有成为认证用户,只能手动发布。Hubot会生成每期需要发布的文字,我只要复制粘贴就能发出消息了。对于微信,我基本是放弃了,完全不上心;因为湾区日报这种分享链接的模式很不适合在微信这种平台做。

Twitter:调用 Twitter 的 api 发布。Twitter 的 api 做得不错。

Facebook:调用 Facebook 的 Graph API 发布。

Reddit:调用 Reddit 的 api 发布的。难道有中文用户上 Reddit?我不确定。我只是把 Reddit 当作一种 SEO 的手段而已。

Google+:Google提供的api很难用,我不愿意花时间研究,于是就用 Buffer自动同步 Twitter 上发的内容。

邮件订阅:用 MailChimp 自动读取 RSS,每天定时自动发布。

iOS App 推送:没什么好说的,就是 APNS。每隔2个钟头,会有一个 Celery Beat 的 job 清理掉那些已经失效的 device token(比如有用户关掉了 push notification 或者已经把湾区日报的 app 卸载了);这就是为什么打开消息推送的用户数字有时候会变小。定期清除失效的 device token 可以避免浪费服务器计算资源白白发送无效的 push notification。

RSS:老旧的,但仍然很有用的 RSS。你会很惊讶,现在很多线上媒体不提供 RSS订阅。

为了避免同一篇文章在短时间内不小心被多次发到以上渠道,我会针对每篇文章生成一个 uuid 存到 Redis 里;每次修改文章简评的时候,会查一下这个 uuid 是否存在,如果不存在,就推送到以上渠道;反之就不推送。

很多读者注意到了,湾区日报在各个社交媒体上不断炒冷饭,重复发布几个月前发过的文章。我在 FAQ 里有详细说明原因。简单说,半年后,湾区日报的读者数量翻倍,将有一半的读者没有读过我以前推荐过的文章,“旧”的文章对他们而言是“新”的。

怎么炒冷饭呢?每天推荐新文章时,我会判断这篇文章是不是 evergreen content,半年后来看是否依然适用;如果是的话,我就把该文章扔到一个队列中(存在 Postgres 里);然后 Celery Beat 每个钟头会有一定概率(不同时段的概率不同)从队列里取出文章发到微博,Twitter,Facebook等社交媒体上,比如这条微博。队列里的这些旧文我会定期清理;有的文章真的发了好几次了,老读者们是在看腻了或者已经不再适用了(比如关于 Apple Watch即将发布的相关文章;现在 Apple Watch已经发布了,就不能再发这类文章),那就得从队列里删除。

数据统计

如果你经常使用湾区日报的 iOS app 或者网站,你就会发现我竟然公开了湾区日报的运营数字:访问量,app下载量,app打开消息推送的用户数,app的付费用户数等。下图告诉你在哪里可以找到湾区日报的各种运营数据:

湾区日报毕竟不是一个公司,我也不跟任何人合作,所以我说的算。我觉得中文的互联网上能找到运营网站的实战案例很少。一个对互联网感兴趣的人,当然希望能看到一个真实的运营案例以及真实的数据,作为一个学习材料 -- 有点像教科书上的案例分析。

这些数据分别从 App Annie 的 api,Google Analytics 的 api,以及我自己的后台数据库去抓去。Celery Beat 每小时开启一个 job 更新一下这些数据。

对于湾区日报的 iOS App,我最关心的数字是有多少用户开启了 push notification;只有开启了 push notification,用户才能及时得知当天的湾区日报的更新。每当有一个新用户开启了 push notification 或付费了,我的 Slack 就得到通知。下图是我 iWatch 上来自 Slack 的通知,告诉我此刻有一个新用户下载了 App 并且打开了 push notification:

关于 Slack 与 Hubot,详见这篇博文:湾区日报的第一个“员工”:Slack/Hubot

湾区日报分享的每篇文章都有一个访问量的统计,这个统计数字是存在 Redis 上,这比存在 Postgres 上每次访问都要写数据库的 cost 要小得多;存在 Redis 上即使失去了1小时的数据也无所谓,这个统计数字不是那么 critical。

搜索功能

网站与 iOS app 上都可以关键词搜索往期的文章。我原来想用 ElasticSearch 来做一下,但想着要多管理一个ElasticSearch就不爽,这样就多了一个 failure point,运维上可能得多花点时间,不划算。

后来受到这篇文章的启发,用一个晚上的时间直接利用 Postgres 做全文索引,并实现了网站与 app 的搜索功能,真是快糙猛的做法。

运维

我一般每星期发布一次新版本的 iOS App。每次的更新其实很有限。我每星期一般只能花不到一小时来写 app 的代码。

网站后台代码的更新主要通过 Slack。仍然是与小机器人对话:“wq deploy”。它就会 checkout 网站的 Git repo 的最新 master branch,然后重启相关进程。我用 symlink 做了版本控制,所以如果发现严重的bug,要 rollback 到前一个版本的话,只需要切换一下 symlink,几秒钟的事情。

发布代码变得轻松愉快,且充满自信,这就鼓励了开发人员(我)勇于尝试各种新奇的 idea,勇于快速迭代,快速部署小更新。所以湾区日报一直在进化。湾区日报的今天没有比昨天好多少,但这个季度肯定比上个季度改进了不少。

监控网站是否挂了,我用的是 Pingdom;如果网站挂了,我会收到短信提醒。监控服务器各种计算资源的使用情况,我用的是 Datadog(2年前去开Dockercon 的时候,在他们摊位聊了很久,才知道有这么个东西)--理论上,monitoring 与 alerting 都可以自己用开源软件搭建,但是,湾区日报只是一个 side project 而已,有现成可以凑活着用的SaaS方案,就不必花时间自己做了;而且自己做的肯定不如人家专业的。

对于网站与app后台的详细监控,我用的是Datadog。可以方便地看到不同 endpoint 在特定时间段内的请求次数以及latency。详情请见:湾区日报是如何监控系统的健康情况的

网站域名的 DNS 管理,我用 CloudFlare。使用 CloudFlare 还有其他的好处,比如它帮我挡住了不少恶意请求,帮我缓存了各种静态文件。

客服

每天都有读者来信。当然,大部分的问题都能在 FAQ 里得到解答。但也有很多来信给了我很多鼓励,知道你们从湾区日报推荐的文章里学到了东西得到了成长,我真的很高兴。

微博与微信上的读者来信,大部分都能得到关键词匹配的自动回复,算是缓解了我手动回复的压力。而花时间去写 FAQ 页面则省去了回复大部分邮件的时间。

代码管理与新功能的开发

湾区日报有3个 git repo(网站后台,iOS app,以及运维相关的脚本),都放在 Bitbucket 上,不对外公开。使用 Bitbucket 而不用 GitHub 的原因是为了省钱;如果要在 GitHub 上使用 private repo,得交钱;而 Bitbucket 我个人用的话,可以有无限数量的 private repo。

我比较倾向于 commit 小段代码,出问题了也可以比较小粒度地 revert。一般一个 commit 包含的代码量不多于 100 行。很显而易见的代码修改我直接在 master branch 上操作,然后直接 push master;比较 tricky 的代码修改我会建立一个新的 branch,然后给自己发 pull request,自己 review 一遍自己写的代码。

我经常上线没有写完的代码,然后 wrap 在 feature switch 里面。我这种小破 project 大部分的方案都是土办法,不用太学术派不用太杀鸡用牛刀,意思一下就行了。所以一个 feature switch 其实就是 Postgres 里的一个表格里的一行。湾区日报99.999%的workload是 read-only 的,所以网站上很多页面其实都是缓存在内存然后走CDN的,数据库访问不会太 crazy。

顺便提一下,有一些年轻的读者(学生或者刚工作不久的年轻人)发邮件过来逼我开源湾区日报的代码,让我有点哭笑不得。联想到一有什么自然灾害,名人们就要被逼着捐款。详见 FAQ 第18条

开发环境

我用家里的 iMac 写代码。Mac OS X 下运行虚拟机 Vagrant + VirtualBox。虚拟机里跑的是 Ubuntu,与 production 里用的操作系统一样。然后通过 Vagrant 的 synced folders 在 Mac OS X 与虚拟机之间共享代码的文件夹。在 Mac OS X 上用 PyCharm 写代码,利用 PyCharm 里的 Vagrant 的支持,在虚拟机里跑服务器。

数据备份

有一个每天自动执行一次的 job 把所有数据 dump 出来,压缩一下,按日期命名,最后上传到某个地方。上传到哪里呢?任何提供API的云存储服务都行(Dropbox、Box之类的)。

对于 PostgreSQL 里的数据,我用 Django 的 dumpdata 命令把所有数据 dump 成一个 json file,然后 gzip 一下。

对于 Redis 里的数据,直接 gzip 一下 disk 上的 dump.rdb

详情见这篇博文:湾区日报是如何备份数据库的?

总结

如果把这篇文章给2014年8月6日的我看,我肯定不会做湾区日报这个 side project 了,太花时间了 -- 竟然要做网站,要做发布系统,要学 Swift 然后写 iOS app,还要每周发布 app 新版本,还要管理好几个发布渠道,还要做客服回邮件,还要每天花1到3个钟头读文章写简评。

幸亏写这篇文章的时候,大部分困难的工作已经完成了。这就是互联网时代的产品迭代,是一个循序渐进的过程,是个人与产品共同成长的过程。你不能期望一夜成功 -- 其实,你也可以一夜成功,只是这一夜发生在第1000天甚至第3600天。

运营湾区日报是没什么经济上的回报的,尽管有一些广告收入与app内购的收入,但与投入的时间(再乘以一个哪怕是实习生的时薪)相比,相当微不足道。之所以我还能继续做下去,是看中知识的积累与个人的成长。这些运营经验以及从每天5篇文章里学到的东西,是完全可以运用到我其他的项目上的。就算最后真的什么都没做成,也是一段美好的回忆。临死的时候,回顾一生,至少我还能说,我做过一个叫湾区日报的博客,每天有那么几万个读者(我也是读者之一),我们每天都在进步。这就够了。

from:

http://www.wanqu.co/blog?s=top

-end-

好烂啊有点差凑合看看还不错很精彩 (No Ratings Yet)
Loading...
451 views
技术链接

技术链接

好烂啊有点差凑合看看还不错很精彩 (No Ratings Yet)
Loading...
316 views
What is the difference between Linux and GNU/Linux?

What is the difference between Linux and GNU/Linux?

What Is Linux?

Linux is an operating system used to power pretty much any device you can think of.

When most people think of Linux they think of a desktop operating system used by geeks and techies or a server based operating system used to power web sites.

Linux is everywhere. It is the engine behind most smart devices. The Android phone that you are using runs a Linux kernel, that smart fridge that can restock itself runs Linux.

There are smart lightbulbs that can talk to each other all with the help of Linux. Evenrifles used by the army run Linux.

A modern buzz term is “the internet of things”. The truth is that there really is only one operating system that powers the internet of things and that is Linux.

From a business point of view Linux is also used on large supercomputers and it is used to run the New York Stock Exchange.

Check out this list of Linux adopters

Linux can also of course be used as the desktop operating system on your netbook, laptop or desktop computer.

What Is An Operating System?

The operating system is special software used to interact with the hardware within a computer.

If you consider a standard laptop the hardware devices that the operating system has to manage includes the CPU, the memory, the graphics processing unit, a hard drive, a keyboard, mouse, screen, USB ports, wireless network card, ethernet card, battery, backlight for a screen and USB ports.

In addition to the internal hardware the operating system also needs to be able to interact with external devices such as printers, scanners, joypads and a wide array of USB powered devices.

The operating system has to manage all the software on the computer, making sure each application has enough memory to perform, switching processes between being active and inactive.

The operating system has to accept input from the keyboard and act upon the input to perform the wishes of the user.

Examples of operating systems include Microsoft Windows, Unix, Linux, BSD andOSX.

What Is GNU/Linux?

A term you might hear every now and then is GNU/Linux. What is GNU/Linux and how does it differ from normal Linux?

From a desktop Linux user point of view there is no difference.

Linux is the main engine that interacts with your computer’s hardware. It is commonly known as the Linux kernel.

The GNU tools provide a method of interacting with the Linux kernel.

What Are the GNU Tools?

Before providing a list of tools lets look at the sort of tools you will need to be able to interact with the Linux kernel.

First of all at the very basic level before even considering the concept of a desktop environment you will need a terminal and the terminal must accept commands which the Linux operating system will use to perform tasks.

The common shell used to interact with Linux in a terminal is a GNU tool called BASH. To get BASH onto the computer in the first place it needs to be compiled so you also need a compiler and an assembler which are also GNU tools.

In fact GNU is responsible for a whole chain of tools which make it possible to develop programs and applications for Linux.

One of the most popular desktop environments is called GNOME which stands for GNU Network Object Model Environment. Snappy isn’t it.

The most popular graphics editor is called GIMP which stands for GNU Image Manipulation Program.

The people behind the GNU project sometimes get annoyed that Linux gets all the credit when it is their tools that power it.

My view is that everyone knows who makes the engine in a Ferrari, nobody really knows who makes the leather seats, the audio player, the pedals, the door trims and every other part of the car but they are all as equally important.

What Are The Layers That Make Up A Standard Linux Desktop?

The lowest component within a computer is the hardware.

On top of the hardware sits the Linux kernel.

The Linux kernel itself has multiple levels.

At the bottom sit the device drivers and security modules used to interact with the hardware.

On the next level you have process schedulers and memory management used for managing the programs that run on the system.

Finally at the top there are a series of system calls which provide methods for interacting with the Linux kernel.

Above the Linux kernel are a series of libraries which programs can use to interact with the Linux system calls.

Just below the surface are the various low level components such as the windowing system, logging systems and networking.

Finally you get to the top and that is where the desktop environment and desktop applications sit.

What Is A Desktop Environment?

A desktop environment are a series of graphical tools and applications which make it easier for you to interact with your computer and basically get stuff done.

A desktop environment in its simplest form can just include a window manager and a panel. There are many levels of sophistication between the simplest and fully featured desktop environments.

For instance the lightweight LXDE desktop environment includes a file manager, session editor, panels, launchers, a window manager, image viewer, text editor, terminal, archiving tool, network manager and music player.

The GNOME desktop environment includes all of that plus an office suite, web browser, GNOME boxes, email client and many more applications.

from https://www.lifewire.com/what-is-linux-2201940

-end-

好烂啊有点差凑合看看还不错很精彩 (No Ratings Yet)
Loading...
279 views
How To Convert Images Using Linux

How To Convert Images Using Linux

Introduction

This guide will show you how to manipulate images using the Linux command line.

You will find out how to resize an image both in terms of file size and in scale. You will also learn how to convert between multiple file types such as from JPG to PNG or GIF to TIF.

The Convert Command

The convert command is used to convert an image. The format is as follows:

convert [input options] input file [output options] output file.

How To Resize An Image

If you are going to include an image on a webpage and you want it to be a particular size then you could use some CSS to resize the image.

It is actually better though to upload the image as the correct size in the first place and insert it into the page.

This is of course just one example why you might want to resize an image.

To resize an image use the following command

convert imagename.jpg -resize dimensions newimagename.jpg

For example to convert an image to be 800×600 you would use the following command:

convert imagename.jpg -resize 800x600 newimagename.jpg

If by converting to the specified dimensions theaspect ratio will be messed up the image will be resize to the closest ratio.

To force the conversion to be the exact size use the following command:

convert imagename.jpg -resize 800x600! newimagename.jpg

You don’t have to specify the height and the width as part of the resize command. For example if you want the width to be 800 and you don’t care about the height use the following command:

convert imagename.jpg -resize 800 newimagename.jpg

To resize an image to be a specified height use the following command:

convert imagename,jpg -resize x600 newimagename.jpg

How To Convert From One Image Format To Another

If you have a JPG file and you wish to convert it to a PNG then you would use the following command:

convert image.jpg image.png

You can combine many different file formats. For example

convert image.png image.gif

convert image.jpg image.bmp

convert image.gif image.tif

How To Adjust The File Size For An Image

There are a number of ways to change the physical file size of an image.

  1. Change the aspect ratio (make it smaller)
  2. Change the file format
  3. Change the compression quality

Reducing the size of the image will make the file size smaller. In addition using a file format that includes compression such as JPG will enable you to reduce the physical file size.

Finally adjusting the quality will make the physical file size smaller.

The previous 2 sections showed you how to adjust the size and file type. To compress the imagetry the following command:

convert imagename.jpg -quality 90 newimage.jpg

The quality is specified as a percentage. The lower the percentage the smaller the output file but obviously the final output quality is not as good.

How To Rotate Images

If you have taken a photo in portrait but you want it to be a landscape image you can rotate the image using the following command:

convert imagename.jpg -rotate 90 newimage.jpg

You can specify any angle for rotation.

For example try this out

convert imagename.jpg -rotate 45 newimage.jpg

Convert Command Line Options

There are dozens of command line options that can be used with the convert command as shown here:

Options are processed in command line order. Any option you specify on the command line remains in effect for the set of images that follows, until the set is terminated by the appearance of any option or -noop. Some options only affect the decoding of images and others only the encoding. The latter can appear after the final group of input images.

For a more detailed description of each option, see Imagemagick.

-adjoin

join images into a single multi-image file

-affine

drawing transform matrix

-antialias

remove pixel aliasing

-append

append a set of images

-average

average a set of images

-background

the background color

-blur x

blur the image with a gaussian operator

-border x

surround the image with a border of color

-bordercolor

the border color

-box

set the color of the annotation bounding box

-cache

megabytes of memory available to the pixel cache

-channel

the type of channel

-charcoal

simulate a charcoal drawing

-chop x{+-}{+-}{%}

remove pixels from the interior of an image

-clip

apply the clipping path, if one is present

-coalesce

merge a sequence of images

-colorize

colorize the image with the pen color

-colors

preferred number of colors in the image

-colorspace

the type of colorspace

-comment

annotate an image with a comment

-compose

the type of image composition

-compress

the type of image compression

-contrast

enhance or reduce the image contrast

-crop x{+-}{+-}{%}

preferred size and location of the cropped image

-cycle

displace image colormap by amount

-debug

enable debug printout

-deconstruct

break down an image sequence into constituent parts

-delay 

display the next image after pausing

-density x

vertical and horizontal resolution in pixels of the image

-depth

depth of the image

-despeckle

reduce the speckles within an image

-display

specifies the X server to contact

-dispose

GIF disposal method

-dither

apply Floyd/Steinberg error diffusion to the image

-draw

annotate an image with one or more graphic primitives

-edge

detect edges within an image

-emboss

emboss an image

-encoding

specify the font encoding

-endian

specify endianness (MSB or LSB) of output image

-enhance

apply a digital filter to enhance a noisy image

-equalize

perform histogram equalization to the image

-fill

color to use when filling a graphic primitive

-filter

use this type of filter when resizing an image

-flatten

flatten a sequence of images

-flip

create a “mirror image”

-flop

create a “mirror image”

-font

use this font when annotating the image with text

-frame x++

surround the image with an ornamental border

-fuzz {%}

colors within this distance are considered equal

-gamma

level of gamma correction

-gaussian x

blur the image with a gaussian operator

-geometry x{+-}{+-}{%}{@} {!}{}

preferred size and location of the Image window.

-gravity

direction primitive gravitates to when annotating the image.

-help

print usage instructions

-implode

implode image pixels about the center

-intent

use this type of rendering intent when managing the image color

-interlace

the type of interlacing scheme

-label

assign a label to an image

-level

adjust the level of image contrast

-list

the type of list

-loop

add Netscape loop extension to your GIF animation

-map

choose a particular set of colors from this image

-mask

Specify a clipping mask

-matte

store matte channel if the image has one

-median

apply a median filter to the image

-modulate

vary the brightness, saturation, and hue of an image

-monochrome

transform the image to black and white

-morph

morphs an image sequence

-mosaic

create a mosaic from an image sequence

-negate

replace every pixel with its complementary color

-noise

add or reduce noise in an image

-noop

NOOP (no option)

-normalize

transform image to span the full range of color values

-opaque

change this color to the pen color within the image

-page x{+-}{+-}{%}{!}{}

size and location of an image canvas

-paint

simulate an oil painting

-pen

specify the pen color for drawing operations

-ping

efficiently determine image characteristics

-pointsize

pointsize of the Postscript, OPTION1, or TrueType font

-preview

image preview type

-process

process a sequence of images

-profile

add ICM, IPTC, or generic profile to image

-quality

JPEG/MIFF/PNG compression level

-raise x

lighten or darken image edges

-region x{+-}{+-}

apply options to a portion of the image

-resize x{%}{@}{!}{}

resize an image

-roll {+-}{+-}

roll an image vertically or horizontally

-rotate {}

apply Paeth image rotation to the image

-sample

scale image with pixel sampling

-sampling_factor x

sampling factors used by JPEG or MPEG-2 encoder and YUV decoder/encoder.

-scale

scale the image.

-scene

set scene number

-seed

pseudo-random number generator seed value

-segment x

segment an image

-shade x

shade the image using a distant light source

-sharpen x

sharpen the image

-shave x

shave pixels from the image edges

-shear x

shear the image along the X or Y axis

-size x{+offset}

width and height of the image

-solarize

negate all pixels above the threshold level

-spread

displace image pixels by a random amount

-stroke

color to use when stroking a graphic primitive

-strokewidth

set the stroke width

-swirl

swirl image pixels about the center

-texture

name of texture to tile onto the image background

-threshold

threshold the image

-tile

tile image when filling a graphic primitive

-transform

transform the image

-transparent

make this color transparent within the image

-treedepth

tree depth for the color reduction algorithm

-trim

trim an image

-type

the image type

-units

the type of image resolution

-unsharp x

sharpen the image with an unsharp mask operator

-use_pixmap

use the pixmap

-verbose

print detailed information about the image

-view

FlashPix viewing parameters

-wave x

alter an image along a sine wave

-write

write an image sequence [convert, composite]

Summary

For more information read the manual page for the convert command:

man convert

from: http://linux.about.com/od/linux101/fl/convert-Linux-Command-Unix-Command.htm

-end-

跳至工具栏