分类目录归档:Linux

ubuntu18.04运行脚本报错let: not found

gcc@gcc-x64:/mnt$ ./cpu_usage.sh ./cpu_u … 继续阅读

发表在 Linux, Tips | 标签为 , , | 留下评论

ubuntu18.04开机自动挂载swap分区

gcc@gcc-x64:~$ sudo mkswap /dev/sdb1 mks … 继续阅读

发表在 Linux, Tips | 标签为 | 留下评论

给X86的OPENWRT界面添加cpu频率温度显示

某人的autocore已经提供了此功能,但是需要kernel支持才行。 实现方法 … 继续阅读

发表在 Linux, 编译固件 | 标签为 | 留下评论

ubuntu下面tar打包时排除某几个子文件夹的方法

网上很多教程说的都没用。应该这样做才行。 比如目前位于/mnt下面,openwr … 继续阅读

发表在 Linux, 编译固件 | 标签为 | 留下评论

vmware复制虚拟机Ubuntu 18.04无法正常分配IP地址的解决办法

Ubuntu18.04使用NetPlan工具用于配置网络接口,16.04的配置文 … 继续阅读

发表在 Linux | 留下评论

解决ubuntu18.04系统时间跟当前时间不一致的问题

先运行 timedatectl看下本机的时间情况,当然肯定显示是不正常的,和当前 … 继续阅读

发表在 Linux, Tips | 留下评论

运行shell脚本报错bad interpreter:No such file or directory的解决

最近比较郁闷,写了个自动备份的脚本,在Ubuntu minimal下面运行总是报 … 继续阅读

发表在 Linux | 标签为 , , | 留下评论

Curl模仿http浏览器常见命令

1.获得一个页面

curl http://blog.it580.com
就可以获得http://blog.it580.com的首页。

curl -I http://blog.it580.com
就只获得首页的头信息(HEAD)。

2.表单处理

2.1 GET
例子:

 

curl “http://bbs.it580.com/junk.cgi?birthyear=1905&press=OK”
GET方式,我们提交页面的时候,其实看到的也是这样的一个链接。

2.2 POST
例子:

type=text name=”birthyear”>

curl -d “birthyear=1905&press=%20OK%20″ www.hotmail.com/when/junk.cgi
使用参数 -d,“”内的内容,就是表单的输入部分的名称=你想要输入的值(隐藏的参数也是一样),最后记得加上提交按钮的名称=按钮上的名称。

需要注意的是,POST提交文件的时候,方法是不同的.
例如:

 

curl -F upload=@localfilename -F press=OK [URL]
这里使用的是参数 -F ,而不是 -d.需要特别注意.

3.认证

比如某些网站需要使用认证.可以使用如下命令.比如论坛什么的.

curl -u name:password www.secrets.com

4.模拟指定浏览器

有些变态的站点,限制了使用浏览器的类型.一样难不倒curl.

curl -A “Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)” [URL]
这个就是一个模拟,win2k的ie5.0的一个访问.

5.Cookies

大部分网站都使用cookies,来记录浏览中的信息,识别用户等.自然使用curl也是可以做到的.
比如保存cookies.
curl -D head_cookies http://bbs.it580.com
这样将保存bbs.it580.com的cookies到运行命令的目录下,并命名为head_cookies.

保存了自然要下次使用的.如何使用呢?
curl -b head_cookies http://bbs.it580.com

6.使用代理

很多站点限制了访问的ip,或者说投票的时候发现只能一票一投。就要使用到这个了。
curl -x proxy.test.org:80 http://bbs.it580.com
这样就使用proxy.text.org代理,来访问http://bbs.it580.com了。

继续阅读

发表在 Linux | 留下评论

pogoplug V4 bootlog

PEX 0: PCI Express Root Complex Interface
PEX interface detected Link X1
Net:   egiga0 [PRIME]
Hit any key to stop autoboot:  0

Loading from NAND 128MB 3,3V 8-bit, offset 0x200000
   Image Name:   Linux-2.6.31.8
   Created:      2011-09-28  19:09:20 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2080956 Bytes =  2 MB
   Load Address: 00008000
   Entry Point:  00008000
## Booting image at 00800000 …
   Image Name:   Linux-2.6.31.8
   Created:      2011-09-28  19:09:20 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2080956 Bytes =  2 MB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying Checksum … OK
OK

Starting kernel …

Uncompressing Linux……………………………………………………………………………………………………………………. done, booting the kernel.
[    0.000000] Linux version 2.6.31.8 (afenn@kt) (gcc version 4.3.2 (sdk3.3-ct-ng-1.4.1) ) #5 Wed Sep 28 12:09:12 PDT 2011
[    0.000000] CPU: Feroceon 88FR131 [56251311] revision 1 (ARMv5TE), cr=00053977
[    0.000000] CPU: VIVT data cache, VIVT instruction cache
[    0.000000] Machine: Feroceon-KW
[    0.000000] Using UBoot passing parameters structure
[    0.000000] Ignoring unrecognised tag 0x41004345
[    0.000000] Memory policy: ECC disabled, Data cache writeback
[    0.000000] Built 1 zonelists in Zone order, mobility grouping off.  Total pages: 32512
[    0.000000] Kernel command line: console=ttyS0,115200 root=ubi0:rootfs ubi.mtd=4,2048 rootfstype=ubifs
[    0.000000] PID hash table entries: 512 (order: 9, 2048 bytes)
[    0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[    0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[    0.000000] Memory: 128MB = 128MB total
[    0.000000] Memory: 118356KB available (3852K code, 261K data, 124K init, 0K highmem)
[    0.000000] Hierarchical RCU implementation.
[    0.000000] NR_IRQS:128
[    0.000000] Console: colour dummy device 80×30
[    0.000000] Calibrating delay loop… 799.53 BogoMIPS (lpj=3997696)
[    0.230000] Mount-cache hash table entries: 512
[    0.230000] CPU: Testing write buffer coherency: ok
[    0.230000] NET: Registered protocol family 16
[    0.230000] Feroceon L2: Enabling L2
[    0.230000] Feroceon L2: Cache support initialised.
[    0.230000]
[    0.230000] CPU Interface
[    0.230000] ————-
[    0.230000] SDRAM_CS0 ….base 00000000, size 128MB
[    0.230000] SDRAM_CS1 ….disable
[    0.230000] SDRAM_CS2 ….disable
[    0.230000] SDRAM_CS3 ….disable
[    0.230000] PEX0_MEM ….base e0000000, size 128MB
[    0.230000] PEX0_IO ….base f2000000, size   1MB
[    0.230000] PEX1_MEM ….no such
[    0.230000] PEX1_IO ….no such
[    0.230000] INTER_REGS ….base f1000000, size   1MB
[    0.230000] NFLASH_CS ….base fa000000, size   2MB
[    0.230000] SPI_CS ….base f4000000, size  16MB
[    0.230000] BOOT_ROM_CS ….no such
[    0.230000] DEV_BOOTCS ….no such
[    0.230000] CRYPT_ENG ….base f0000000, size   2MB
[    0.230000]
[    0.230000]   Marvell Development Board (LSP Version KW_LSP_5.1.3_patch18)– RD-88F6192A-NAS  Soc: 88F6192 A1 LE
[    0.230000]
[    0.230000]  Detected Tclk 166666667 and SysClk 200000000
[    0.230000] Marvell USB EHCI Host controller #0: c403e740
[    0.730000] PEX0 interface detected Link X1
[    0.740000] pci 0000:00:01.0: PME# supported from D0 D1 D3hot
[    0.740000] pci 0000:00:01.0: PME# disabled
[    0.740000] PCI: bus0: Fast back to back transfers disabled
[    0.740000] mvPexLocalBusNumSet: ERR. Invalid PEX interface 1
[    0.750000] bio: create slab  at 0
[    0.750000] SCSI subsystem initialized
[    0.750000] usbcore: registered new interface driver usbfs
[    0.750000] usbcore: registered new interface driver hub
[    0.750000] usbcore: registered new device driver usb
[    0.750000] NET: Registered protocol family 2
[    0.750000] IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.750000] TCP established hash table entries: 4096 (order: 3, 32768 bytes)
[    0.750000] TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
[    0.750000] TCP: Hash tables configured (established 4096 bind 4096)
[    0.750000] TCP reno registered
[    0.750000] NET: Registered protocol family 1
[    0.750000] cpufreq: Init kirkwood cpufreq driver
[    0.760000] XOR registered 4 channels
[    0.760000] XOR 2nd invalidate WA enabled
[    0.760000] cesadev_init(c000d7fc)
[    0.760000] mvCesaInit: sessions=640, queue=64, pSram=f0000000
[    0.760000] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.770000] msgmni has been set to 231
[    0.770000] alg: No test for cipher_null (cipher_null-generic)
[    0.770000] alg: No test for ecb(cipher_null) (ecb-cipher_null)
[    0.770000] alg: No test for digest_null (digest_null-generic)
[    0.770000] alg: No test for compress_null (compress_null-generic)
[    0.780000] alg: No test for stdrng (krng)
[    0.780000] alg: No test for hmac(digest_null) (hmac(digest_null-generic))
[    0.790000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253)
[    0.790000] io scheduler noop registered
[    0.790000] io scheduler anticipatory registered (default)
[    0.790000] Initializing ths8200_init
[    0.790000] Initializing dove_adi9889_init
[    0.810000] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[    0.810000] serial8250.0: ttyS0 at MMIO 0xf1012000 (irq = 33) is a 16550A
[    0.810000] console [ttyS0] enabled
[    0.820000] Integrated Sata device found
[    0.830000] IRQ 21/mvSata: IRQF_DISABLED is not guaranteed on shared IRQs
[    0.850000] scsi0 : Marvell SCSI to SATA adapter
[    0.860000] scsi1 : Marvell SCSI to SATA adapter
[    0.870000] Loading Marvell Ethernet Driver:
[    0.870000]   o Cached descriptors in DRAM
[    0.880000]   o DRAM SW cache-coherency
[    0.880000]   o 1 Giga ports supported
[    0.880000]   o Single RX Queue support – ETH_DEF_RXQ=0
[    0.890000]   o Single TX Queue support – ETH_DEF_TXQ=0
[    0.890000]   o TCP segmentation offload (TSO) supported
[    0.900000]   o Large Receive offload (LRO) supported
[    0.900000]   o Receive checksum offload supported
[    0.910000]   o Transmit checksum offload supported
[    0.910000]   o Network Fast Processing (Routing) supported – (Disabled)
[    0.920000]   o Driver ERROR statistics enabled
[    0.930000]   o Proc tool API enabled
[    0.930000]   o SKB Reuse supported – (Disabled)
[    0.930000]   o SKB Recycle supported – (Disabled)
[    0.940000]   o Rx descripors: q0=128
[    0.940000]   o Tx descripors: q0=532
[    0.950000]   o Loading network interface(s):
[    0.950000]      o register under mv88fx_eth platform
[    0.960000]      o eth0, ifindex = 2, GbE port = 0
[    0.960000]
[    0.960000] mvFpRuleDb (c45b1000): 1024 entries, 4096 bytes
[    0.970000] Counter=0, opIdx=6, overhead=16
[    0.970000] Counter=1, opIdx=2, overhead=0
[    0.980000] Counter=2, opIdx=1, overhead=18
[    0.980000] Counter=3, opIdx=2, overhead=0
[    0.990000] tun: Universal TUN/TAP device driver, 1.6
[    0.990000] tun: (C) 1999-2004 Max Krasnyansky 
[    1.000000] NAND device: Manufacturer ID: 0xad, Chip ID: 0xf1 (Hynix NAND 128MiB 3,3V 8-bit)
[    1.010000] Scanning device for bad blocks
[    1.060000] Using static partition definition
[    1.060000] Creating 5 MTD partitions on “nand_mtd”:
[    1.070000] 0x000000000000-0x000000200000 : “u-boot”
[    1.070000] 0x000000200000-0x000000500000 : “uImage”
[    1.080000] 0x000000500000-0x000000800000 : “uImage2”
[    1.080000] 0x000000800000-0x000001000000 : “failsafe”
[    1.090000] 0x000001000000-0x000008000000 : “root”
[    1.100000] UBI: attaching mtd4 to ubi0
[    1.100000] UBI: physical eraseblock size:   131072 bytes (128 KiB)
[    1.110000] UBI: logical eraseblock size:    126976 bytes
[    1.110000] UBI: smallest flash I/O unit:    2048
[    1.120000] UBI: sub-page size:              512
[    1.120000] UBI: VID header offset:          2048 (aligned 2048)
[    1.130000] UBI: data offset:                4096
[    1.350000] UBI: attached mtd4 to ubi0
[    1.360000] UBI: MTD device name:            “root”
[    1.360000] UBI: MTD device size:            112 MiB
[    1.360000] UBI: number of good PEBs:        896
[    1.370000] UBI: number of bad PEBs:         0
[    1.370000] UBI: max. allowed volumes:       128
[    1.380000] UBI: wear-leveling threshold:    4096
[    1.380000] UBI: number of internal volumes: 1
[    1.390000] UBI: number of user volumes:     1
[    1.390000] UBI: available PEBs:             0
[    1.400000] UBI: total number of reserved PEBs: 896
[    1.400000] UBI: number of PEBs reserved for bad PEB handling: 8
[    1.410000] UBI: max/mean erase counter: 1/0
[    1.410000] UBI: image sequence number: 0
[    1.420000] ehci_hcd: USB 2.0 ‘Enhanced’ Host Controller (EHCI) Driver
[    1.420000] ehci_marvell ehci_marvell.70059: Marvell Orion EHCI
[    1.430000] ehci_marvell ehci_marvell.70059: new USB bus registered, assigned bus number 1
[    1.440000] UBI: background thread “ubi_bgt0d” started, PID 452
[    1.470000] ehci_marvell ehci_marvell.70059: irq 19, io base 0xf1050100
[    1.490000] ehci_marvell ehci_marvell.70059: USB 2.0 started, EHCI 1.00
[    1.490000] usb usb1: configuration #1 chosen from 1 choice
[    1.500000] hub 1-0:1.0: USB hub found
[    1.500000] hub 1-0:1.0: 1 port detected
[    1.510000] xhci_hcd 0000:00:01.0: xHCI Host Controller
[    1.510000] xhci_hcd 0000:00:01.0: new USB bus registered, assigned bus number 2
[    1.520000] xhci_hcd 0000:00:01.0: irq 9, io mem 0xe0000000
[    1.530000] usb usb2: config 1 interface 0 altsetting 0 endpoint 0x81 has no SuperSpeed companion descriptor
[    1.540000] usb usb2: configuration #1 chosen from 1 choice
[    1.540000] hub 2-0:1.0: USB hub found
[    1.550000] hub 2-0:1.0: 4 ports detected
[    1.550000] Initializing USB Mass Storage driver…
[    1.550000] usbcore: registered new interface driver usb-storage
[    1.560000] USB Mass Storage support registered.
[    1.570000] usbcore: registered new interface driver ums-datafab
[    1.570000] usbcore: registered new interface driver ums-freecom
[    1.580000] usbcore: registered new interface driver ums-jumpshot
[    1.580000] usbcore: registered new interface driver ums-sddr09
[    1.590000] usbcore: registered new interface driver ums-sddr55
[    1.600000] usbcore: registered new interface driver ums-usbat
[    1.600000] mice: PS/2 mouse device common for all mice
[    1.610000] i2c /dev entries driver
[    1.620000] sdhci: Secure Digital Host Controller Interface driver
[    1.620000] sdhci: Copyright(c) Pierre Ossman
[    1.630000] mmc0: mvsdio driver initialized, using GPIO 27 for card detection
[    1.640000] usbcore: registered new interface driver usbhid
[    1.640000] usbhid: v2.6:USB HID core driver
[    1.650000] TCP cubic registered
[    1.650000] NET: Registered protocol family 17
[    1.660000] RPC: Registered udp transport module.
[    1.660000] RPC: Registered tcp transport module.
[    1.670000] drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
[    1.740000] UBIFS: recovery needed
[    1.810000] UBIFS: recovery completed
[    1.820000] UBIFS: mounted UBI device 0, volume 0, name “rootfs”
[    1.820000] UBIFS: file system size:   110850048 bytes (108252 KiB, 105 MiB, 873 LEBs)
[    1.830000] UBIFS: journal size:       9023488 bytes (8812 KiB, 8 MiB, 72 LEBs)
[    1.840000] UBIFS: media format:       w4/r0 (latest is w4/r0)
[    1.840000] UBIFS: default compressor: lzo
[    1.850000] UBIFS: reserved for root:  0 bytes (0 KiB)
[    1.850000] VFS: Mounted root (ubifs filesystem) on device 0:11.
[    1.860000] Freeing init memory: 124K
[    4.230000] eth0: started
udhcpc (v1.16.1) started
HWADDR 00 0x25 0x31 0x04 0x12 0x05
PIP0 18
PIP1 5
cat: can’t open ‘/etc/resolv.conf’: No such file or directory
route: SIOCDELRT: No such process
grep: /etc/resolv.conf: No such file or directory
Sending discover…
Sending discover…
Sending discover…
HWADDR 00 0x25 0x31 0x04 0x12 0x05
PIP0 18
PIP1 5
No lease, forking to background
Loading gpio_keys.ko…
Loading ejectbutton.ko…
[   13.750000] IRQ 93 uses trigger mode 0; requested 3
[   13.760000] input: gpio-keys as /devices/platform/gpio-keys.0/input/input0
[   13.770000] xce_ebtn: Pogoplug series V4 eject button initialized.
[   13.920000] ufsd: module license ‘Commercial product’ taints kernel.
[   13.920000] Disabling lock debugging due to kernel taint
[   13.950000] ufsd: driver (8.6 (U86_S[2012-02-28-18:39:23]), LBD=ON, delalloc, ioctl) loaded at bf00c000
[   13.950000] NTFS support included
[   13.950000] Hfs+/HfsX support included
[   13.950000] For ‘CloudEngines_PogoPlug_2011-08-03’
Loading rt3070sta.ko:        [   14.280000] rtusb init rt2870 —>
[   14.290000] usbcore: registered new interface driver rt2870
Success
Loading xce.ko:              [   14.320000] Cloud Engines XCE Init [Version: 3.9.0.4]
[   14.320000] XCE: CPU MEMORY MAP:
[   14.320000] XCE:   — 0x00001000 – 0xbeffffff (3055 MB)  User Space Mappings
[   14.330000] XCE:   — 0xbf000000 – 0xbfffffff (  16 MB)  Kernel module space
[   14.340000] XCE:   — 0xc0000000 – 0xc7ffffff ( 128 MB)  Kernel direct-mapped ram
[   14.350000] XCE:   — 0xc8800000 – 0xe7ffffff ( 504 MB)  Kernel vmalloc space
[   14.350000] XCE:   — 0xe8000000 – 0xfeffffff ( 367 MB)  Kernel platform space
[   14.360000] XCE: CPU FEATURES:
[   14.360000] XCE:   — I Cache:         enabled
[   14.370000] XCE:   — D Cache:         enabled
[   14.370000] XCE:   — Branch Predict:  disabled
[   14.380000] XCE:   — MMU:             enabled
[   14.380000] XCE:   — Alignment Abort: enabled
[   14.390000] XCE: BLPARAMS:   — Loading properties [c4be3efc].
[   14.400000] XCE: BLPARAMS:   — MTD @ [c45c0c00].
[   14.400000] XCE: BLPARAMS: Locating parameter block…
[   14.410000] XCE: BLPARAMS: reading 2048 bytes @ a0000
[   14.410000] XCE: Loaded Property Size: 2048
[   14.420000] XCE:    – ‘cesvcid’ -> ‘UGZRQL3K3BXDWQ7MVKDECX8MAE’
[   14.420000] XCE:    – ‘ceboardver’ -> ‘PPV4A3’
[   14.430000] XCE:   — ICache Prefetch: enabled
[   14.430000] XCE:   — DCache Prefetch: enabled
[   14.440000] XCE:   — L2 Cache:        enabled
[   14.440000] XCE:   — L2 Prefetch:     disabled
[   14.450000] XCE:   — L2 Writethrough: disabled
[   14.450000] XCE:   — Write Allocate:  disabled
[   14.460000] XCE:   — Streaming:       disabled
[   14.460000] XCE: Current GPIO State:
[   14.460000] XCE:  GPIO L OUT:    0x01f18400
[   14.470000] XCE:  GPIO L OE:     0xfe004800
[   14.470000] XCE:  GPIO L BLINK:  0x00000000
[   14.480000] XCE:  GPIO L POL:    0x28000000
[   14.480000] XCE:  GPIO L IN:     0x11f00000
[   14.480000] XCE:  GPIO H OUT:    0x00000008
[   14.490000] XCE:  GPIO H OE:     0x00000005
[   14.490000] XCE:  GPIO H BLINK:  0x00000000
[   14.500000] XCE:  GPIO H POL:    0x00000000
[   14.500000] XCE:  GPIO H IN:     0x00000008
Success
Starting hbplug:             Success
/ # [   14.590000] XCE: BLPARAMS:   — Loading properties [c4b7becc].
[   14.600000] XCE: BLPARAMS:   — MTD @ [c45c0c00].
[   14.600000] XCE: BLPARAMS: Locating parameter block…
[   14.610000] XCE: BLPARAMS: reading 2048 bytes @ a0000
[   14.620000] XCE: BLPARAMS: reading 2048 bytes @ a0800
[   14.620000] XCE: BLPARAMS: reading 2048 bytes @ a1000
[   14.630000] XCE: BLPARAMS: reading 2048 bytes @ a1800
[   20.000000] XCE: XCE: LED -> DISCONNECTED
继续阅读

发表在 Linux | 留下评论

ramfs,tmpfs, rootfs and initramfs

ramfs是什么



ramfs是一个非常简单的文件系统,它输出Linux的磁盘缓存机制(页缓存和目录缓存)作为一个大小动态的基于内存的文件系统。



通常,所有的文件由Linux被缓存在内存中。页的数据从保持在周围以防再次需要的后备存储(一般被挂载的是块设备文件系统)中读取,并标记为可用(空闲)以防虚拟内存系统(Virtual Memory System)需要这些内存作为别用。类似的,在数据写回后备存储时,数据一写回文件就立即被标记为可用,但周围的缓存被保留着直至VM(虚拟机)重新分配内存。一个类似的机制(目录缓存)极大的加快了对目录的访问。



ramfs并没有后备存储。文件写入ramfs象往常一样,来分配目录和页的缓存,但这里并没有地方可写回它们。这意味着页的数据不再标记为可用,因此当希望回收内存时,内存不能通过VM来释放。



实现ramfs所需的代码总量是极少的,因为所有的工作由现有的Linux缓存结构来完成。实际上,你现正在挂载磁盘缓存作为一个文件系统。据此,ramfs并不是一个可通过菜单配置项来卸载的可选组件,它可节省的空间是微不足道的。



ramfs和ramdisk



旧的”内存磁盘”机制在一个内存空间中创建一个合成块设备并使用它作为一个文件系统的后备存储。这个块设备是固定大小的以至于挂载在它上面的文件系统也是固定大小的。除创建和销毁目录外,使用一个内存磁盘并不需要从假的块设备到页缓存拷贝内存数据(和拷贝更改回退)。另外,它需要一个文件系统驱动 (如,ext2)来格式和解释这些数据。



与ramfs相比较,这些废弃的内存(和内存总线带宽)为CPU造成了不必要的工作并污染了CPU缓存。(这里有个技巧通过使用页表单来避免这个拷贝,但是它们难以理解并且代价反而变的与拷贝一样昂贵。)更为重要的是,由于所有的文件都通过页和目录缓存进行访问,全部的工作ramfs都要执行。内存磁盘是简单且多余的,ramfs在内部更为简单。



另一个理由是:ramdisks是半过时的,它引进的回环设备提供一个更灵活和方便的方式从文件而不是从大块的内存中来创建一个合成块设备。

参见losetup (8) 来获得有关细节。



ramfs和tmpfs



ramfs的一个不利之处是你将保留写回到ramfs的数据直至你填补所有的内存,并且VM不能释放它,因为VM考虑到文件将写回后备存储(而不是交换空间),但是ramfs并不能获得任何的后备存储。据此,只有root(或者一个受信任的用户)可允许回写到一个ramfs挂载中。



一个ramfs派生出tmpfs来添加大小的限制以及回写数据到交换空间的能力。普通用户可以允许回写到tmpfs挂载中。

参见Documentation/filesystems/tmpfs.txt来获得更多信息。



rootfs是什么



rootfs是一个特定的ramfs(或tmpfs,如果那被启用)的实例,它始终存在于2.6的系统。你不能卸载rootfs,这个理由近似于你不能杀死init进程。它小巧且简单的为内核确保某些列表不能为空,而不是拥有特定的代码来检查和处理一个空列表。



大多数的系统挂载另一个文件系统到rootfs并忽略它。一个空白ramfs实例的空间总量占用是极小的。



initramfs是什么



所有的2.6 Linux内核包含了一个gzip压缩过的”cpio”格式存档,当内核启动时它将被提取到rootfs。在提取之后,内核检测rootfs是否包含了一个”init”文件,如果包含就来执行它并设置PID为1。如果找到,这个init进程将负责引导系统的其余内容,包含了要寻找和挂载的真正根设备(若有的话)。如果rootfs在提取cpio存档以后并不包含一个init程序,内核将失败并通过旧的代码来寻找和挂载一个根分区,接着执行一些/sbin /init的变种。



与旧的initrd有以下几点不同:

– 旧的initrd通常是一个独立的文件,而initramfs存档是连接到linux内核映像的。(Linux系统目录-*/usr 在构建时就是为了生成这个存档)



– 旧的initrd文件是一个gzip压缩过的文件系统映像(在一些文件格式,如ext2,需要构建一个驱动到内核),而这个新的initramfs存档是一个gzip压缩过的cpio存档(象tar一样简单,参见cpio(1) and Documentation/early-userspace/buffer-format.txt)。内核的cpio提取代码不仅极少,而且init文本和数据可以在启动过程中被丢弃。



– 程序通过旧的initrd(叫做/initrd,而不是/init)运行一些设定并接着返回内核,而init程序从initramfs并不预计返回内核。(如果/init需要手工关闭并控制它,可以与一个新的根设备一起覆盖挂载 / 并执行另一个init程序。参见switch_root utility的后部分)



– 当切换到另一个根设备,initrd会pivot_root并且接着卸载内存磁盘。但是initramfs是rootfs:你可以不用 pivot_root rootfs和卸载它。而是删除除rootfs之外的所有东西来释放空间(find -xdev / -exec rm ‘{}’ ‘;’),与新的根(cd /newmount; mount –move . /; chroot .)一起覆盖挂载rootfs,附加stdin/stdout/stderr到新的/dev/console并执行新的init。



由于这是一个非常谨慎的进程(以及在你运行它们之前涉及到删除命令),klibc包为你引进了一个帮助程序(utils/run_init.c)来做这些。大部分其他软件包(如,busybox)已命名在此命令”switch_root”中。



提供 initramfs



v2.6 内核构建进程总是创建一个gzip压缩过的cpio格式的initramfs存档并连接它到生成的内核二进制文件。默认的,这些存储是空的(在x86上占用134 bytes)



配置选项CONFIG_INITRAMFS_SOURCE(存在于menuconfig的General Setup选项和usr/Kconfig中)可为initramfs存档使用特定的一个源文件,它自动合并到生成的二进制文件中。这个选项可以指定一个现有的gzip压缩的cpio存档,这个存档可以包含一个目录文件到或者是一个文本文件详述,如下面的示例:



dir /dev 755 0 0

nod /dev/console 644 0 0 c 5 1

nod /dev/loop0 644 0 0 b 7 0

dir /bin 755 1000 1000

slink /bin/sh busybox 777 0 0

file /bin/busybox initramfs/busybox 755 0 0

dir /proc 755 0 0

dir /sys 755 0 0

dir /mnt 755 0 0

file /init initramfs/init.sh 755 0 0



在文件格式之上运行”usr/gen_init_cpio”(在构建内核之后)来获得一个用法文档。



一个高级的配置文件是root访问不需要在新的存档上设置权限或者创建设备节点。(注意示例的那两个”file”期望在linux-2.6.*目录下,在”initramfs”目录中找到名为”init.sh”和”busybox”的文件。参见Documentation/early- userspace/README 以获得更多细节。)



内核并不依赖外部的cpio工具。如果你指定一个目录而不是一个配置文件,内核的构建结构将从那个目录(usr/Makefile 调用

scripts/gen_initramfs_list.sh)创建一个配置文件,并封装该目录来使用配置文件(通过释放它到从 usr/gen_init_cpio.c 创建的 usr/gen_init_cpio)。在内核构建时cpio创建的代码是完全独立的,在内核开启时提取器也是(完全)独立的。



你唯一可能需要为创建或提取你自己的cpio文件以提供给内核构建(而不是一个配置文件或目录)而安装外部的cpio工具。



以下的命令行可提取一个cpio映像(不管是通过以上脚本或是通过内核构建成的)回退到它的组成文件:

cpio -i -d -H newc -F initramfs_data.cpio –no-absolute-filenames



以下的shell脚本可创建一个预制的cpio存档,你可以使用在上述的配置文件中:



#!/bin/sh



# Copyright 2006 Rob Landley <rob@landley.net> and TimeSys Corporation.

# Licensed under GPL version 2



if [ $# -ne 2 ]

then

    echo “usage: mkinitramfs directory imagename.cpio.gz”

    exit 1

fi



if [ -d “$1” ]

then

    echo “creating $2 from $1”

    (cd “$1”; find . | cpio -o -H newc | gzip) > “$2”

else

    echo “First argument must be a directory”

    exit 1

fi



注意:如果你是按照cpio的man页做的,那么它包含的一些不良建议将会破坏你的initramfs存档。它说”生成文件名列表的一个典型方式是使用 find命令,你应该提供-depth选项来搜索”。而在创建initramfs.cpio.gz映像时不要这么做,因为它并不可行。Linux内核的 cpio提取器不会在一个不存在的目录中创建文件,因此目录项必须在文件被提取到该目录之前被提取。以上脚本保证了它们的顺序正确性。



外部initramfs映像



如果内核有启用initrd支持,一个外部的cpio.gz存档也可替换一个2.6 内核的initrd。既然这样,内核将自动检测文件类型(initramfs, 而不是initrd)并在尝试运行/init前,提取外部的cpio存档到rootfs。



initramfs有内存效率的优势(没有内存磁盘块设备),而initrd可单独封装(如果你有非GPL许可协议的代码,而你想从initramfs运行,这还是不错的。不要与GPL许可的二进制的Linux内核混为一谈)。



外部initramfs映像也可以用来补充内核内建的initramfs映像。外部存档文件将覆盖与内建initramfs存档中任意不一致的文件。一些发行商也偏爱定制一个单一内核映像和特定initramfs映像,而不用重编译。



initramfs的内容



一个initramfs存档是一个完整独立的Linux根文件系统。如果你还不能理解共享库、设备和路径,你需要获得一个小的根文件系统来启动和运行,这里有一些参考资料:

http://www.tldp.org/HOWTO/Bootdisk-HOWTO/

http://www.tldp.org/HOWTO/From-PowerUp-To-Bash-Prompt-HOWTO.html

http://www.linuxfromscratch.org/lfs/view/stable/



软件包”klibc”(http://www.kernel.org/pub/linux/libs/klibc)被设计为一个极小的C库来静态连接早期的用户空间代码,以及一些相关的工具。它是BSD授权。



我使用uClibc (http://www.uclibc.org)和busybox (http://www.busybox.net)。这些分别是LGPL和GPL授权。(一个独立的initramfs软件包被计划在busybox 1.3 release。)



从理论上说你可以使用glibc,但是对于小型嵌入式系统象这样使用并适合。(一个”hello world”程序静态连接glibc将近400k。用uClibc的话它是7k。还要注意,glibc dlopens libnss作为名称查找,即使是使用静态连接。)



一个好的开头是获得initramfs来运行一个静态连接的”hello world”程序作为init,并在一个类似qemu(www.qemu.org)的仿真器或用户模式的Linux中测试它,象这样:

cat > hello.c << EOF

#include <stdio.h>

#include <unistd.h>



int main(int argc, char *argv[])

{

    printf(“Hello world!/n”);

    sleep(999999999);

}

EOF

gcc -static hello.c -o init

echo init | cpio -o -H newc | gzip > test.cpio.gz

# Testing external initramfs using the initrd loading mechanism.

qemu -kernel /boot/vmlinuz -initrd test.cpio.gz /dev/zero



当调试一个普通根文件系统时,能够用”init=/bin/sh”来启动将是不错的。与initramfs等价的是”rdinit=/bin/sh”,而且它很有用。



为什么是cpio而不是tar?



这个决定的发布是在2001年12月。讨论浏览在这里:

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1538.html



并且催生了第二件事情(tar与cpio的比较),浏览这里

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1587.html



快速且直接的总结版本(这些是无法替代上述内容的阅读的):

1) cpio是一个标准。它十来岁了(从 AT&T起),并已被广泛应用在Linux上(在RPM中,Red Hat的设备驱动磁盘上)。这里有从1996年起有关它的Linux日志:

http://www.linuxjournal.com/article/1213



它并没有象tar一样流行,因为传统的cpio命令行工具要求使用极可怕的命令行。同时没有其他有关存档格式的方式,并有可选的工具。如:

http://freshmeat.net/projects/afio/



2) cpio存档格式是由内核选择的,它比(许多国家的)任意的tar存档格式都简单且干净(并极容易来创建和解析)。完整的initramfs存档格式说明在buffer-format.txt,创建在usr/gen_init_cpio.c,并提取在init/initramfs.c。所有三个可阅读的文本一起不到26k。



3) GNU项目使用tar标准似乎是与Windows使用zip的标准相关。Linux并不是它们中任一一个,并自由的作出了自己的技术决策。



4) 由于这是一个内核的内部格式,它可以很容易做一些更新。内核提供它自己的工具来创建和提取这个格式。使用现有的标准是可取的,但不是必要的。



5) Al Viro 作出决定(引用: “tar is ugly as hell and not going to be supported on the kernel side”):

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1540.html



解释它的理由:

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1550.html

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1638.html



最重要的是,设计和实现initramfs的代码。



发展的方向



当前(2.6.16), initramfs总被编译进,但并没总被使用。内核做到回退到原来的启动代码只需initramfs中不包含一个/init程序。回退

是原来的代码,以此确保一个平滑的过渡并允许尽早的开启功能逐步移动到”前期用户空间”(即initramfs)。



移动到前期用户空间是必要的,因为寻找和挂载真正的根设备是复杂的。根分区可以跨多个设备。它们可在网络上进行(要求dhcp,设定一个特定MAC地址,登录到一台服务器等)。它们可用在可移动媒体,动态分配主/次号以及要求udev执行清理的持续命名的问题。它们可被压缩、加密、写时拷贝,回环挂载、异常分区等。



这种复杂性(必将包含的策略)是在用户空间的处理的正确性。klibc和busybox/uCli 继续阅读

发表在 Linux | 留下评论