复制Linux liveUSB导致init.d脚本出错 - 不可能..?


4

请发表您的想法或想出的任何想法。我很想知道别人在想什么。


整体问题


当我安装一个简单的Java应用程序(我写的)通过/etc/init.d/在启动(在后台)运行时,它适用于我明确安装它的liveUSB。当我制作该棒的副本时,它永远不会成功启动。在引导liveUSB副本时,当liveUSB引导进程到达我的脚本时,Java应用程序将始终挂起。我的脚本确实完成了它应该做的事情,甚至每5分钟一次,并将继续运行,直到你关闭机器。

  1. 我的脚本阻止了其他一切
  2. 什么都没有超出我的脚本
  3. 你无法取消我的脚本
  4. 没有GUI
  5. 您可以看到的唯一文本是我的脚本输出的命令行

设置&测试 - 一切顺利 :)


我有一个带有3个分区的Linux liveUSB。加载简单的标准Xubuntu映像。

  • sda1> 2GB存储空间
  • sda2> 2gb系统
  • sda3>剩下的gb for casper

我创建了一个简单的Java应用程序,它在启动时在后台运行。为了达到这个目的,我遵循了以下步骤:

  1. 将java应用程序编译成类
  2. 在/ home / user / folder /中放置类文件
  3. 将我的startup.sh脚本复制到/etc/init.d/
  4. 在/etc/init.d/里面
    • 键入“update-rc.d startup.sh start 20 2 5。stop 20 0 1 6。”
    • 此更新的运行级别成功
  5. 现在我可以重启/重启/关闭任何操作,一切运行完美!

复制 - 这里变得棘手!


在创建此棒的副本时,我按照以下步骤操作:

  1. 装载sda2
    • 将该文件夹中的所有内容复制到/ home / user / Desktop / tmp-system /
  2. 装载sda3
    • 将该文件夹中的所有内容复制到/ home / user / Desktop / tmp-casper /
  3. 进入/ home / user / Desktop / tmp-system /
    • 输入“tar -cvf system.tar”。
  4. 进入/ home / user / Desktop / tmp-casper /
    • 输入“tar -cvf casper.tar”。
  5. 卸除
    • SDA2
    • sda3的
  6. 插入空USB(例如sdb)
    • 设置分区(与您要复制的大小写相同)
    • 解开分区
      • tar -xvf system.tar ...进入sdb2
      • tar -xvf casper.tar ...进入sdb3

测试 - 这里一切都出错了!


  1. 将新创建的liveUSB插入计算机
  2. 从USB启动
  3. 一切都开始好了
  4. 我写的Java应用程序被触发了
    • 启动过程永远挂起
    • 没有cmd提示可用
    • 没有GUI可用
    • 好像线程正在运行(它是!输出可以每5分钟查看一次 - 这正是应该的样子)

解决方案尝试&陷阱


1

我可以挂载复制的liveUSB,编辑startup.sh以不启动我的Java应用程序,它仍然无法启动(就像我怀疑的那样?)。


2

如果我使用“dd if = sda of = sdb”,liveUSB的副本将完全正常工作。然而,这不是可接受的解决方案。如果我要将带有dd的16gb棒复制到64gb棒上,那么将64gb棒变成16gb棒。这也会使更改每个分区中需要更改的值变得更加困难。


3

测试了startup.sh和Java应用程序本身的许多变体。所有这些都产生相同的错误。


4

我用来复制的方法适用于其他形式的应用程序,文件或其他任何形式。


我还想尝试避免使用任何其他库或程序来帮助运行Java应用程序。


6

我还装了sda2& sdb2使用cp将所有内容直接从一个复制到另一个,然后对sda3& sdb3。这会产生相同的错误。


其他要点


  1. sda3分区使用cryptsetup加密
  2. system.tar中有2个文件(将是sdb2,来自sda2),在写入USB后会有一个值发生变化。
    • 这两个值在过去没有引起任何问题,并且每次创建新的liveUSB时都会更改
  3. casper.tar中有1个文件(将是sdb3,来自sda3),在写入USB后会有一个值发生变化。
    • 此值在过去没有引起任何问题,并且每次创建新的liveUSB时都会更改。

校验和测试过程


原始的实时USB映像

工作liveUSB> SDA 空usb> SDB

脚步:

  1. 装载,复制和安装校验和sda2
    • 输入“mount / dev / sda2 / media / sda2”
    • 键入“tar -C / media / sda2 -cvf~ / Desktop / system.tar”。
    • 输入“find.-type f -exec sha1sum {}';' > /tmp/sda2_checksum.txt“
    • 输入“umount / media / sda2”
  2. 装载,复制和安装校验和sda3
    • 输入“mount / dev / sda3 / media / sda3”
    • 输入“tar -C / media / sda3 -cvf~ / Desktop / casper.tar”。
    • 输入“find.-type f -exec sha1sum {}';' > /tmp/sda3_checksum.txt“
    • 输入“umount / media / sda3”
  3. 为sdb创建分区
  4. 装载,写入&校验和sdb2
    • 输入“mount / dev / sdb2 / media / sdb2”
    • 键入“tar -C / media / sdb2 -xvf~ / Desktop / system.tar”
    • 输入“find.-type f -exec sha1sum {}';' > /tmp/sdb2_checksum.txt“
    • 输入“umount / media / sdb2”
  5. 装载,写入&校验和sdb3
    • 输入“mount / dev / sdb3 / media / sdb3”
    • 输入“tar -C / media / sdb3 -xvf~ / Desktop / casper.tar”
    • 输入“find.-type f -exec sha1sum {}';' > /tmp/sdb3_checksum.txt“
    • 输入“umount / media / sdb3”
  6. 比较校验和
    • sort /tmp/sda2_checksum.txt -o /tmp/sda2_checksum.txt.sort
    • sort /tmp/sda3_checksum.txt -o /tmp/sda3_checksum.txt.sort
    • sort /tmp/sdb2_checksum.txt -o /tmp/sdb2_checksum.txt.sort
    • sort /tmp/sdb3_checksum.txt -o /tmp/sdb3_checksum.txt.sort
  7. 结果

sda2& sdb2

输入“diff sda2_checksum.txt.sort sdb2_checksum.txt.sort”

45d44
< 2ddf9802c9c15ac6e4575cc9de32e3530eae6b7d  ./efi/boot/grub.cfg
82d80
< 59bb2775a8e7e499e0590b7b8c2492eb250fb7d8  ./syslinux/txt.cfg
154a153
> ae6c127713e01fc5fb4a2e4e28f6bbddc6bd6af5  ./efi/boot/grub.cfg
158a158
> b78090b66b4e3fa04ca9d466ee78c9060adf744e  ./syslinux/txt.cfg

这两个文件包含每个被更改的值。其他一切都是一样的。结果正是它们应该是的。

sda3&amp; sdb3

输入“diff sda3_checksum.txt.sort sdb3_checksum.txt.sort”

相同 - 请记住这是原始的liveUSB图像。

我将在下一节中介绍进一步的比较结果。



下一步 - 又名行动计划

从liveUSB映像开始,不需要运行脚本。


步骤1 - 成功/失败?

成功 - 校验和匹配


  1. 将liveUSB上的java从6更新为7
  2. 重新创建tar
  3. 从tar创建新的liveUSB
  4. 测试liveUSB

第2步 - 成功/失败?

成功 - 校验和匹配


  1. 创建/ home / user / folder /
  2. 将java应用程序的类文件复制到/ home / user / folder /
  3. 重新创建tar
  4. 从tar创建新的liveUSB
  5. 测试liveUSB

第3步 - 成功/失败?

成功 - 校验和匹配


  1. 将startup.sh添加到/etc/init.d/
  2. 不调用update-rc.d
  3. 重新创建tar
  4. 从tar创建新的liveUSB
  5. 测试liveUSB

第4步 - 成功/失败?

成功 - 校验和匹配

(我以前从未成功实现过这一点) - 但是需要编写的值尚未插入到casper(sda3)分区中。


  1. 输入“update-rc.d startup.sh start 21 2 5”。
  2. 重新创建tar
  3. 从tar创建新的liveUSB
  4. 测试liveUSB

第5步 - 成功/失败?

成功 - 校验和匹配

我不敢相信这有效!这让我想到......(以一种很好的方式说出来)为什么这个世界以前不起作用?

- 巧妙的是版本-13有效。


  1. 引导liveUSB
  2. 在创建tar之前插入要在casper(sda3)中重写的值
    • 从liveUSB运行时
    • 编辑/home/user/folder/config.properties中的配置文件
  3. 关闭liveUSB
  4. 重新创建tar
  5. 从tar创建新的liveUSB
  6. 测试liveUSB


图片完成!!

我还没完成这个!

*写入usb的过程从未改变过。

为什么之前不起作用?

  1. 焦油方法? - 只是稍有变化......
    • 来自“tar -cvf casper.tar”。
    • 要“tar -C / media / sda3 / -cvf~/ Desktop / casper.tar。
    • 这些线条没有完成同样的事情吗?
    • 我将在不久的将来对此进行测试。 - 我怀疑没有区别。
  2. 将程序分解为单独的步骤?
    • 之前:
      • 根据NEXT STEPS - 又名行动计划,我将在制作新图像之前完成所有这些步骤。
    • 后:
      • 完全遵循了下一步 - 即行动计划
    • 这可能是区别吗?
    • 我将在不久的将来对此进行测试。
  3. 可以从casper(sda3)分区中的/ home /目录中删除大(或小)文件会导致某种损坏吗?
    • 我不知道..?
    • 我将在不久的将来对此进行测试。


进一步测试 - 我想要我的答案!

从原始的liveUSB图像开始。

  1. 将liveUSB上的java从6更新为7
  2. 创建/ home / user / folder /
  3. 将java应用程序的类文件复制到/ home / user / folder /
  4. 将startup.sh添加到/etc/init.d/
  5. 输入“update-rc.d startup.sh start 21 2 5”。
  6. 编辑/home/user/folder/config.properties中的配置文件

这一次一步一步。 - 它会起作用吗?


测试1 - 成功/失败?

失败!


  1. 老焦油方法

测试2 - 成功/失败?


  1. 老焦油方法
  2. 删除/ boot /中生成的文件
    • 当写入casper(sda3)分区时,我的脚本创建此文件,仅包含用于验证的id,对启动过程没有影响。

测试3 - 成功/失败?


  1. 新焦油方法

测试4 - 成功/失败?


  1. 新焦油方法
  2. 删除/ boot /中生成的文件
    • 当写入casper(sda3)分区时,我的脚本创建此文件,仅包含用于验证的id,对启动过程没有影响。

结果


我将按此顺序进行测试:

测试1 - &gt;试验3 - &gt;测试4 - &gt;测试2

如果测试1工作......我会跳出窗外!   - 我不知道为什么它现在会起作用,因为我已经多次测试过并且每次都会产生不成功的靴子。   - 也许cp或tar进程以某种方式被破坏了。

什么时候 测试1失败: 如果测试3工作......   - tar方法导致错误。   - 我不明白旧tar方法与新tar方法有什么不对。

TBC ......

Answers:


2

鉴于你对这个问题的描述,我怀疑你描述的东西正在发生。无论如何,试试这个:

# sda2
mount /dev/sda2 /mnt/tmp
tar -C /mnt/tmp -cf ~/Desktop/sda2.tar .
umount /dev/sda2 
# ... repeat for sda3 ...
# do your create partition shenanigans
mount /dev/newsda2 /mnt/tmp
tar -C /mnt/tmp -xpf ~/Desktop/sda2.tar
umount /dev/newsda2
# repeat ...
# test ..

如果这样可行,那么很可能你的/ home被挂载noexec或者是一些fubar'ed文件系统,因为问题是删除了执行位。

如果它不起作用,请编辑启动脚本以提供调试信息,例如mount的输出,syslog的内容等,并在那里寻求帮助。

您还可以为每个文件生成校验和,并将副本与原始文件进行比较:

find . -type f -exec sha1sum {} ';' > /tmp/sda2_checksums.txt

对于每个安装的分区&amp;区分/tmp/*_checksums.txt文件


这对测试非常有用。非常感谢你!我将继续更新我正在进行的进度和校验和比较的输出。再次感谢你。
Mr. H. Dumpty

新的tar方法确实可以解决问题。我仍然想知道为什么我的旧方法会产生这个错误。我已查看/ home文件夹,我找不到任何区别。我将不得不继续寻找并保持每个人的发布。
Mr. H. Dumpty

0

响应解决方案尝试&amp;关于使用dd命令的问题#2:

使用dd命令克隆原始Live USB不会永久转动 将64gb棒装入16gb棒中。只有你不选择它才会这样做 使用dd命令后重新分配64gb棒。你可以调整大小 恢复所有剩余的免费(未分配)空间的分区 在使用dd命令后在64gb棒上。

您可以使用GParted或Parted Magic之一修改分区 分区编辑器可以将任意数量的可用空间从16GB恢复到64GB 使用dd命令后克隆的USB闪存驱动器。

净效果是dd命令不会永久转动64gb 之后使用GParted或Parted Magic粘到16gb的棒上 启动dd命令以回收64gb棒的剩余部分。

使用适用于Linux发行版的Linux Disk Utility程序来验证 分区空间为免费或分配。

您可以从教程“GParted分区软件 - 学习GParted” 完整教程“at: http://www.dedoimedo.com/computers/gparted.html

有关Parted Magic的信息,请访问: https://en.wikipedia.org/wiki/PartedMagic 但根据我的经验,我会推荐GParted,因为Parted Magic是一个完整的工具分发,除非你更喜欢后来的方法,你发现它。

简而言之,您已经发现了解决问题的最简单方法,如果您在帖子末尾计划的测试都没有工作,那么这只是一个调整大小的分区。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.