标签归档:Linux

Linux中DD命令详解

Linux中DD命令详解 
1.dd命令简介 

       功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换。可以用该命令实现DOS下的diskcopy命令的作用。先用dd命令把软盘上的数据写成硬盘的一个寄存文件,再把这个寄存文件写入第二张软盘上,完成diskcopy的功能。需要注意的是,应该将硬盘上的寄存文件用rm命令删除掉。系统默认使用标准输入文件和标准输出文件。  

语法:dd [选项]  

if =输入文件(或设备名称)。  
of =输出文件(或设备名称)。  
ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。  
skip = blocks 跳过读入缓冲区开头的ibs*blocks块。  
obs = bytes 一次写入bytes字节,即写入缓冲区的字节数。  
bs = bytes 同时设置读/写缓冲区的字节数(等于设置ibs和obs)。  
cbs = byte 一次转换bytes字节。  
count=blocks 只拷贝输入的blocks块。  
conv = ASCII 把EBCDIC码转换为ASCIl码。  
conv = ebcdic 把ASCIl码转换为EBCDIC码。  
conv = ibm 把ASCIl码转换为alternate EBCDIC码。  
conv = block 把变动位转换成固定字符。  
conv = ublock 把固定位转换成变动位。  
conv = ucase 把字母由小写转换为大写。 
conv = lcase 把字母由大写转换为小写。  
conv = notrunc 不截短输出文件。  
conv = swab 交换每一对输入字节。  
conv = noerror 出错时不停止处理。  
conv = sync 把每个输入记录的大小都调到ibs的大小(用NUL填充)。  
2.实例分析
2.1.数据备份与恢复
2.1.1整盘数据备份与恢复
备份:
dd if=/dev/hdx of=/dev/hdy
将本地的/dev/hdx整盘备份到/dev/hdy

dd if=/dev/hdx of=/path/to/image
将/dev/hdx全盘数据备份到指定路径的image文件

dd if=/dev/hdx | gzip >/path/to/image.gz
备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径

恢复:
dd if=/path/to/image of=/dev/hdx
将备份文件恢复到指定盘

gzip -dc /path/to/image.gz | dd of=/dev/hdx
将压缩的备份文件恢复到指定盘

2.1.2.利用netcat远程备份

dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234
在源主机上执行此命令备份/dev/hda

netcat -l -p 1234 | dd of=/dev/hdc bs=16065b
在目的主机上执行此命令来接收数据并写入/dev/hdc

netcat -l -p 1234 | bzip2 > partition.img
                netcat -l -p 1234 | gzip > partition.img
以上两条指令是目的主机指令的变化分别采用bzip2 gzip对数据进行压缩,并将备份文件保存在当前目录。

2.1.3.备份MBR
备份:

dd if=/dev/hdx of=/path/to/image count=1 bs=512
备份磁盘开始的512Byte大小的MBR信息到指定文件
              
恢复:

dd if=/path/to/image of=/dev/hdx
将备份的MBR信息写到磁盘开始部分

2.1.4.备份软盘

dd if=/dev/fd0 of=disk.img count=1 bs=1440k
将软驱数据备份到当前目录的disk.img文件

2.1.5.拷贝内存资料到硬盘

dd if=/dev/mem of=/root/mem.bin bs=1024
将内存里的数据拷贝到root目录下的mem.bin文件

2.1.6.从光盘拷贝iso镜像

dd if=/dev/cdrom of=/root/cd.iso
拷贝光盘数据到root文件夹下,并保存为cd.iso文件     

2.2.增加Swap分区文件大小

dd if=/dev/zero of=/swapfile bs=1024 count=262144
创建一个足够大的文件(此处为256M)

mkswap /swapfile
把这个文件变成swap文件

swapon /swapfile
启用这个swap文件

/swapfile swap swap defaults 0 0
在每次开机的时候自动加载swap文件, 需要在 /etc/fstab 文件中增加一行

2.3.销毁磁盘数据

dd if=/dev/urandom of=/dev/hda1
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/hda1将无法挂载,创建和拷贝操作无法执行。

2.4磁盘管理

2.4.1.得到最恰当的block size

dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
                dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
                dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file      
                dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小

2.4.2测试硬盘读写速度

dd if=/root/1Gb.file bs=64k | dd of=/dev/null
                dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度     

2.4.3.修复硬盘

dd if=/dev/sda of=/dev/sda
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生magnetic flux point。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。

2.4.4.软盘拷贝

要把一张软盘的内容拷贝到另一张软盘上,利用/tmp作为临时存储区。把源盘插入驱动器中,输入下述命令:  

$ dd if =/dev/fd0 of = /tmp/tmpfile  

拷贝完成后,将源盘从驱动器中取出,把目标盘插入,输入命令:  

$ dd if = /tmp/tmpfile of =/dev/fd0  

软盘拷贝完成后,应该将临时文件删除:  

$ rm /tmp/tmpfile  

2.4.5.把net.i这个文件写入软盘中,并设定读/写缓冲区的数目。  

(注意:软盘中的内容会被完全覆盖掉)  

$ dd if = net.i of = /dev/fd0 bs = 16384  

2.4.6.将文件sfile拷贝到文件 dfile中。  

$ dd if=sfile of=dfile

使用BusyBox做一个小巧的Linux操作系统

1.基础知识
一个操作系统可以简单的抽象为,引导程序 内核 文件系统。
 
vmlinuz是Linux 内核的镜像文件,可以被引导程序加载,从而启动Linux系统。
 
initrd的全称是boot loader initialized RAM disk,它是系统启动时所使用的根文件系统映像文件,这个文件系统中包含几个驱动模块,用来装载实际的根文件系统,比如一个IDE或SCSI硬盘的驱动模块,内核装入这个模块之后用它来驱动硬盘,挂接硬盘到ramdisk的某个子目录,然后再用其中的pivot_root命令,将硬盘文件系统变成根文件系统,并开始执行init进程,此时init ram disk被umount,寿终正寝。
 
由此可见,我们可以用vmlinuz initrd.img做一个文件系同长驻内存的迷你Linux。
 
现在进入正题了:
 
2.编译内核
cd /usr/src/....----进入内核源代码目录,没有的话去官方网站,随便下
make menuconfig-----配置编译选项请注意一定加入RAM disk support 和initial RAM disk
(initrd) support 的支持(在block device中)。另外最好将ext3文件系统编入内核,不要编成模块。配置完毕后保存为.config(默认)
make bzImage----编译
 
在许多内核编译参考中还有
make modules
make modules_install两步
但我们这里没有加入对modules的支持,所以不需要。生成的bzImage文件在usr/src/linux/arch/.../boot中,省略的根据你的机器架构决定,make过程中会有提示,比如我的是x86_64. 注意这个文件非常重要,其实就是我们最终的vmlinuz.
 
3.busybox
busybox是一个集成了一百多个最常用linux命令和工具的软件,它甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分力式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用,另外,大多数linux发行版的安装程序中都有busybox的身影,安装linux的时候案ctrl alt F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接.在我们的迷你Linux中,需要的也正是busybox的命令和工具。
 
下载 http://busybox.net/downloads/
使用过程中许多高版本都出现编译错误,所以用了一个最原始的版本busybox-1.00
#cp busybox-1.00.tar.gz /tmp/bunny
#cd /tmp/bunny
#tar xvfz busybox-1.00.tar.gz
#cd busybox-1.00
#make menuconfig ----编译配置
 
下面是需要编译进busybox的功能选项,其他的可以根据需要自选.
General Configuration应该选的选项
Show verbose applet usage messages
Runtime SUID/SGID configuration via /etc/busybox.conf
Build Options
Build BusyBox as a static binary (no shared libs)
 
这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作.
 
Installation Options
Don't use /usr
 
这个选项也一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向它的链接.
 
其他选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了.
配置好后退出并保存.config.
make
make install
编译好后在busybox目录下生成子目录_install,里面的内容:
bin
linuxrc -> bin/busybox
sbin
其中可执行文件busybox在bin目录下,其他的都是指向他的符号链接.
 
4.制作自己的root fs
1)目录结构
mkdir /tmp/myOS/rootfs
cd /tmp/myOS/rootfs
mkdir etc usr var tmp proc home root dev
其中etc,proc和dev是一定要建的,bin和sbin不用建,因为busybox中已经有了.
其他的可以象征性的建几个就可以了.
拷贝busybox
#cp -R /tmp/bunny/busybox-1.00/_install/* /tmp/myOS/rootfs/
 
2)设备文件
我是直接从FC系统/dev目录里cp的,方法如下:
#cp -R /dev/console /tmp/myOS/rootfs/dev/
#cp -R /dev/null /tmp/myOS/rootfs/dev/
#cp -R /dev/zero /tmp/myOS/rootfs/dev/
你认为需要的都cp过来
有的参考文献说fd0,hda,ram,ram1,tty1,loop1,fb0,fb,tty等是必备的,但是好像有些文件并没有
 
3)建立etc目录下的配置文件
我是直接拷贝busybox自带的例子
cp -R tmp/bunny/busybox-1.00/examples/bootfloppy/etc/* /tmp/myOS/rootfs/etc
 
4)制作initrd.img映象文件
cd /tmp/myOS/
dd if=/dev/zero of=/tmp/disk bs=1M count=32 ------初始化32M内存空间
mkfs.ext3 -m0 /tmp/disk ------格式化为ext3
mkdir /mnt/ram
mount -o loop /tmp/disk /mnt/ram ------挂载到/mnt/ram
cp -R rootfs/* /mnt/ram ------把rootfs写入内存
umount /mnt/ram
dd if=/tmp/disk of=/tmp/myOS/initrd.img ------把内存中的内容以映象方式取出
ok,这个initrd.img就是我们的rootfs
有的文献使用ram0,也就是将上述过程的/tmp/disk改为/dev/ram0,虽然制作过程没有问题,但是它存在大小限制
 
5.整合,启动
1)kernel
cp /usr/src/linux/arch/x86_64/bzImage /boot/vmlinuz
2)rootfs 一般命名为initrd.img
cp /tmp/myOS/initrd.img /boot
3)有了上述两个文件,已经可以通过网络dhcp, tftp服务器启动,tftp服务器中添加启动脚本如下
DEFAULT linux
PROMPT 0
LABEL linux
KERNEL vmlinuz
append initrd=initrd.img devfs=nomount ramdisk_size=52000
 

问题:理论上这个小Linux也应该可以从grub引导。

apt-get使用介绍

什么是apt-get
apt-get是一条linux命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。是debian,ubuntu发行版的包管理工具,与红帽中的yum工具非常类似。
apt-get命令一般需要root权限执行,所以一般跟着sudo命令

sudo apt-get xxxx

apt命令用法
packagename指代为软件包的名称

apt-get update
在修改/etc/apt/sources.list或/etc/apt/preferences之後运行该命令。此外您需要定期运行这一命令以确保您的软件包列表是最新的。
apt-get install packagename
安装一个新软件包(参见下文的aptitude)
apt-get remove packagename
卸载一个已安装的软件包(保留配置文档)
卸载一个已安装的软件包(删除配置文档)
apt-get autoremove packagename
同上,比上面的要删除的彻底一点
dpkg --force-all --purge packagename
有些软件很难卸载,而且还阻止了别的软件的应用,就能够用这个,但是有点冒险。
apt-get autoclean
apt会把已装或已卸的软件都备份在硬盘上,所以假如需要空间的话,能够让这个命令来删除您已删掉的软件
apt-get clean
这个命令会把安装的软件的备份也删除,但是这样不会影响软件的使用。
apt-get upgrade
可以使用这条命令更新软件包,apt-get upgrade不仅可以从相同版本号的发布版中更新软件包,也可以从新版本号的发布版中更新软件包,尽管实现后一种更新的推荐命令为apt-get dist-upgrade;
在运行apt-get upgrade命令时加上-u选项很有用(即:apt-get -u upgrade)。这个选项让APT显示完整的可更新软件包列表。不加这个选项,你就只能盲目地更新。APT会下载每个软件包的最新更新版本,然后以合理的次序安装它们。注意在运行该命令前应先运行 apt-get update更新数据库。更新任何已安装的软件包。[1]
apt-get dist-upgrade
将系统升级到新版本
apt-cache search string
在软件包列表中搜索字符串
dpkg -l package-name-pattern列出任何和模式相匹配的软件包。假如您不知道软件包的全名,您能够使用“*package-name-pattern*”。
aptitude
周详查看已安装或可用的软件包。和apt-get类似,aptitude能够通过命令行方式调用,但仅限于某些命令——最常见的有安装和卸载命令。
由于aptitude比apt-get了解更多信息,能够说他更适合用来进行安装和卸载。
apt-cache showpkg pkgs
显示软件包信息。
apt-cache dumpavail打印可用软件包列表。
apt-cache show pkgs
显示软件包记录,类似于dpkg –print-avail。
apt-cache pkgnames
打印软件包列表中任何软件包的名称。
dpkg -S file
这个文档属于哪个已安装软件包。
dpkg -L package
列出软件包中的任何文档。
dpkg -l
列出所有已安装的软件包
apt-file search filename
查找包含特定文档的软件包(不一定是已安装的),这些文档的文档名中含有指定的字符串。apt-file是个单独的软件包。您必须先使用apt-get install来安装他,然後运行apt-file update。假如apt-file search filename输出的内容太多,您能够尝试使用apt-file search filename | grep -w filename(只显示指定字符串作为完整的单词出现在其中的那些文档名)或类似方法,例如:apt-file search filename | grep /bin/(只显示位于诸如/bin或/usr/bin这些文档夹中的文档,假如您要查找的是某个特定的执行文档的话,这样做是有帮助的)
apt-get autoclean
定期运行这个命令来清除那些已卸载的软件包的.deb文档。通过这种方式,您能够释放大量的磁盘空间。假如您的需求十分迫切,能够使用apt-get clean以释放更多空间。这个命令会将已安装软件包裹的.deb文档一并删除。大多数情况下您不会再用到这些.debs文档,因此假如您为磁盘空间不足而感到焦头烂额,这个办法也许值得一试。

Ubuntu下编译Linux内核

1.俗话说,工欲善其事,必先利其器。在编译内核前,需要配置一下编译环境,在终端输入:

sudo apt-get install build-essential kernel-package libncurses5-dev 

其中,build-essential 是安装gcc编译器和make环境。

kernel-package是内核编译有关的。

libncurses5-dev是为了能配置内核,与 make menuconfig 命令有关。

2.下载源代码:去内核源码网  http://www.kernel.org/ 下载自己想编译的内核源代码,我下载的是最新的,linux-3.3.4.tar.bz2,尝尝鲜啊!

3.将其拷贝到主文件夹下面,接着  ctrl+alt+t 打开终端,执行以下命令:

mkdir src && tar -jxf linux-3.3.4.tar.bz2 -C src/

意思就是在主文件夹下新建一个名为src的文件夹,并将源代码解压到src文件夹内。

4.为了进入到src/linux-3.3.4 目录,执行以下命令:cd  /src/linux-3.3.4  

这样一来,我们的工作目录就变成src/linux-3.3.4了,以后所有的命令都是在这个目录下执行的。

5.配置内核文件比较繁琐,一般我们都会利用系统已经存在的内核配置文件,执行以下命令:

cp /boot/config-uname -r ./.config 

由于这个文件是隐藏的,所以当你执行完这条语句,去查看这个文件的时候,是看不到的,但它确实存在,而且还很重要。

注:如果你不是第一次编译,建议你首先执行这样一条语句: make mrproper 

其含义是将上一次编译的.o和.config等相关文件删除掉。然后在copy已存在的config文件。这个顺序不能颠倒。如果颠倒了,新copy的config文件就会被删除掉喔。

6. 配置内核。如果对内核的配置不熟,建议执行第5步,如果很熟系,第五步可以忽略。

执行一下命令:make menuconfig

此时,会弹出如下的界面:

最后两项是 Load an Alternate Configuration File 和 Save an Alternate Configuration File 

我们进入Load an Alternate Configuration File,会出现这样的画面:

保持默认直接ok就行,这样就利用了刚才复制过的config文件。保存退出就行了。

7.开始编译内核:

make bzImage         //编译大内核,如果你想编译小内核,可以这样 make zImage

make modules         //编译模块

make install modules_install   //将内核与模块相关的文件复制到系统位置

注意:这个过程要花费1-2个小时。

8.在linux-2.6版本及以后,系统会为我们自动生成image文件,所以我们只需要查看是否生成了相应的模块就行了。

进入boot文件夹,看到系统已经有了config-3.3.4 ,initrd.img-3.3.4, System.map-3.3.4,vmlinuz-3.3.4  ,这说明内核已经生成完毕。如图所示:

9.还有一项,看看引导程序是否为我们添加了引导项。执行以下命令:sudo gedit /boot/grub/grub.cfg  

如图,系统自动为我们添加了引导项,如果没有,需要自己仿照已存在的项添加。这里就不多说了。

10. reboot 重启之后就可已选择进入相应的内核了。注意:原来系统的内核仍然存在,依然可用。

Ubuntu安装BusyBox致命错误curses.h没有那个文件或目录

问题:
 root@czu:~# cd /root/桌面/busybox-1.19.3
root@czu:~/桌面/busybox-1.19.3# make menuconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/split-include
scripts/basic/split-include.c: 在函数‘main’中:
scripts/basic/split-include.c:134:11: 警告: 忽略声明有 warn_unused_result 属性的‘fgets’的返回值 [-Wunused-result]
  HOSTCC  scripts/basic/docproc
  GEN     include/applets.h
  GEN     include/usage.h
  GEN     applets/Kbuild
  GEN     coreutils/Kbuild
  GEN     coreutils/Config.in
  GEN     coreutils/libcoreutils/Kbuild
  GEN     procps/Kbuild
  GEN     procps/Config.in
  GEN     mailutils/Kbuild
  GEN     mailutils/Config.in
  GEN     e2fsprogs/Kbuild
  GEN     e2fsprogs/Config.in
  GEN     e2fsprogs/old_e2fsprogs/Kbuild
  GEN     e2fsprogs/old_e2fsprogs/Config.in
  GEN     e2fsprogs/old_e2fsprogs/uuid/Kbuild
  GEN     e2fsprogs/old_e2fsprogs/blkid/Kbuild
  GEN     e2fsprogs/old_e2fsprogs/e2p/Kbuild
  GEN     e2fsprogs/old_e2fsprogs/ext2fs/Kbuild
  GEN     libbb/Kbuild
  GEN     libbb/Config.in
  GEN     printutils/Kbuild
  GEN     printutils/Config.in
  GEN     libpwdgrp/Kbuild
  GEN     debianutils/Kbuild
  GEN     debianutils/Config.in
  GEN     shell/Kbuild
  GEN     shell/Config.in
  GEN     loginutils/Kbuild
  GEN     loginutils/Config.in
  GEN     sysklogd/Kbuild
  GEN     sysklogd/Config.in
  GEN     console-tools/Kbuild
  GEN     console-tools/Config.in
  GEN     init/Kbuild
  GEN     init/Config.in
  GEN     scripts/Kbuild
  GEN     runit/Kbuild
  GEN     runit/Config.in
  GEN     miscutils/Kbuild
  GEN     miscutils/Config.in
  GEN     archival/Kbuild
  GEN     archival/Config.in
  GEN     archival/libarchive/Kbuild
  GEN     modutils/Kbuild
  GEN     modutils/Config.in
  GEN     selinux/Kbuild
  GEN     selinux/Config.in
  GEN     util-linux/Kbuild
  GEN     util-linux/Config.in
  GEN     util-linux/volume_id/Kbuild
  GEN     editors/Kbuild
  GEN     editors/Config.in
  GEN     findutils/Kbuild
  GEN     findutils/Config.in
  GEN     networking/Kbuild
  GEN     networking/Config.in
  GEN     networking/libiproute/Kbuild
  GEN     networking/udhcp/Kbuild
  GEN     networking/udhcp/Config.in
  HOSTCC  scripts/kconfig/conf.o
scripts/kconfig/conf.c: 在函数‘conf_choice’中:
scripts/kconfig/conf.c:354:9: 警告: 忽略声明有 warn_unused_result 属性的‘fgets’的返回值 [-Wunused-result]
scripts/kconfig/conf.c: 在函数‘conf_askvalue’中:
scripts/kconfig/conf.c:106:8: 警告: 忽略声明有 warn_unused_result 属性的‘fgets’的返回值 [-Wunused-result]
  HOSTCC  scripts/kconfig/kxgettext.o
  HOSTCC  scripts/kconfig/mconf.o
scripts/kconfig/mconf.c: 在函数‘show_textbox’中:
scripts/kconfig/mconf.c:839:7: 警告: 忽略声明有 warn_unused_result 属性的‘write’的返回值 [-Wunused-result]
scripts/kconfig/mconf.c: 在函数‘exec_conf’中:
scripts/kconfig/mconf.c:473:6: 警告: 忽略声明有 warn_unused_result 属性的‘pipe’的返回值 [-Wunused-result]
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/lex.zconf.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/mconf
  HOSTCC  scripts/kconfig/lxdialog/checklist.o
In file included from scripts/kconfig/lxdialog/checklist.c:24:0:
scripts/kconfig/lxdialog/dialog.h:31:20: 致命错误: curses.h:没有那个文件或目录
编译中断。
make[2]: *** [scripts/kconfig/lxdialog/checklist.o] 错误 1
make[1]: *** [menuconfig] 错误 2
make: *** [menuconfig] 错误 2
root@czu:~/桌面/busybox-1.19.3#
解决办法:
root@czu:~/桌面/busybox-1.19.3# apt-get install libncurses5-dev
原因:
Ubuntu系统中缺少一个套件 ncurses devel ,把此套件安装下即可。