linuxlzo
Ⅰ openwrt中的squashfs是基于ram还是flash的文件系统
SquashFS[1]是一套基于linux内核使用的压缩只读文件系统。该文件系统能够压缩系统内的文档,inode以及目录,文件最大支持2^64字节。
SquashFS是基于GPL协议的开源软件。初始的版本使用gzip压缩,2.6.34版本Linux内核增加了支持LZMA和LZO压缩,并且在2.6.38内核版本上增加支持XZ压缩。
Ⅱ Linux怎么设置系统环境变量之export命令详解
1. Linux export命令简介
Linux export命令用于设置或显示环境变量。
在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登陆操作。
export命令用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。
一个变量创建时,它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执 行时,它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用。export命令可以用于传递一个或多个变量的值到任何后继脚本。
Linux export命令简介
2. export参数
-f 代表[变量名称]中为函数名称。
-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p 列出所有的shell赋予程序的环境变量。
一个变量创建时,它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执行时,它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用。export命令可以用于传递一个或多个变量的值到任何后继脚本。
Linux怎么设置变量环境
3. 在linux里设置环境变量的方法
一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量。例如我的mips-linux-gcc编译器在“/opt/abc/123/bin”目录下,有如下三种方法来设置环境变量:
3.1 直接用export命令,临时生效
查看是否已经设好,可用命令export查看:
检查:
输出结果:
declare -x HISTCONTROL="ignoreps"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="zcwyou"
declare -x LANG="en_US.UTF-8"
declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32: .tar=01;31: .tgz=01;31: .arc=01;31: .arj=01;31: .taz=01;31: .lha=01;31: .lz4=01;31: .lzh=01;31: .lzma=01;31: .tlz=01;31: .txz=01;31: .tzo=01;31: .t7z=01;31: .zip=01;31: .z=01;31: .Z=01;31: .dz=01;31: .gz=01;31: .lrz=01;31: .lz=01;31: .lzo=01;31: .xz=01;31: .bz2=01;31: .bz=01;31: .tbz=01;31: .tbz2=01;31: .tz=01;31: .deb=01;31: .rpm=01;31: .jar=01;31: .war=01;31: .ear=01;31: .sar=01;31: .rar=01;31: .alz=01;31: .ace=01;31: .zoo=01;31: .cpio=01;31: .7z=01;31: .rz=01;31: .cab=01;31: .jpg=01;35: .jpeg=01;35: .gif=01;35: .bmp=01;35: .pbm=01;35: .pgm=01;35: .ppm=01;35: .tga=01;35: .xbm=01;35: .xpm=01;35: .tif=01;35: .tiff=01;35: .png=01;35: .svg=01;35: .svgz=01;35: .mng=01;35: .pcx=01;35: .mov=01;35: .mpg=01;35: .mpeg=01;35: .m2v=01;35: .mkv=01;35: .webm=01;35: .ogm=01;35: .mp4=01;35: .m4v=01;35: .mp4v=01;35: .vob=01;35: .qt=01;35: .nuv=01;35: .wmv=01;35: .asf=01;35: .rm=01;35: .rmvb=01;35: .flc=01;35: .avi=01;35: .fli=01;35: .flv=01;35: .gl=01;35: .dl=01;35: .xcf=01;35: .xwd=01;35: .yuv=01;35: .cgm=01;35: .emf=01;35: .axv=01;35: .anx=01;35: .ogv=01;35: .ogx=01;35: .aac=01;36: .au=01;36: .flac=01;36: .mid=01;36: .midi=01;36: .mka=01;36: .mp3=01;36: .mpc=01;36: .ogg=01;36: .ra=01;36: .wav=01;36: .axa=01;36: .oga=01;36: .spx=01;36:*.xspf=01;36:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/abc/123/bin"
declare -x PWD="/root"
declare -x SELINUX_LEVEL_REQUESTED=""
declare -x SELINUX_ROLE_REQUESTED=""
declare -x SELINUX_USE_CURRENT_RANGE=""
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_CLIENT="113.105.164.145 6668 22"
declare -x SSH_CONNECTION="113.105.164.145 6668 113.105.164.151 22"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm"
declare -x USER="root"
declare -x XDG_RUNTIME_DIR="/run/user/0"
declare -x XDG_SESSION_ID="2185"
留意一下输出的这部分:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/abc/123/bin"
可以看到已经包括了刚刚设置的变量路径。
变量路径和环境Linux
3.2 修改profile文件,永久生效
把目录/opt/abc/123/bin在里面加入:
export PATH="
3.3 修改.bashrc文件,永久生效
在里面加入:
export PATH="PATH:/opt/abc/123/bin"¨K14K¨G3G在里面加入:exportPATH="PATH:/opt/abc/123/bin"
检查结果:
3.4 修改/etc/re.local文件,永久生效
在里面加入:
export PATH="
“/bin”、“/sbin”、“ /usr/bin”、“/usr/sbin”、“/usr/local/bin”等路径已经在系统环境变量中了,如果可执行文件在这几个标准位置,在终端命令行输入该软件可执行文件的文件名和参数(如果需要参数),回车即可。
如果不在标准位置,文件名前面需要加上完整的路径。不过每次都这样跑就太麻烦了,一个“一劳永逸”的办法是把这个路径加入环境变量。命令 export PATH:/opt/abc/123/bin"“/bin”、“/sbin”、“/usr/bin”、“/usr/sbin”、“/usr/local/bin”等路径已经在系统环境变量中了,如果可执行文件在这几个标准位置,在终端命令行输入该软件可执行文件的文件名和参数(如果需要参数),回车即可。如果不在标准位置,文件名前面需要加上完整的路径。不过每次都这样跑就太麻烦了,一个“一劳永逸”的办法是把这个路径加入环境变量。命令exportPATH="路径”(或“PATH=
PATH为环境变量名,如DVSDK;调用时用
export DVSDK)可以把这个路径加入环境变量,但是退出这个命令行就失效了。要想永久生效,需要把这行添加到环境变量文件里。有两个文件可选:“/etc/profile”和用户主目录下的“.bashprofile”,“/etc/profile”对系统里所有用户都有效,用户主目录下的“.bashprofile”只对这个用户有效。exportPATH="
PATH:路径1:路径2:…:路径n"),意思是可执行文件的路径包括原先设定的路径,也包括从“路径1”到“路径n”的所有路径。当用户输入一个一串字符并按回车后,shell会依次在这些路径里找对应的可执行文件并交给系统核心执行。那个“
”。
注意,与DOS/Window不同,UNIX类系统环境变量中路径名用冒号分隔,不是分号。另外,软件越装越多,环境变量越添越多,为了避免造成混乱,建议所有语句都添加在文件结尾,按软件的安装顺序添加。
本文已同步至博客站:
https://www.linuxrumen.com/cyml/859.html
Ⅲ 如何自己开发一套服务器管理系统
转载 表面上看,是一套基于B/S方式实现的分布式管理系统,但其实背后的架构是基于C/S完成的。你以为他是一只鞋吗?其实他是一个吹风机。作为界面化的系统,浏览器框架是不可或缺的,但更加重要的东西在Socket上面。
一、需要解决中央控制端到各节点服务器之间的通信。
这个其实牵扯到一个通信协议的问题,各语言都有自己的socket,thread的库,直接调用即可。但是这个通信协议就需要自己来完成了。既不能太简单,太简单了,明码传输,如果别人获知了这个接口,就很容易执行一些令人讨厌的操作。也不能太复杂,太复杂了等于是给自己找麻烦,所以简单的数据包编解码的工作或者用token验证的方式是需要的。通信协议起码要两种,一种是传输命令执行的协议,一种是传输文件的协议。
二、跨语言的socket通信
为什么要跨语言,主控端和代理端通信,用什么语言开发其实无所谓。但是为了给自己省事,尽可能使用服务器上已经有了的默认语言,Ambari前期采用php+puppet的方式管理集群,这不是不可以,puppet自己解决了socket通信协议和文件传输的问题,可你需要为了puppet在每台服务器上都安装ruby。我是个有点服务器和代码洁癖的人。光是为了一个puppet就装个ruby,我觉得心里特对不起服务器的资源。所以我自己写了一个python的代理端。python是不管哪个linux系统在安装的时候就都会有了。然后主控端的通信,可以用python实现,也可以用php实现,但是考虑到对于更多的使用者来说,改php可能要比改tornado简单许多,所以就没用python开发。hadoop分支版本众多,发布出去,用户要自己修改成安装适合自己的hadoop发行版,就势必要改源码,会php的明显比会python的多。php里面的model封装了所有的操作,而python只是个操作代理人的角色而已。
所以也延伸出一个问题,什么语言用来做这种分布式管理系统的代理端比较合适,我自己觉得,也就是python比较合适了,操作系统自带,原生的package功能基本够用。用java和php也可以写agent,但是你势必在各节点预先就铺设好jre或者php运行环境。这就跟为什么用python和java写mapred的人最多是一样的。没人拦着你用nodejs写mapred,也可以写,就是你得在每个节点都装v8的解释引擎,不嫌麻烦完全可以这样干。原理参看map/rece论文,不解释。perl也是操作系统原生带的,但是perl的可维护性太差了,还是算了吧。
所以这就牵扯到一个跨语言的socket问题,理论上来说,这不存在什么问题。但这是理论上的,实际开发过程中确实存在问题,比如socket长连接,通信数据包在底层的封装方式不同。我没有使用xml-rpc的原因之一就是我听说php的xmlrpc跟其他语言的xmlrpc有不同的地方,需要修改才能用,我就没有用这种办法。最早是自己定义的操作协议,这时就遇到了这些问题,所以后来直接采用了thrift方式。就基本不存在跨语言的socket通信问题了。
三、代理端执行结果的获取
无论命令还是文件是否在代理端执行成功,都需要获取到执行结果返回给中央端。所以这里也涉及一个读取节点上的stdout和stderr的问题。这个总体来说不是很难,都有现成的包。当然这个时候你需要的是阻塞执行,而不能搞异步回调。
还有个问题是,我要尽可能使用python默认就带的包,而尽量不让服务器去访问internet下载第三方的包。
还有代理端最重要的一点,就是python的版本兼容性。centos5用python 2.4,centos6用python 2.6,ubuntu基本默认都是2.7。所以一定要最大限度的保证语言的跨版本兼容性,要是每个操作系统和每一个版本我都写一个代理,我一个人就累死了。
四、浏览器端的model,view,controller
这里面你要封装好所有的通信协议,以及需要在节点上面执行的脚本。发送文件的操作和数据库操作也要在model里面完成。
如果对tcl/tk很熟,也可以写基于操作系统界面方式的管理,不用浏览器就是了。
view对我来说是最痛苦的事,都是现学的jQuery怎么用,前端的工作太可怕了。关于这方面,没有太多可描述的,html和js带给我的只有痛苦的回忆,万恶的undefined。
五、跨操作系统的安装文件封装。
要适应不同的操作系统也是个很麻烦的事情,需要用agent提前获知操作系统的发行分支,版本号。然后去找到对应的安装文件去执行。你不能保证一个分布式系统的集群中所有的节点都可以访问internet,更多的情况是这些节点都存在在一个安全的内网中。只有个别几个节点是可以访问外网的。所以,我势必要把所有的安装文件以及他们的依赖尽可能集中起来。我不确定安装操作系统的lzo,yum或者apt-get会去下什么鬼东西,甚至无论是yum还是apt-get,里面都没有hadoop-lzo的库文件。所以,最好的办法是自己编译打包rpm和deb包。直接安装就好了,别去找repo下载什么。
这就是第五步工作,把需要的依赖的东西自己编译打包成rpm和deb。
deb包很好解决,但是rpm就没那么好办了,需要学习rpm的编译文件如何编写,这块是挺麻烦的,但是这玩意用好了还是挺不错的。现在我自制的安装包里面就已经包含了自己编译的lzo和snappy两种压缩库,以及hadoop-gpl-packaging的rpm和deb。下一个发布的easyhadoop将直接支持centos5,6,suse,以及ubuntu/debian的系统上安装hadoop。已经自带了lzo和snappy以及lzop和snzip。
六、把这些所有东西,整合到一个系统里面。
关联这些所有事情间的联系,整合到一个浏览器界面里面去。写一个分布式的管理脚本不难,写一个界面也不难,但是也许是我的水平不行,这两件事结合起来让他们协同工作还是有点难度的。对我来说,写界面的工作可能更难一点。
Cloudera可能是十来个人在写Manager的东西,ambari也是放到github和apache svn上面,apache基金会的各种committer在写。easyhadoop没他们功能那么强大,一年来只有我一个人设计架构,功能,各种语言的编码,测试,发布。For the love of god, What have I done(英文部分请站在山顶仰天长啸)? T_T。从前台到后台,到hadoop和生态系统以及他们的依赖软件的单独patch、编译打包。(系统yum或者apt-get的包不如自己打的好使。)
从时间上来看,全球第一款开源的hadoop部署管理系统应该还是属于ambari,2011年8月开始写的,2012年9月底进入apache的incubator。我是大概2012年8月开始写的easyhadoop,全球第一没赶上,估计国内第一个开源的hadoop管理系统还是可以排上的。
Ⅳ Linux btrfs文件系统及管理
Linux btrfs文件系统及管理
linux文件系统,具有写时复制COW(-on-write),改善ext3文件系统单文件大小限制,并加入其他特性,如可写快照,快照的快照,内建RAID,子卷(subvloume),专注于容错,修复和易于管理,下面一起来看看什么是linux btrfs文件系统及管理关系吧!
什么是btrfs?
Btrfs(B-tree文件系统,通常念成Butter FS,Better FS或B-tree FS),linux文件系统,具有写时复制COW(-on-write),改善ext3文件系统单文件大小限制,并加入其他特性,如可写快照,快照的快照,内建RAID,子卷(subvloume),专注于容错,修复和易于管理。单文件可达16EB,最大文件数量2^64,最大卷容量16EB,等。
btrfs功能特性
1,COW:写时复制,每次写入数据时,先将数据写入到新的block,写入成功后,更改旧数据块指针到新数据块,而非更改本身。
2,多物理卷支持,btrfs内建raid,可在线增删磁盘设备,可在线扩展和缩减磁盘空间。
3,数据和元数据校验码,checksum
4,子卷,可单独挂载子卷
5,可写快照,快照的快照,单个文件快照。
6,透明压缩
7,ext3/4和btrfs无痛互转
btrfs 基本用法:
bash/shell Code复制内容到剪贴板
[root@localhost ~]# btrfs --help #查看帮助可以看到btrfs 有很多子命令,用法也很多,这里只举例常用选项。
usage: btrfs [--help] [--version] [...] []
btrfs subvolume create [-i ] [/] #创建子卷
Create a subvolume
btrfs subvolume delete [options] [...] #删除子卷
Delete subvolume(s)
btrfs subvolume list [options] [-G [+|-]value] [-C [+|-]value] [--sort=gen,ogen,rootid,path] #显示子卷列表
List subvolumes (and snapshots)
btrfs subvolume snapshot [-r] [-i ] |[/] #创建子卷快照
Create a snapshot of the subvolume
btrfs subvolume get-default #获取子卷默认的文件系统
Get the default subvolume of a filesystem
btrfs subvolume set-default #设置默认系统给子卷
Set the default subvolume of a filesystem
btrfs subvolume find-new #列出btrfs文件系统中最近修改的文件,结合find命令
List the recently modified files in a filesystem
btrfs subvolume show #显示更多的子卷信息
Show more information of the subvolume
btrfs subvolume sync [...] #子卷同步,类似mount同步模式,内存数据同步到磁盘,有待查证。
Wait until given subvolume(s) are completely removed from the filesystem.
btrfs filesystem df [options] #显示挂载的文件系统详细信息。
Show space usage information for a mount point
btrfs filesystem show [options] [|||label] #显示创建文件系统的磁盘信息。
Show the structure of a filesystem
btrfs filesystem sync #强制文件系统同步,
Force a sync on a filesystem
btrfs filesystem defragment [options] |
[|...] #碎片整理
Defragment a file or a directory
btrfs filesystem resize [devid:][+/-][kKmMgGtTpPeE]|[devid:]max #btrfs文件系统在线扩展和缩减空间
Resize a filesystem
btrfs filesystem label [|] [] #改变btrfs文件系统卷标
Get or change the label of a filesystem
btrfs filesystem usage [options] [..] #显示文件系统当前的使用信息。
Show detailed information about internal filesystem usage .
btrfs balance start [options] #改变磁盘chunk,在线改 数据和元数据 存储方式,单盘改raid,前提满足raid要求。
Balance chunks across the devices
btrfs balance pause #暂停chunk更改,数据量较大,转换时间较长时,先暂停。
Pause running balance
btrfs balance cancel #取消chunk更改,如上
Cancel running or paused balance
btrfs balance resume #中断balance的操作,如上
Resume interrupted balance
btrfs balance status [-v] #显示balance操作状态 如上
Show status of running or paused balance
btrfs device add [options] [...] #文件系统增加磁盘
Add a device to a filesystem
btrfs device delete [...] #文件系统删除磁盘
Remove a device from a filesystem
btrfs device scan [(-d|--all-devices)| [...]] #文件系统磁盘扫描
Scan devices for a btrfs filesystem
btrfs device ready #猜测是检测加入的设备有没有被挂载
Check device to see if it has all of its devices in cache for mounting
btrfs device stats [-z] | #显示文件系统的设备状态
Show current device IO stats. -z to reset stats afterwards.
btrfs device usage [options] [..] #显示文件系统内部设备详细使用信息
Show detailed information about internal allocations in devices.
btrfs文件系统管理
为分区创建btrfs文件系统
bash/shell Code复制内容到剪贴板
[root@localhost ~]# fdisk -l | grep "^Disk /dev/sd[a-z]" #准备sd{b,c,d,e}4块20G磁盘,未做任何分区。
Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sde: 21.5 GB, 21474836480 bytes, 41943040 sectors
Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectors
创建单分区btrfs并查看
bash/shell Code复制内容到剪贴板
[root@localhost ~]# mkfs.btrfs -L 'btrfs' /dev/sdb
btrfs-progs v3.19.1
See http://btrfs.wiki.kernel.org for more information.
Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
Turning ON incompat feature 'skinny-metadata': reced-size metadata extent refs
fs created label btrfs on /dev/sdb
nodesize 16384 leafsize 16384 sectorsize 4096 size 20.00GiB
[root@localhost ~]# btrfs filesystem show
Label: 'btrfs' uuid: 2a9f0d3d-f8a0-4757-9f4e-d1efa04a683a
Total devices 1 FS bytes used 112.00KiB
devid 1 size 20.00GiB used 2.04GiB path /dev/sdb
btrfs-progs v3.19.1
[root@localhost ~]# mount -o compress=lzo -L btrfs /btrfs/ 挂载时可以设定透明压缩机制。
[root@localhost ~]# btrfs filesystem df /btrfs
Data, single: total=8.00MiB, used=256.00KiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00B
Metadata, DUP: total=1.00GiB, used=112.00KiB
Metadata, single: total=8.00MiB, used=0.00B
GlobalReserve, single: total=16.00MiB, used=0.00B
再添加一块磁盘
bash/shell Code复制内容到剪贴板
[root@localhost ~]# btrfs device add /dev/sdc /btrfs #添加磁盘,删除用btrfs device delete /dev/sdc /btrfs
[root@localhost ~]# btrfs fi sh
Label: 'btrfs' uuid: 2a9f0d3d-f8a0-4757-9f4e-d1efa04a683a
Total devices 2 FS bytes used 384.00KiB
devid 1 size 20.00GiB used 2.04GiB path /dev/sdb
devid 2 size 20.00GiB used 0.00B path /dev/sdc
btrfs-progs v3.19.1
[root@localhost ~]#
在线增加或缩减空间,在线改变空间,可以让lvm坐冷板凳了。
bash/shell Code复制内容到剪贴板
[root@localhost ~]# btrfs fi resize -10G /btrfs/ #在线缩减空间
Resize '/btrfs/' of '-10G'
[root@localhost ~]# btrfs fi sh
Label: 'btrfs' uuid: 2a9f0d3d-f8a0-4757-9f4e-d1efa04a683a
Total devices 2 FS bytes used 384.00KiB
devid 1 size 10.00GiB used 2.04GiB path /dev/sdb
devid 2 size 20.00GiB used 0.00B path /dev/sdc
btrfs-progs v3.19.1
[root@localhost ~]# btrfs fi resize +7G /btrfs/ #在线增加空间
Resize '/btrfs/' of '+7G'
[root@localhost ~]# btrfs fi sh
Label: 'btrfs' uuid: 2a9f0d3d-f8a0-4757-9f4e-d1efa04a683a
Total devices 2 FS bytes used 384.00KiB
devid 1 size 17.00GiB used 2.04GiB path /dev/sdb
devid 2 size 20.00GiB used 0.00B path /dev/sdc
btrfs-progs v3.19.1
[root@localhost ~]#
在线更改数据和元数据的结构
bash/shell Code复制内容到剪贴板
[root@localhost ~]# btrfs fi df /btrfs/
Data, single: total=8.00MiB, used=256.00KiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00B
Metadata, DUP: total=1.00GiB, used=112.00KiB
Metadata, single: total=8.00MiB, used=0.00B
GlobalReserve, single: total=16.00MiB, used=0.00B
[root@localhost ~]# btrfs balance start -mconvert=raid1 /btrfs/ #-mconvert 为改变metadata元数据区的存储结构
Done, had to relocate 4 out of 5 chunks
[root@localhost ~]# btrfs fi sh
Label: 'btrfs' uuid: 2a9f0d3d-f8a0-4757-9f4e-d1efa04a683a
Total devices 2 FS bytes used 192.00KiB
devid 1 size 17.00GiB used 296.00MiB path /dev/sdb
devid 2 size 20.00GiB used 288.00MiB path /dev/sdc
btrfs-progs v3.19.1
[root@localhost ~]# btrfs fi df /btrfs/
Data, single: total=8.00MiB, used=64.00KiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=256.00MiB, used=112.00KiB #对比上改为了raid1
GlobalReserve, single: total=16.00MiB, used=0.00B
[root@localhost ~]# btrfs balance start -dconvert=raid1 /btrfs/ #-dconvert 为改变data数据区的存储结构
Done, had to relocate 1 out of 3 chunks
Ⅳ 如何交叉编译mkfs.jffs2等工具链mtd-utils
首先说明一下:
在YAFFS2源文件的utils目录下,执行make就可以生成 mkyaffs2image工具,执行
.(要制作yaffs2的目录) (目标镜像)/mkyaffs2image
acl_2.2.47.orig.tar.gz
lzo-2.03.tar.gz
mtd-utils_20080508.orig.tar.gz
zlib-1.2.3.tar.gz
mkfs.jffs2.for.arm-linux-gcc.3.4.1平台.tar.bz2
mkfs.jffs2.for.arm-linux-gcc.4.3.2平台.tar.bz2
mkfs.jffs2.for.pc平台.tar.bz2
如果只需要mkfs.jffs2工具,那么ubuntu 8.10下直接安装jffnms软件包即可,
luther@gliethttp:~$ sudo apt-get install jffnms
如果需要将jffs2移植到arm开发板上,那么就需要下载源码进行交叉编译了,这就是本文的内容.
1.下载工具软件源码包
luther@gliethttp:~$ wget http://ftp.de.debian.org/debian/pool/main/m/mtd-utils/mtd-utils_20080508.orig.tar.gz
luther@gliethttp:~$ wget http://www.zlib.net/zlib-1.2.3.tar.gz
luther@gliethttp:~$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
luther@gliethttp:~$ mkdir libs 用来存放下面生成的lib库.
2.编译zlib库
luther@gliethttp:~/zlib-1.2.3$ ./configure --prefix=~/libs --shared
对于交叉编译输入如下指令
luther@gliethttp:~/zlib-1.2.3$ CC=arm-linux-gcc ./configure --prefix=~/libs --shared
luther@gliethttp:~/zlib-1.2.3$ make -j4
luther@gliethttp:~/zlib-1.2.3$ make install
luther@gliethttp:~$ tree ~/libs
/home/ubuntu/libs
|-- include
| |-- zconf.h
| `-- zlib.h
|-- lib
| |-- libz.so -> libz.so.1.2.3
| |-- libz.so.1 -> libz.so.1.2.3
| `-- libz.so.1.2.3
`-- share
`-- man
`-- man3
`-- zlib.3
5 directories, 6 files
这就表示完成了.
3.编译lzo库
luther@gliethttp:~/lzo-2.03$ ./configure --prefix=/home/ubuntu/libs --enable-shared
对于交叉编译输入如下指令
luther@gliethttp:~/lzo-2.03$ CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/home/ubuntu/libs --enable-shared --disable-static
这个还必须要绝对路径才行.
luther@gliethttp:~/lzo-2.03$ make
luther@gliethttp:~/lzo-2.03$ make install
luther@gliethttp:~$ tree ~/libs
.
|-- include
| |-- lzo
| | |-- lzo1.h
| | |-- lzo1a.h
| | |-- lzo1b.h
| | |-- lzo1c.h
| | |-- lzo1f.h
| | |-- lzo1x.h
| | |-- lzo1y.h
| | |-- lzo1z.h
| | |-- lzo2a.h
| | |-- lzo_asm.h
| | |-- lzoconf.h
| | |-- lzodefs.h
| | `-- lzoutil.h
| |-- zconf.h
| `-- zlib.h
|-- lib
| |-- liblzo2.a
| |-- liblzo2.la
| |-- liblzo2.so -> liblzo2.so.2.0.0
| |-- liblzo2.so.2 -> liblzo2.so.2.0.0
| |-- liblzo2.so.2.0.0
| `-- libz.a
`-- share
`-- man
`-- man3
`-- zlib.3
6 directories, 22 files
手工将静态库删掉就行了,
如果是arm平台还需要strip优化.
4.编译mtd-utils-20080508前的准备工作.
编译之前的代码工作
luther@gliethttp:~$ wget http://ftp.de.debian.org/debian/pool/main/a/acl/acl_2.2.47.orig.tar.gz
luther@gliethttp:~$ mkdir libs/include/sys -p
luther@gliethttp:~$ cp acl-2.2.47/include/acl.h libs/include/sys
luther@gliethttp:~/mtd-utils-20080508$ export LD_LIBRARY_PATH=~/libs/lib:$LD_LIBRARY_PATH
如果还找不到-llzo2,那么把他拷到/usr/lib下,对于交叉编译器,就是拷贝到
比如
luther@gliethttp:~/libs/lib$ sudo cp -a * /vobs/tools/arm-tools/arm-linux-gcc-3.4.1/arm-linux/lib/
luther@gliethttp:~/mtd-utils-20080508$ vim Makefile
修改安装路径
DESTDIR=.
SBINDIR=gliethttp/sbin
MANDIR=gliethttp/share/man
INCLUDEDIR=gliethttp/include
修改CFLAGS变量
CFLAGS := -I./include -I/home/ubuntu/libs/include $(OPTFLAGS)
如果是arm-linux-gcc定义为
CFLAGS := -I./include -I/home/ubuntu/libs/include -DAI_ADDRCONFIG=0x0020 $(OPTFLAGS)
来自/usr/include/netdb.h
luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/Makefile
DESTDIR := ~/mtd-utils-20080508
SBINDIR=gliethttp/sbin
MANDIR=gliethttp/share/man
INCLUDEDIR=gliethttp/include
luther@gliethttp:~/mtd-utils-20080508$ vim recv_image.c
拷贝/usr/include/netinet/in.h文件中
arm-linux-gcc中不需要拷贝它.
struct ip_mreq
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
结构体数据到头部,否则在u盘版的ubuntu 8.10上老是提示没有ip_mreq定义,虽然上面明明写了#define _USE_MISC
arm-linux-gcc中还需要创建如3下个目录
luther@gliethttp:~/mtd-utils-20080508$ mkdir arm-linux
luther@gliethttp:~/mtd-utils-20080508$ cp -r ubi-utils arm-linux/
luther@gliethttp:~/mtd-utils-20080508$ cp -r include arm-linux/
luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/src/libpfiflash.c
将所有EBUF(PFIFLASH_ERRSTR[-rc]);全部替换为EBUF("%s", PFIFLASH_ERRSTR[-rc]);
vim下替换脚本为
:%s/EBUF(PFIFLASH_ERRSTR\[-rc\]);/EBUF("\%s", PFIFLASH_ERRSTR\[-rc\]);/g
luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/src/ubimirror.c
将第206行的
fprintf(stderr, err_buf);
改为
fprintf(stderr, "%s", err_buf); // 想法是好的,因为err_buf中含有%d等format信息,这样接口更加统一,但是编译器似乎还并不支持这样的操作.[luther.gliethttp]
luther@gliethttp:~/mtd-utils-20080508$ vim ubi-utils/src/unubi.c
将第898行
char fname[PATH_MAX];
改为
char fname[PATH_MAX+1];
luther@gliethttp:~/mtd-utils-20080508$ cd ubi-utils/new-utils
因为-O2优化的原因,会导致如下log信息
error: ignoring return value of ‘scanf’, declared with attribute warn_unused_result
所有手工先编译.o
luther@gliethttp:~/mtd-utils-20080508/ubi-utils/new-utils$ gcc -Iinclude -Isrc -I../../include -Wall -Werror -Wall src/ubiformat.c -c -o ubiformat.o
对于交叉编译执行如下1条语句
luther@gliethttp:~/mtd-utils-20080508/ubi-utils/new-utils$ arm-linux-gcc -Iinclude -Isrc -I../../include -Wall -Werror -Wall src/ubiformat.c -c -o ubiformat.o
luther@gliethttp:~/mtd-utils-20080508/ubi-utils/new-utils$ cd -
好了,上面的所有修改完成之后,就可以执行make成功编译了[luther.gliethttp].
luther@gliethttp:~/mtd-utils-20080508$ make
如果是交叉编译,执行
luther@gliethttp:~/mtd-utils-20080508$ make CROSS=arm-linux-
luther@gliethttp:~/mtd-utils-20080508$ make install
对于交叉编译,执行
luther@gliethttp:~/mtd-utils-20080508$ make CROSS=arm-linux- install
luther@gliethttp:~/mtd-utils-20080508$ tree gliethttp/
gliethttp/
|-- sbin
| |-- bin2nand
| |-- doc_loadbios
| |-- docfdisk
| |-- flash_erase
| |-- flash_eraseall
| |-- flash_info
| |-- flash_lock
| |-- flash_otp_mp
| |-- flash_otp_info
| |-- flash_unlock
| |-- flashcp
| |-- ftl_check
| |-- ftl_format
| |-- jffs2mp
| |-- mkbootenv
| |-- mkfs.jffs2
| |-- mkpfi
| |-- mtd_debug
| |-- nand2bin
| |-- nandmp
| |-- nandtest
| |-- nandwrite
| |-- nftl_format
| |-- nftlmp
| |-- pddcustomize
| |-- pfi2bin
| |-- pfiflash
| |-- recv_image
| |-- rfdmp
| |-- rfdformat
| |-- serve_image
| |-- sumtool
| |-- ubiattach
| |-- ubicrc32
| |-- ubicrc32.pl
| |-- ubidetach
| |-- ubigen
| |-- ubimirror
| |-- ubimkvol
| |-- ubinfo
| |-- ubinize
| |-- ubirmvol
| |-- ubiupdatevol
| `-- unubi
`-- share
`-- man
`-- man1
`-- mkfs.jffs2.1.gz
4 directories, 45 files
ep9312开发板上没有任何文件系统flash数据读取
# ./mtd_debug read /dev/mtd0 0 100 gliethttp.bin
Copied 100 bytes from address 0x00000000 in flash to gliethttp.bin
# hexmp gliethttp.bin
0000000 03ff ea00 350c e59f 001c e583 410e e3a0
0000010 4004 e583 4a03 e3a0 4001 e254 fffd 1aff
0000020 4106 e3a0 4004 e583 420f e202 5000 e594
0000030 4001 e084 5000 e594 4001 e084 5000 e594
0000040 4001 e084 5000 e594 4010 e3a0 4008 e583
0000050 4050 e3a0 4001 e254 fffd 1aff 4e1e e3a0
0000060 4008 e583
0000064
#
# ./mtd_debug read /dev/mtd2 0 100 gliethttp.bin;hexmp gliethttp.bin -Cv
Copied 100 bytes from address 0x00000000 in flash to gliethttp.bin
00000000 1f 8b 08 00 ca 14 7d 4a 02 03 e4 5a 0f 70 93 e7 |......}J...Z.p..|
00000010 79 7f 3f 49 36 b2 31 41 80 a0 0e 38 cd 57 70 16 |y.?I6.1A...8.Wp.|
00000020 93 18 f3 19 3b 60 12 9a d9 60 08 09 4e 22 c0 a4 |....;`...`..N"..|
00000030 b4 81 ca 42 92 6d 0d 59 d2 49 72 02 2b 4d dd 60 |...B.m.Y.Ir.+M.`|
00000040 72 84 e1 86 03 a7 21 01 8a d2 b2 4b 2e f3 56 76 |r.....!....K..Vv|
00000050 63 b7 34 0b 1d cd b1 1d 6b b3 95 36 dc 95 db d1 |c.4.....k..6....|
00000060 8b 90 d1 ea |....|
00000064
Ⅵ 压缩方法有哪些各有什么优缺点,压缩比是多少呢主要是在linux下代码压缩的rar或zip大部分都是win下
压缩比率很难说,未压缩数据的复杂程度会影响这个比率。
常见压缩算法按压缩比率由大到小排:
paq系 > lzma系 > rar > bzip2 > lz系(gz、zip) > lzo
paq相当费时而且耗内存,有点不值得使用;lzma是目前硬件水平可接受的高压缩比算法(7z就属于此类洐生品);rar没什么好说的,商业算法,我觉得比bzip2费时上还好点;lzo虽然压缩比率不那么历害,但高速、内存需求极少是其亮点,在需要实时压缩、解压的场合非常受欢迎,例如网络通迅、数据库。
linux中最常用tar.gz格式(winrar支持解压)。
命令通常是这样: tar czvf abc.tar.gz name1 name2 ...
解释一下参数czvf
c 建立
v 详细信息
f 输出文件,后面一定跟生成的压缩文件名。
z 用gz压缩
(其它压缩还有:
Z compress压缩,几乎没人用的老旧lz算法
j bzip2压缩
J xz压缩,lzma的改进算法
也可在最后加参数 --lzop 或 --lzip 或 --lzma)
生成tar.gz其实经过两个处理过程的,首先tar将所有文件的信息集合成一个无压缩的tar格式(无需写到磁盘),再用gz压缩算法处理(很像rar的solid选项)。这样的坏处是,如果你只要解压其中一个文件,解压时也要读取压缩文件前面很大部分内容。
Ⅶ linux下调用lzo函数是为什么出现No such file or directory
提示都说了没有那样的文件或者目录了,是不是你那个函数里面调用了什么文件,或者根本没有那个函数。
Ⅷ 在hadoop目录下,通过执行哪一项指令可以执行解压缩命令
需要在linux系统下自行安装lzop命令。在hadoop中使用lzo的压缩算法可以减小数据的大小和数据的磁盘读写时间,在HDFS中存储压缩数据,可以使集群能保存更多的数据,延长集群的使用寿命。Hadoop是一个由Apache基金会所开发的分布式系统基础架构,用户可以在不了解分布式底层细节的情况下,开发分布式程序。
Ⅸ linux lzop 支持目录压缩吗
不行,不过可以配合tar对目录进行打包。
tar c test/ | lzop - > test.tar.lzo
lzop -dc test.tar.lzo | tar x
Ⅹ linux下怎么打开lzo文件查看文件内容
lzo 是压缩文件。
一般 Linux 下面的压缩都是流压缩,也就是只能压缩一个文件。这种文件是没办法看内容的,只能直接解压缩。
图形界面双击即可。