<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soul Of Free Loop &#187; ext4</title>
	<atom:link href="https://zohead.com/archives/tag/ext4/feed/" rel="self" type="application/rss+xml" />
	<link>https://zohead.com</link>
	<description>Uranus Zhou&#039;s Blog</description>
	<lastBuildDate>Sat, 19 Jul 2025 15:42:46 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8</generator>
	<item>
		<title>Linux下USB 3.0移动硬盘读写错误问题分析</title>
		<link>https://zohead.com/archives/linux-usbhdd-err/</link>
		<comments>https://zohead.com/archives/linux-usbhdd-err/#comments</comments>
		<pubDate>Tue, 08 Mar 2016 19:09:23 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[kernel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[barrier]]></category>
		<category><![CDATA[Chromebook]]></category>
		<category><![CDATA[ext4]]></category>
		<category><![CDATA[FUA]]></category>
		<category><![CDATA[JMicron]]></category>
		<category><![CDATA[journal]]></category>
		<category><![CDATA[SCSI]]></category>
		<category><![CDATA[USB]]></category>
		<category><![CDATA[移动硬盘]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1188</guid>
		<description><![CDATA[为了解决 Chromebook 上自带 SSD 空间不足的问题，之前我在淘宝上购入了一个绿帆 F200 USB 3.0 移动硬盘盒，该硬盘盒使用的是 JMicron JMS567 这款使用还比较广泛的 SATA 6.0Gbps to USB 3.0 桥接芯片，准备配上 N 年前的神船笔记本淘汰下来的 2.5 寸硬盘给 Chromebook 使用，这样我就可以在 Chromebook 上安装的 Crouton Ubuntu 系统里无碍的使用各种编译开发环境了。 移动硬盘问题说明 首先我在宏碁 W700 Windows 10 平板上接上此移动硬盘建了一个 NTFS 分区并做各种读写拷贝大文件之类的 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>为了解决 Chromebook 上自带 SSD 空间不足的问题，之前我在淘宝上购入了一个绿帆 F200 USB 3.0 移动硬盘盒，该硬盘盒使用的是 JMicron JMS567 这款使用还比较广泛的 SATA 6.0Gbps to USB 3.0 桥接芯片，准备配上 N 年前的神船笔记本淘汰下来的 2.5 寸硬盘给 Chromebook 使用，这样我就可以在 Chromebook 上安装的 Crouton Ubuntu 系统里无碍的使用各种编译开发环境了。</p>
<h2 id="移动硬盘问题说明">移动硬盘问题说明</h2>
<p>首先我在宏碁 W700 Windows 10 平板上接上此移动硬盘建了一个 NTFS 分区并做各种读写拷贝大文件之类的测试没有任何问题；但是我把移动硬盘换到 Chromebook 上之后发现移动硬盘上新建的 ext4 分区读写会报错，无法做任何拷贝文件操作，先看看 Linux kernel 看到的 USB 3.0 移动硬盘的信息：</p>
<pre class="brush: bash; title: ; notranslate">
[ 9934.612465] usb 2-1: new SuperSpeed USB device number 2 using xhci_hcd
[ 9934.624741] usb 2-1: New USB device found, idVendor=152d, idProduct=0567
[ 9934.624768] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 9934.624787] usb 2-1: Product: lvfan USB3.0 storage
[ 9934.624802] usb 2-1: Manufacturer: JMicron
[ 9934.624817] usb 2-1: SerialNumber: 3224043AA81395
[ 9934.626473] scsi2 : usb-storage 2-1:1.0
[ 9935.627536] scsi 2:0:0:0: Direct-Access     lvfan                     0117 PQ: 0 ANSI: 6
[ 9935.629174] sd 2:0:0:0: [sdb] Spinning up disk...
[ 9936.629940] ...ready
[ 9938.634171] sd 2:0:0:0: [sdb] 312581808 512-byte logical blocks: (160 GB/149 GiB)
[ 9938.634552] sd 2:0:0:0: [sdb] Write Protect is off
[ 9938.634580] sd 2:0:0:0: [sdb] Mode Sense: 47 00 10 08
[ 9938.634955] sd 2:0:0:0: [sdb] Write cache: enabled, read cache: enabled, supports DPO and FUA
[ 9938.659685]  sdb: sdb1 sdb2
[ 9938.661548] sd 2:0:0:0: [sdb] Attached SCSI disk
</pre>
<p>这个是拷贝文件出错时候的内核日志：</p>
<pre class="brush: bash; title: ; notranslate">
[ 9910.412002] EXT4-fs (sdb2): mounted filesystem with ordered data mode. Opts: (null)
[ 9918.500515] sd 2:0:0:0: [sdb] Invalid command failure
[ 9918.500530] sd 2:0:0:0: [sdb]  
[ 9918.500537] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 9918.500547] sd 2:0:0:0: [sdb]  
[ 9918.500554] Sense Key : Illegal Request [current] 
[ 9918.500570] sd 2:0:0:0: [sdb]  
[ 9918.500577] Add. Sense: Invalid field in cdb
[ 9918.500589] sd 2:0:0:0: [sdb] CDB: 
[ 9918.500596] Write(10): 2a 08 04 58 18 30 00 00 08 00
[ 9918.500641] end_request: critical target error, dev sdb, sector 72882224
[ 9918.500654] end_request: critical target error, dev sdb, sector 72882224
[ 9918.500695] Aborting journal on device sdb2-8.
[ 9922.109415] EXT4-fs error (device sdb2): ext4_journal_start_sb:349: Detected aborted journal
[ 9922.109439] EXT4-fs (sdb2): Remounting filesystem read-only
</pre>
<p>看起来是报某个扇区写操作出错，那么我先在 Chromebook 上用 dd 命令直接写对应报错的扇区：</p>
<pre class="brush: bash; title: ; notranslate">
chronos@localhost ~ $ sudo dd if=/dev/zero of=/dev/sdb bs=512 count=10 seek=72882224
10+0 records in
10+0 records out
5120 bytes (5.1 kB) copied, 0.0185829 s, 276 kB/s
</pre>
<p>可以看到写之前报错的扇区其实是没有问题的，而且我使用的 SATA 笔记本硬盘之前经过 mhdd 扫描测试没有发现坏道之类的。</p>
<p>无奈我删掉这个 ext4 分区，重新创建了 ext3 分区并格式化拷贝文件但还是存在类似的错误，最后更换为 ext2 或者 FAT32 文件系统才能正常写入文件，这个就非常奇怪了，接着我把移动硬盘换到 Remix OS PC 版 4.0.9 kernel 下挂载 ext4 读写还是有一样的问题，这样我们就必须要具体分析上面的报错信息了。</p>
<h2 id="读写错误问题分析">读写错误问题分析</h2>
<p>从上面的 kernel 日志中可以看到报错的 SCSI CDB 是：<code>2a 08 04 58 18 30 00 00 08 00</code>，而 0x2A 是 SCSI WRITE 10 命令，参考 SCSI 协议可以知道其命令格式为：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442940/scsi-rw-cmd.jpg" alt="SCSI WRITE 10命令" title="SCSI WRITE 10命令"></p>
<p>我们可以从上图知道 <code>04 58 18 30</code> 是写操作的实际扇区地址（也就是上面报错的 72882224 扇区），<code>08</code> 是写命令的标志位表示这个写命令启用了 <code>FUA</code>。</p>
<p>这里我对 <code>FUA</code>（Force Unit Access）做个简单的介绍：</p>
<ul>
<li>
<p>由于在 Linux 操作系统中从上层到下层多个地方都存在着缓存：page cache（vfs cache）-&gt; HBA/RAID卡自带的 cache -&gt; 磁盘自身的缓存，这样文件系统在写日志等关键的操作时就需要保证写入的数据被真实写到磁盘等物理介质中，而不是存留在各层 cache 里，这样可以防止系统掉电等情况导致数据不一致。</p>
</li>
<li>
<p>Linux kernel 中比较新的文件系统像 ext4、xfs、reiserfs 等则引入了 barrier 特性，遇到带 barrier 标志的写请求（或者 fsync 刷新请求）的时候必须保证之前的所有请求都已经写入到物理介质才能继续。老的 SCSI 或 SAS 磁盘支持通过 <code>SYNCHRONIZE CACHE</code> 命令刷新缓存数据，只不过这样会有额外的影响；新的 kernel 中对于支持 <code>FUA</code> 的设备则是通过发送带 <code>FUA</code> 标志的写请求来实现。</p>
</li>
<li>
<p>SCSI CDB 中的 <code>FUA</code> 标志位如果被置上则表示该请求必须通过访问物理介质实现，如果是带 <code>FUA</code> 的写命令就表示写到物理介质命令才算完成，带 <code>FUA</code> 的读命令则表示直接从物理介质读取绕过缓存。</p>
</li>
</ul>
<p>这样分析下来基本就可以推断出原因了：</p>
<p>由于 ext4、ext3 等文件系统在 kernel 中是默认启用和日志（journal）和 barrier 的，拷贝文件时需要更新文件系统日志，从最上面 kernel 报上来的移动硬盘信息显示是支持 <code>FUA</code> 的，如此日志的写入就是通过发送带 <code>FUA</code> 的写命令实现，然而我的 USB 3.0 移动硬盘响应带 <code>FUA</code> 标志的写命令出现问题导致 ext4、ext3 文件系统变为只读状态无法写入；而 ext2 和 FAT32 文件系统则是完全不带日志的，这样拷贝文件反而就没有问题。</p>
<blockquote>
<p><strong>提示</strong></p>
<p>有关我的移动硬盘使用的 JMicron JMS567 桥接芯片的详细信息请参考 <a href="http://www.jmicron.com/PDF/brief/jms567.pdf">JMicron 技术文档</a>。</p>
</blockquote>
<h2 id="解决方案">解决方案</h2>
<p>如果要顺利使用 ext4 分区，解决方案也有几种，一般的用户建议参考第二种解决方案，下面简单说明下：</p>
<h3 id="禁用-ext4-文件系统日志">禁用 ext4 文件系统日志</h3>
<p>这是比较简单粗暴的解决方案，ext4 文件系统相对 ext3 其中一个改进就是可以手工关闭日志，先卸载已挂载的 ext4 文件系统，然后运行下面的命令：</p>
<pre class="brush: bash; title: ; notranslate">
sudo tune2fs -O ^has_journal /dev/sdb2
</pre>
<p>这样就可以直接关闭 ext4 文件系统默认启用的日志功能，日志被禁用之后基本就类似 ext2 不需要专门发送带 <code>FUA</code> 的写请求了；当然这里我不建议这样做，因为日志功能对于移动硬盘这种热插拔频繁的设备还是相当有用的，可以减少文件出错或丢失的可能。</p>
<h3 id="关闭-ext4-文件系统-barrier">关闭 ext4 文件系统 barrier</h3>
<p>对于不愿意修改或者编译 Linux kernel 的用户这是比较好的解决方案咯，只是关闭 ext4 文件系统 barrier 特性可以保留最有用的日志功能，虽然相比默认启用 barrier 的情况仍然会有一点导致数据不一致的可能，但好处是修改之后就算把移动硬盘接到其它 Linux 机器上基本也能起作用，这样就比较划算了，具体运行下面的命令：</p>
<pre class="brush: bash; title: ; notranslate">
sudo tune2fs -o nobarrier /dev/sdb2
</pre>
<p>然后重新挂载 ext4 分区，一般的 Linux 系统都会在挂载该文件系统时自动禁用 barrier，Chromebook 上自带文件管理器的自动挂载磁盘功能实测有效。</p>
<h3 id="修改-kernel-禁用移动硬盘-fua">修改 kernel 禁用移动硬盘 FUA</h3>
<p>这种解决方案比较适合对编译 kernel 比较熟悉而且相对追求完美（^_^）的用户，不过相对的是需要依赖使用的 Linux 主机 kernel。</p>
<p>由于只禁用 ext4 文件系统的 barrier 还不能完全保证不会有什么别的地方需要用到带 <code>FUA</code> 的读写命令，如果能够修改 kernel 直接让我的这款移动硬盘设备报到系统中时就显示为不支持 <code>FUA</code>，这样就算遇到例如使用 barrier 等场合也可以通过 <code>SYNCHRONIZE CACHE</code> 命令来解决。</p>
<p>Linux kernel USB mass storage 驱动中内置了一个 unusual USB 设备列表，里面包含各种用户已经发现的有问题的 USB 设备及对应处理标志，该列表由 kernel 源代码中的 <code>drivers/usb/storage/unusual_devs.h</code> 文件负责维护。</p>
<p>我们可以先检查下 Chromebook 当前使用的 3.8.11 版本内核和 Remix OS PC 版使用的 4.0.9 版本内核源代码，却都能看到已经有用户报告的我的移动硬盘使用的 JMicron JMS567 芯片的 <code>FUA</code> 问题了：</p>
<pre class="brush: cpp; title: drivers/usb/storage/unusual_devs.h; notranslate">
UNUSUAL_DEV(  0x152d, 0x0567, 0x0114, 0x0114,
		&quot;JMicron&quot;,
		&quot;USB to ATA/ATAPI Bridge&quot;,
		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
		US_FL_BROKEN_FUA ),
</pre>
<p>这个稍微有点奇怪，kernel 碰到带 <code>US_FL_BROKEN_FUA</code> 标志的 USB 设备会自动禁用 <code>FUA</code>，按说报上来的移动硬盘设备应该显示为不支持 <code>FUA</code> 的；不过稍微看下就发现上面的 <code>UNUSUAL_DEV</code> 条目限制了有问题的 USB 设备的 BCD 码固定为 <code>0x0114</code>，我们可以通过 <code>lsusb -v</code> 命令确认下移动硬盘设备的详细 USB 信息：</p>
<pre class="brush: bash; title: ; notranslate">
Bus 002 Device 004: ID 152d:0567 JMicron Technology Corp. / JMicron USA Technology Corp. 
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               3.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         9
  idVendor           0x152d JMicron Technology Corp. / JMicron USA Technology Corp.
  idProduct          0x0567 
  bcdDevice            1.17
</pre>
<p>可以看到移动硬盘的 USB 设备 BCD 码是 1.17 也就是 <code>0x0117</code>，这样 kernel 就不会认为我这款绿帆移动硬盘是有问题的 USB 设备进而做特殊处理了。</p>
<p>同样我们可以看看最新的 Linux 4.5-rc7 版本 kernel 中异常 USB 设备列表中的 JMS567 条目：</p>
<pre class="brush: cpp; title: drivers/usb/storage/unusual_devs.h; notranslate">
UNUSUAL_DEV(  0x152d, 0x0567, 0x0114, 0x0116,
		&quot;JMicron&quot;,
		&quot;USB to ATA/ATAPI Bridge&quot;,
		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
		US_FL_BROKEN_FUA ),
</pre>
<p>稍微有点无奈最新的 Linux kernel 中的 BCD 码范围是从 0x0114 到 0x0116，还是不包含我这款移动硬盘。</p>
<p>解决步骤也就比较简单了，检出对应的内核源代码，修改 <code>drivers/usb/storage/unusual_devs.h</code> 文件可以把 JMS567 USB 设备的 BCD 码范围改为 0x0114 到 0x0117，也可以彻底点直接改成 0x0000 到 0x9999。</p>
<p>unusual_devs.h 文件修改完成后替换 usb-storage 模块并重新启动，顺利的话就可以看到报上来的 SCSI 磁盘设备显示为：</p>
<pre class="brush: bash; title: ; notranslate">
[ 7205.597952] sd 2:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
</pre>
<blockquote>
<p><strong>提示</strong></p>
<p>由于 Chromebook 和 Remix OS 中的 usb-storage 驱动都是直接集成在 kernel 中的，无法只编译 usb-storage 模块进行简单替换，因此需要完整编译出 kernel bzImage 直接替换。</p>
</blockquote>
<p><br/>
<p>这样 ext4 文件系统的日志还有 barrier 特性就能愉快的继续使用了，祝各位玩的开心～～～。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/linux-usbhdd-err/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chromebook使用ext4 U盘运行Remix OS</title>
		<link>https://zohead.com/archives/cb-ext4-remixos/</link>
		<comments>https://zohead.com/archives/cb-ext4-remixos/#comments</comments>
		<pubDate>Sun, 14 Feb 2016 18:55:23 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[Chromebook]]></category>
		<category><![CDATA[ext4]]></category>
		<category><![CDATA[EXTLINUX]]></category>
		<category><![CDATA[Grub]]></category>
		<category><![CDATA[Remix OS]]></category>
		<category><![CDATA[U盘]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[桌面]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1167</guid>
		<description><![CDATA[之前在 Dell Chromebook 11 上体验 Remix OS PC 版的时候是直接使用的普通 USB 3.0 U 盘安装官方放出的 Windows 可执行安装版，在 Chromebook 使用 legacy 模式启动（刷了 RW_LEGACY 模式的修改版 BIOS）运行倒是还比较顺利，只是 Remix OS PC 版 U 盘默认 FAT32 分区格式限制了 Android 的用户空间（data 分区）也最多只有 4GB，这样用起来还是挺不爽的。 搜索之后发现 Remix 论坛里已经有直接的硬盘安装方法可以解决 4GB 用户空间限制的问题，但是我的 Chromebook 就只有 16 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>之前在 Dell Chromebook 11 上体验 Remix OS PC 版的时候是直接使用的普通 USB 3.0 U 盘安装官方放出的 Windows 可执行安装版，在 Chromebook 使用 legacy 模式启动（刷了 RW_LEGACY 模式的修改版 BIOS）运行倒是还比较顺利，只是 Remix OS PC 版 U 盘默认 FAT32 分区格式限制了 Android 的用户空间（data 分区）也最多只有 4GB，这样用起来还是挺不爽的。</p>
<p>搜索之后发现 Remix 论坛里已经有直接的硬盘安装方法可以解决 4GB 用户空间限制的问题，但是我的 Chromebook 就只有 16GB 的空间，同时又安装了 crouton 系统，本来就捉襟见肘的空间再给 Remix OS 分一个区就不太现实了，最主要 Chromebook 原生的 Chrome OS 我是必须要保留的，而且 U 盘格式的 Android x86 也比较符合我的需求，因此想到用 Remix OS PC 版里自带的 Android x86 安装器将 Remix OS 安装到 ext4 格式的 U 盘里。</p>
<blockquote>
<p><strong>提示</strong> <br />
  本文中介绍的安装及启动、升级方法不只是适用于 Chromebook 电脑，也同样适用于普通 Windows PC 机； <br />
  另外这篇文章并不是面向初学者的安装教程之类的，需要你对 Linux 有一定的了解。</p>
</blockquote>
<p>下面介绍一下安装方法以及后续升级的步骤：</p>
<h2 id="准备步骤">准备步骤</h2>
<ul>
<li>一个 8GB 以上的 U 盘，最好是 USB 3.0 的；</li>
<li>下载好的 Remix OS PC 版最新<a href="http://www.jide.com/remixos-for-pc">安装映像</a>；</li>
<li>VMware / VirtualBox / QEMU 等支持 USB 模拟的虚拟机软件。</li>
</ul>
<h2 id="vmware-安装-remix-os-步骤">VMware 安装 Remix OS 步骤</h2>
<p>这里以 VMware Workstation 虚拟机软件为例子介绍如何在 Windows 上将 Remix OS PC 版映像以 ext4 文件系统格式安装到普通 U 盘上，其它的虚拟机软件或者操作系统下步骤也是类似的（直接使用 Chromebook 安装 VirtualBox 也是可以完成的哦）。</p>
<ol>
<li>解压缩下载到的 Remix OS PC 版安装映像（一般为 zip 文件），会得到一个比较大的 iso 文件；</li>
<li>创建新虚拟机，记得启用 USB 控制器支持（默认就会启用），然后添加虚拟光驱并使用解压缩出来的 iso 文件，另外不用添加任何虚拟硬盘；</li>
<li>启动虚拟机，正常的话会看到 Android x86 安装画面，这里选择默认的 <code>Resident mode</code> 并按 Tab 键会出现输入参数的界面，在原有的参数后面增加 <code>INSTALL=1</code>，如下图所示：
</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442937/remixos-install.png" alt="Android x86 启动画面" title="Android x86 启动画面"> </p>
</li>
<li>按回车键启动安装程序，稍等就会出现选择安装分区界面：
</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442936/remixos-detectdev.png" alt="选择安装分区" title="选择安装分区"> </p>
</li>
<li>对于 VMware 虚拟机这时候需要将焦点切换到虚拟机中并插上 U 盘，一切正常的话稍等片刻就可以在虚拟机状态栏上看到新插上的 USB 设备：
</p>
<blockquote>
<p><strong>说明</strong> <br />
  对于 VirtualBox 这样可以直接在虚拟机设置中添加 USB 设备的虚拟机软件会在虚拟机启动时自动尝试加载 USB 设备就不需要专门做这步了； <br />
  QEMU 也可以直接通过命令行或者配置文件加载 USB 设备； <br />
  VMware 也是可以通过 vmx 配置文件自动加载 USB 设备的，只是配置稍微复杂点这里不做介绍了。</p>
</blockquote>
<p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442962/vmware-usb-dev.jpg" alt="VMware USB 设备" title="VMware USB 设备"> </p>
</li>
<li>找到 U 盘设备之后选择上面的 <code>Detect devices</code> 菜单项查找设备，顺利的话会看到要安装到的设备：
</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442937/remixos-usb-dev.png" alt="安装 U 盘" title="安装 U 盘"> </p>
</li>
<li>上图可以看到 U 盘上还没有任何分区，下面可以选择 <code>Create/Modify partitions</code> 菜单在 U 盘上创建并格式化分区，分区文件系统格式最好为 ext4 格式，另外最好也直接将整个 U 盘的空间都用上：
</p>
<blockquote>
<p><strong>提示</strong> <br />
  如果 U 盘上已经存在分区但不是 ext4 格式的也可以在这里删除并重新创建分区。</p>
</blockquote>
<p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442934/remixos-create-partition.png" alt="创建分区" title="创建分区"> </p>
</li>
<li>分区创建并格式化完成之后退出返回就可以在之前的选择分区界面中看到新创建的分区：
</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442937/remixos-usb-partition.png" alt="使用新分区" title="使用新分区"> </p>
</li>
<li>选择新创建的分区开始安装，顺利的话稍等几分钟应该就可以安装完成，中间会提示是否需要将 system 分区设为可写的，为了调试以及后续 root 方便建议选择 Yes 将 system 分区设备可写模式。 </li>
<li>这样安装之后的 U 盘就可以一般的电脑上启动成功了，而且用户空间（data 分区）和系统空间（system 分区）都是 ext4 格式的，不存在 4GB 的大小限制，同时后续如果换更大的 U 盘也比较好扩容。</li>
</ol>
<p>安装好之后我们可以看看 Remix OS PC 版 U 盘的分区及文件系统结构：</p>
<pre class="brush: bash; title: ; notranslate">
[root@localhost ~]# parted /dev/sdb p
Model: SanDisk Cruzer Glide 3.0 (scsi)
Disk /dev/sdb: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name  标志
 1      1049kB  16.0GB  16.0GB  ext4

[root@localhost ~]# mount -t ext4 /dev/sdb1 /mnt/disk
[root@localhost ~]# ls /mnt/disk/
android-2016-01-23  grub  lost+found
[root@localhost ~]# ls /mnt/disk/android-2016-01-23/
data  initrd.img  kernel  ramdisk.img  system
[root@localhost ~]# ls /mnt/disk/android-2016-01-23/system/
addon  app  bin  build.prop  etc  fonts  framework  lib  lib64  lost+found  media  priv-app  priv-setting  tts  usr  vendor  xbin
[root@localhost ~]# ls /mnt/disk/android-2016-01-23/data/
adb  app-asec  app-private  dalvik-cache  dontpanic  local       media     misc      resource-cache  serialno  user
app  app-lib   bugreports   data          drm        lost+found  mediadrm  property  security        system
[root@localhost ~]# df -h /mnt/disk
文件系统              容量  已用  可用 已用%% 挂载点
/dev/sdb1              15G  1.7G   13G  12% /mnt/disk
</pre>
<p>可以看到 U 盘根目录下就是 android-2016-01-23 这样的目录，里面放的就是 Android kernel、initrd 文件以及实际的 data 及 system 目录，安装完成之后 U 盘实际占用了近 2GB 的空间。</p>
<h2 id="chromebook-u-盘启动问题">Chromebook U 盘启动问题</h2>
<p>下面将安装好的 U 盘在 Dell Chromebook 11 上用 legacy 模式启动时会出现无法正常启动的问题。经过初步研究认为是 Android x86 默认使用的 Trusted Grub 安全引导方式对于刷了 RW_LATENCY 模式 BIOS 的 Chromebook 可能存在不兼容的问题。</p>
<blockquote>
<p>刷了 RW_LATENCY 模式 BIOS 的 Chromebook 进入 legacy 模式的方法是在启动时按 <kbd>Ctrl+L</kbd> 键，并选择启动设备。</p>
</blockquote>
<p>为解决这个问题，我在安装好的 U 盘上尝试安装了 Grub、Grub2 等不同的引导程序发现都不能在 Dell Chromebook 11 上正常启动，最后发现如果改为使用 <a href="http://www.syslinux.org/wiki/index.php/EXTLINUX">EXTLINUX</a> 这个 Syslinux 变种不但能支持 ext4 格式分区引导而且支持在 Chromebook 上以 legacy 方式正常启动 Remix OS U 盘。</p>
<p>EXTLINUX 安装也比较简单，这里直接使用 Chromebook 中的 crouton 系统直接安装到 U 盘，下面的操作都需要使用 root 权限才能完成。</p>
<ul>
<li>首先挂载 U 盘分区，并在分区下创建 extlinux 目录，然后运行命令安装 EXTLINUX 相关文件到对应目录：
</p>
<pre class="brush: bash; title: ; notranslate">
[root@localhost ~]# mkdir -p /mnt/disk/extlinux
[root@localhost ~]# extlinux --install /mnt/disk/extlinux
</pre>
</li>
<li>生成 EXTLINUX 配置文件保存到 <code>extlinux/extlinux.conf</code> 中：
</p>
<pre class="brush: bash; title: ; notranslate">
TIMEOUT 5
DEFAULT Remix_OS_2016-01-23

LABEL Remix_OS_2016-01-23
	KERNEL /android-2016-01-23/kernel
	APPEND quiet root=/dev/ram0 androidboot.hardware=remix_cn_x86_64 androidboot.selinux=permissive DATA= SRC=/android-2016-01-23 initrd=/android-2016-01-23/initrd.img

LABEL Remix_OS_2016-01-23_Debug
	KERNEL /android-2016-01-23/kernel
	APPEND root=/dev/ram0 androidboot.hardware=remix_cn_x86_64 androidboot.selinux=permissive DATA= DEBUG=2 SRC=/android-2016-01-23 initrd=/android-2016-01-23/initrd.img
</pre>
<p>其中实际标题及目录名称请根据需要自行替换； </p>
</li>
<li>安装 EXTLINUX 引导程序到 U 盘：
</p>
<pre class="brush: bash; title: ; notranslate">
[root@localhost ~]# umount /mnt/disk
[root@localhost ~]# cat /usr/lib/extlinux/mbr.bin &gt; /dev/sdb
</pre>
<blockquote>
<p><strong>注意</strong> <br />
  进行此步骤还请特别注意不要搞错了 U 盘设备名，否则可能误安装到你的系统盘之类的哦。</p>
</blockquote>
</li>
</ul>
<p>一般这样修改之后的 U 盘就可以正常在 Chromebook 上以 legacy 模式启动了，这种方式最大的优点就是不影响 Chromebook 原生的 Chrome OS 系统。</p>
<h2 id="remix-os-系统升级">Remix OS 系统升级</h2>
<p>由于 Remix OS PC 版并没有提供直接的在线 OTA 升级方式，但按本文提供的方式安装的 U 盘明显又不能使用官方的 Windows 安装工具进行升级，这里就需要专门介绍一下如何升级新系统了。</p>
<p>其实步骤也算是比较简单的，只需要下载新的映像文件解压缩 iso 里的文件，并使用新的 kernel、ramdisk、initrd 替换到对应目录，然后替换整个 system 目录即可（保留 data 目录就可以保留所有用户数据）。</p>
<p>首先挂载 U 盘分区到指定目录，例如 <code>/mnt/disk</code>，上面已经有具体的命令这里不再说明了。</p>
<p>然后挂载 iso 中的 system 文件，这一步由于 Android x86 system 目录使用的是 squashfs 映像所以略微复杂点：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ sudo mount -t iso9660 -o ro,loop Remix_OS_for_PC_64_B2016020201_CN_Alpha_Legacy.iso /mnt/test
(trusty)zzm@localhost:~/Downloads$ ls /mnt/test/
efi/         initrd.img   install.img  isolinux/    kernel       ramdisk.img  system.sfs   TRANS.TBL
(trusty)zzm@localhost:~/Downloads$ sudo mount -t squashfs -o ro,loop /mnt/test/system.sfs /mnt/image
(trusty)zzm@localhost:~/Downloads$ ls /mnt/image/
system.img
(trusty)zzm@localhost:~/Downloads$ sudo mount -t ext4 -o ro,loop /mnt/image/system.img /mnt/share
(trusty)zzm@localhost:~/Downloads$ ls /mnt/share/
addon  app  bin  build.prop  etc  fonts  framework  lib  lib64  lost+found  media  priv-app  priv-setting  tts  usr  vendor  xbin
</pre>
<p>接着就是将新的 system 目录到 U 盘中（下面的命令开始多了一条删除 U 盘中原来所有 system 文件的操作）：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ sudo rm -rf /mnt/disk/android-2016-01-23/system/*
(trusty)zzm@localhost:~/Downloads$ cp -ra /mnt/share/* /mnt/disk/android-2016-01-23/system/
</pre>
<p>下面是替换 Android kernel、initrd、ramdisk 等文件：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ sudo cp /mnt/test/initrd.img /mnt/test/kernel /mnt/test/ramdisk.img /mnt/disk/android-2016-01-23/
</pre>
<p>最后可以将原来的 Android 目录（例如上面的 android-2016-01-23）也重命名为最新的目录（例如：android-2016-02-02），不过重命名之后千万别忘了把 extlinux.conf 配置文件里的标题和目录名称也改掉哦。</p>
<p>依次卸载上面的一些挂载之后用新的 U 盘启动 Chromebook 就可以看到升级后的效果啦。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/cb-ext4-remixos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
