1. /**********************************************************************************
  2. * raspi-config Expand root partition to fill SD card 原理
  3. * 说明:
  4. * 想知道树莓派是如何完成SD卡扩展的,记录相关文档。
  5. *
  6. * 2017-2-20 深圳 南山平山村 曾剑锋
  7. ********************************************************************************/
  8.  
  9. 一、参考文档:
  10. . Raspbian: how to resize the root partition to fill SD card
  11. https://coderwall.com/p/mhj8jw/raspbian-how-to-resize-the-root-partition-to-fill-sd-card
  12. . raspi-config
  13. https://github.com/asb/raspi-config/blob/master/raspi-config
  14. . Making a bootable .img image file
  15. http://www.orangepi.org/Docs/Makingabootable.html
  16. . Setting up the Linux distribution root file system
  17. http://www.orangepi.org/Docs/SettinguptheLinux.html
  18. . Bootable SD card
  19. http://sunxi.org/Bootable_SD_card#Cleaning
  20.  
  21. 二、raspi-config主要源代码有关SD卡扩展函数分析:
  22.  
  23. do_expand_rootfs() {
  24. # -h : FILE exists and is a symbolic link (same as -L)
  25. if ! [ -h /dev/root ]; then
  26. whiptail --msgbox "/dev/root does not exist or is not a symlink. Don't know how to expand"
  27. return
  28. fi
  29.  
  30. # readlink用来找出符号链接所指向的位置。
  31. ROOT_PART=$(readlink /dev/root)
  32. # 从变量$string的开头, 删除最短匹配$substring的子串
  33. PART_NUM=${ROOT_PART#mmcblk0p}
  34. if [ "$PART_NUM" = "$ROOT_PART" ]; then
  35. whiptail --msgbox "/dev/root is not an SD card. Don't know how to expand"
  36. return
  37. fi
  38.  
  39. # NOTE: the NOOBS partition layout confuses parted. For now, let's only
  40. # agree to work with a sufficiently simple partition layout
  41. if [ "$PART_NUM" -ne ]; then
  42. whiptail --msgbox "Your partition layout is not currently supported by this tool. You are probably using NOOBS, in which case your root filesystem is already expanded anyway."
  43. return
  44. fi
  45.  
  46. # 再次确认分区表和设备节点提取的数值是否一致
  47. #
  48. # shell script:
  49. # root@zengjf:/home/zengjf/hacking# parted /dev/sdb -ms unit s p
  50. # BYT;
  51. # /dev/sdb:1953525168s:scsi:::gpt:ATA ST1000LM035-1RK1:;
  52. # :2048s:943720448s:943718401s:ntfs:Basic data partition:msftdata;
  53. # :943722496s:1953523711s:1009801216s:ntfs:Basic data partition:msftdata;
  54. LAST_PART_NUM=$(parted /dev/mmcblk0 -ms unit s p | tail -n | cut -f -d:)
  55. if [ "$LAST_PART_NUM" != "$PART_NUM" ]; then
  56. whiptail --msgbox "/dev/root is not the last partition. Don't know how to expand"
  57. return
  58. fi
  59.  
  60. # Get the starting offset of the root partition
  61. # 获取文件系统分区起始位置
  62. PART_START=$(parted /dev/mmcblk0 -ms unit s p | grep "^${PART_NUM}" | cut -f -d:)
  63. [ "$PART_START" ] || return
  64. # Return value will likely be error for fdisk as it fails to reload the
  65. # partition table because the root fs is mounted
  66. fdisk /dev/mmcblk0 <<EOF
  67. p
  68. d
  69. $PART_NUM
  70. n
  71. p
  72. $PART_NUM
  73. $PART_START
  74.  
  75. p
  76. w
  77. EOF
  78. ASK_TO_REBOOT=
  79.  
  80. # now set up an init.d script
  81. cat <<\EOF > /etc/init.d/resize2fs_once &&
  82. #!/bin/sh
  83. ### BEGIN INIT INFO
  84. # Provides: resize2fs_once
  85. # Required-Start:
  86. # Required-Stop:
  87. # Default-Start: S
  88. # Default-Stop:
  89. # Short-Description: Resize the root filesystem to fill partition
  90. # Description:
  91. ### END INIT INFO
  92. . /lib/lsb/init-functions
  93. case "$1" in
  94. start)
  95. log_daemon_msg "Starting resize2fs_once" &&
  96. resize2fs /dev/root && # 真正调整大小的地方
  97. rm /etc/init.d/resize2fs_once && # 删除文件,表明该文件只能被运行一次
  98. update-rc.d resize2fs_once remove &&
  99. log_end_msg $?
  100. ;;
  101. *)
  102. echo "Usage: $0 start" >&
  103. exit
  104. ;;
  105. esac
  106. EOF
  107. chmod +x /etc/init.d/resize2fs_once && # 给出下次运行的权限
  108. update-rc.d resize2fs_once defaults && # 默认运行
  109. if [ "$INTERACTIVE" = True ]; then
  110. whiptail --msgbox "Root partition has been resized.\nThe filesystem will be enlarged upon the next reboot"
  111. fi
  112. }
  113.  
  114. 三、获取磁盘编号、起始偏移地址、结束偏移地址、分区格式:
  115. zengjf@zengjf:~/zengjf/mksdImageFile$ sudo parted /dev/sdc -ms unit s p
  116. BYT;
  117. /dev/sdc:3887104s:scsi:::msdos:NORELSYS :;
  118. :2048s:43007s:40960s:fat16::;
  119. :43008s:204799s:161792s:ext4::;
  120.  
  121. 四、resizefs重新调整分区大小:
  122. zengjf@zengjf:/media/zengjf/e09b9d90-3b63-43fa-9b31-485e153c3ccb$ sudo resize2fs /dev/sdc2
  123. resize2fs 1.43. (-Sep-)
  124. /dev/sdc2 上的文件系统已被挂载于 /media/zengjf/e09b9d90-3b63-43fa-9b31-485e153c3ccb;需要进行在线调整大小
  125. old_desc_blocks = , new_desc_blocks =
  126. /dev/sdc2 上的文件系统现在为 个块(每块 1k)。

制作SD卡img文件,并扩容的更多相关文章

  1. ZYNQ的Linux Linaro系统镜像制作SD卡启动

    ZYNQ的Linux Linaro系统镜像制作SD卡启动 0. 概述 ZYNQ生成uboot的时候和正常的ARM设备不太一样,ZYNQ属于二次辅助启动uboot然后由uboot启动内核,大概意思就是 ...

  2. OMAPL138制作SD卡启动介质及重装Linux系统

    OMAPL138制作SD卡启动盘及重装Linux系统 手里的创龙的OMAPL138平台的系统SSH坏掉了,我重新移植了openssh还是不好使,没有办法了只能重装OMAPL138的系统了,按照创龙给的 ...

  3. ZYNQ的Linux Linaro系统镜像制作SD卡启动(仅使用mkfs部分,其他部分待看)

    0. 概述 ZYNQ生成uboot的时候和正常的ARM设备不太一样,ZYNQ属于二次辅助启动uboot然后由uboot启动内核,大概意思就是 ZYNQ内部有一个机制,该机制不可修改,可以通过拨码开关控 ...

  4. Android 读写SD卡的文件

    今天介绍一下Android 读写SD卡的文件,要读写SD卡上的文件,首先需要判断是否存在SD卡,方法: Environment.getExternalStorageState().equals(Env ...

  5. Android SD卡创建文件和文件夹失败

    原文:Android SD卡创建文件和文件夹失败 功能需要,尝试在本地sd卡上创建文件和文件夹的时候,报错,程序崩溃. 一般情况下,是忘记给予sd卡的读写权限.但是这里面权限已经给了,还是报错. 在网 ...

  6. 模拟器下的虚拟sd卡添加文件

    1.若出现mkdir failed for myData Read-only file system,在执行 adb shell 命令后,执行mount -o remount ,rw / (去除文件的 ...

  7. Android--手持PDA读取SD卡中文件

    近两年市场上很多Wince设备都开始转向Android操作系统,最近被迫使用Android开发PDA手持设备.主要功能是扫描登录,拣货,包装,发货几个功能.其中涉及到商品档的时候大概有700左右商品要 ...

  8. Android开发之SD卡上文件操作

    1. 得到存储设备的目录:/SDCARD(一般情况下) SDPATH=Environment.getExternalStorageDirectory()+"/"; 2. 判断SD卡 ...

  9. 简单登录案例(SharedPreferences存储账户信息)&联网请求图片并下载到SD卡(文件外部存储)

    新人刚学习Android两周,写一个随笔算是对两周学习成果的巩固,不足之处欢迎各位建议和完善. 这次写的是一个简单登录案例,大概功能如下: 注册的账户信息用SharedPreferences存储: 登 ...

随机推荐

  1. php单元测试标注(注解)

    @after 用于指明此方法应当在测试用例类中的每个测试方法运行完成之后调用. /** * @before1 */ public function bbb() { $this->assertTr ...

  2. extendgcd模板

    看了数论第一章,终于搞懂了扩展欧几里德,其实就是普通欧几里德的逆推过程. // ax+by = gcd(a,b) ->求解x,y 其中a,b不全为0,可以为负数// 复杂度:O(log2a)vo ...

  3. fiddler 清除证书+重新添加证书

    1. 清除证书 ①任意浏览器,打开Internet属性弹窗,点击内容页签下<证书> ②删除个人页签下,颁发者为DO_NOT_TRUST_Fiddler**的数据 2. 重新认证证书 ①打开 ...

  4. ASP跳出FOR循环

    由于ASP不能使用GOTO语句,我在FOR循环中加入一个FOR循环,若需要跳出,即退出最里面那个FOR循环. DEMO: <%dim aa = 0for i = 1 to 10    for j ...

  5. Django 之ModelForm

    1.Form表单的回顾 Model - 数据库操作 - 验证 class A(MOdel): user = email = pwd = Form - class LoginForm(Form): em ...

  6. OutOfMemoryError: Java heap space和GC overhead limit exceeded在Ant的Build.xml中的通用解决方式

    这个仅仅是一点点经验,总结一下,当中前两个相应第一个Error.后两个相应第二个Error,假设heap space还不够.能够再改大些. <jvmarg value="-Xms512 ...

  7. 类加载(一):static块 和 Class.forName

    1. class Some { static{ System.out.println("1"); } public Some(){ System.out.println(" ...

  8. STM32 HAL库 UART使用printf

    // 添加这个函数 int fputc(int ch,FILE *f) { uint8_t temp[]={ch}; HAL_UART_Transmit(&UartHandle,temp,,) ...

  9. awk 字符串函数

    awk 提供了许多强大的字符串函数,见下表: awk 内置字符串函数 gsub(r,s) 在整个 $0 中用 s 替代 r gsub(r,s,t) 在整个 t 中用 s 替代 r index(s,t) ...

  10. Linux里AWK中split函数的用法

    跟java里的split函数的用法是很相像的,举例如下: The awk function split(s,a,sep) splits a string s into an awk array a u ...