V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
billows
V2EX  ›  程序员

开发人员如何“write on MacOS, Run in Linux ”?

  •  1
     
  •   billows · 2018-02-19 20:16:38 +08:00 · 11571 次点击
    这是一个创建于 2467 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1、日常工作习惯了在 MacOS 下使用 VSCODE 做开发,但是产品运行环境是在 CentOS 上,有时候会用 Docker 去做编译,但是有些环境 docker 也胜任不了,就只能搭建虚拟机,开共享文件夹,达到在 macos 上写代码,在虚拟机中去编译运行的效果。。

    2、另外,有时候需要做探索方面的工作,需要装各种各样的环境,如果一直在 macos 上做,也容易导致 macos 越来越臃肿,我想到的办法也是弄虚拟机,虚拟机有快照,弄完了恢复就行。但是装的虚拟机的桌面在 mbpr 上的显示效果都好渣啊。。

    3、以上,有时候会觉得自己是被 macos 的给毒害了,😓。。。。

    除此之外,还有什么其他方法吗?求大佬指教。

    49 条回复    2018-02-26 21:36:11 +08:00
    whileFalse
        1
    whileFalse  
       2018-02-19 20:18:30 +08:00   ❤️ 4
    你用的啥语言,和 OS 相关度很大吗,或者有很多系统调用?
    zhangxiao
        2
    zhangxiao  
       2018-02-19 20:21:19 +08:00
    举几个 Docker 不够用的例子?
    HuHui
        3
    HuHui  
       2018-02-19 20:21:31 +08:00 via Android
    试试 vagrant
    billows
        4
    billows  
    OP
       2018-02-19 20:22:57 +08:00
    @whileFalse 语言和 OS 的相关度不大,但有些阶段会有相关技术只在特定系统下有效的,就可以理解成和 OS 相关度很大了。
    eurokingbai2
        5
    eurokingbai2  
       2018-02-19 20:23:29 +08:00
    sshfs
    Philippa
        6
    Philippa  
       2018-02-19 20:25:30 +08:00 via Android
    编译成机器码以 Go 和 Rust 为例都很方便, Python 等 Docker 全部解决。隔离环境是进阶开发必备习惯。楼主趁机还要推动一下公司变化, 用 Docker 集群随便加机器容器并发隔离环境很好用的。
    hujianxin
        7
    hujianxin  
       2018-02-19 20:25:48 +08:00
    docker 什么情况不能胜任呢? docker 既可以作为开发环境,也可以作为生产环境,妥妥的替代虚拟机呀
    billows
        8
    billows  
    OP
       2018-02-19 20:26:16 +08:00
    @zhangxiao libvrit 算是吧。 另外,docker 毕竟不是我最终的产品环境呀


    @HuHui 有初步了解过这个,但是不是特别熟,据我所知 vagrant 是对 vbox、VM 等做了封装,撇开可复用性不谈,就我这里侧重的点而言,和我提到的解决方案有什么优势吗?
    qq292382270
        9
    qq292382270  
       2018-02-19 20:26:19 +08:00
    或许你需要再买一台机器..
    sutra
        10
    sutra  
       2018-02-19 20:26:36 +08:00
    主要区别就是 BSD-Style 的命令行参数和 GNU-Style 的命令行参数吧。
    neoblackcap
        11
    neoblackcap  
       2018-02-19 20:26:57 +08:00   ❤️ 2
    首先你要对系统有了解,不要去调用平台相关的 API。如果你对性能要求不是特别高,请优先使用跨平台的库。第三你应该将你代码分成平台相关与平台无关的,平台无关的代码写成一个动态库。先对其进行测试,之后再编写对应的平台相关代码,最后进行集成。具体做法你可以查看 UNP。里面的代码是在 FreeBSD 上面跑的,但是代码是在 OS X 上写的
    billows
        12
    billows  
    OP
       2018-02-19 20:34:41 +08:00
    @neoblackcap 我不是经常要这么弄,就是最近刚好要使用 libvrit 相关的东西,牵涉到 KVM、QEMU 等。现在想写点测试代码,就出现这些情况了。


    @Philippa 恩,就是 GO 语言。KVM 这个无解啊。


    @hujianxin KVM 相关,比 docker 更底层一些了。。。
    zjsxwc
        13
    zjsxwc  
       2018-02-19 20:39:17 +08:00
    vagrant 楼主没用过?
    WatcherHangzhou
        14
    WatcherHangzhou  
       2018-02-19 20:42:02 +08:00
    vagrant +1
    HuHui
        15
    HuHui  
       2018-02-19 20:42:48 +08:00 via Android
    @billows 我指个方向而已,用不用看你自己需求
    billows
        16
    billows  
    OP
       2018-02-19 20:44:01 +08:00
    @zjsxwc
    @WatcherHangzhou
    @HuHui

    据我所知 vagrant 是对 vbox、VM 等做了封装,撇开可复用性不谈,就我这里侧重的点而言,和我提到的解决方案有什么优势吗?
    linghutf
        17
    linghutf  
       2018-02-19 20:46:14 +08:00
    从来不用 linux 桌面,parallel 开无界面 linux 干活
    zjsxwc
        18
    zjsxwc  
       2018-02-19 20:53:25 +08:00
    @billows

    ```
    据我所知 vagrant 是对 vbox、VM 等做了封装,撇开可复用性不谈,就我这里侧重的点而言,和我提到的解决方案有什么优势吗?
    ```

    你提到的解决方案就是虚拟机里搞啊,和 vagrant 没本质区别,但 vagrant 使用 Vagrantfile 文本更方便管理,一条命令可以搞定的你只用虚拟机里乱七八糟的事情。


    https://www.vagrantup.com/intro/index.html
    ```
    Why Vagrant?
    Vagrant provides easy to configure, reproducible, and portable work environments built on top of industry-standard technology and controlled by a single consistent workflow to help maximize the productivity and flexibility of you and your team.

    To achieve its magic, Vagrant stands on the shoulders of giants. Machines are provisioned on top of VirtualBox, VMware, AWS, or any other provider. Then, industry-standard provisioning tools such as shell scripts, Chef, or Puppet, can automatically install and configure software on the virtual machine.
    ```
    lfzyx
        19
    lfzyx  
       2018-02-19 20:56:54 +08:00
    pathbox
        20
    pathbox  
       2018-02-19 20:57:56 +08:00 via iPhone
    go 可以交叉编译。macOS 也是 unix 内核,我在 mac 下开发 Go 项目没遇到什么问题
    holulu
        21
    holulu  
       2018-02-19 21:04:25 +08:00 via Android
    情况差不多,在 macos 下写,开 linux vm 编译和测试,ssh 连进 vm
    mcfog
        22
    mcfog  
       2018-02-19 21:50:10 +08:00 via Android
    所以你是开发 linux 下的 gui 程序嘛?为什么还给 linux 装桌面呢(摊手
    neoblackcap
        23
    neoblackcap  
       2018-02-19 21:55:31 +08:00
    @billows 你这情况,开源 Virtualbox 或者买 Vmware Fusion。或者向公司申请开发机。没有更好的办法了,OS X 开发 linux 应用程序可以,但是你这个都很有可能是系统编程,抛弃所在的平台而使用 OS X,并不会令你的效率提升,反而很有可能拖累你啊。
    x86vk
        24
    x86vk  
       2018-02-19 22:06:06 +08:00 via Android
    其实楼主实机用 linux+btrfs 就行(
    sagaxu
        25
    sagaxu  
       2018-02-19 22:11:00 +08:00
    我 linux 下开发编译,windows 下运行,Go 不是自带交叉编译吗?
    hujianxin
        26
    hujianxin  
       2018-02-19 22:17:02 +08:00
    其实,我更愿意工作主机用 Linux 台式机、工作站,身边放一台 mac 或者 windows 笔记本来处理别的东西。
    hujianxin
        27
    hujianxin  
       2018-02-19 22:17:18 +08:00
    比如 qq,钉钉,微信,office 等
    littlewey
        28
    littlewey  
       2018-02-19 22:37:12 +08:00 via iPhone
    如果需要 native linux 环境开发 libvirt kvm 相关的话,用 mac 当作终端,在 remote centOS/ubuntu 之类的 server 上搞呢?
    GooMS
        29
    GooMS  
       2018-02-20 00:02:09 +08:00 via Android
    我用 Linux 做开发,搞砸了只需要几分钟重装
    ipwx
        30
    ipwx  
       2018-02-20 00:07:20 +08:00 via iPhone
    写好单元测试,用好连续集成,没了。
    likuku
        31
    likuku  
       2018-02-20 00:46:35 +08:00
    要做 linux 的桌面产品?

    那还是买台对 linux 桌面(显卡)兼容比较好的电脑吧。
    yopming
        32
    yopming  
       2018-02-20 06:13:36 +08:00
    parallel 虚拟机吧
    httplife
        33
    httplife  
       2018-02-20 08:41:48 +08:00
    公司没有测试用的服务器?
    yanyuechuixue
        34
    yanyuechuixue  
       2018-02-20 09:16:44 +08:00 via Android
    用公司的服务器啊,然后用 vscode 里的插件比如 rsync,编辑好会自动同步到远程,直接在那边编译就好啦
    Enochyun
        35
    Enochyun  
       2018-02-20 11:28:09 +08:00
    我是买了一个 centos 的服务器,然后在服务器上安装一个 git,本地克隆这个 git 每次本地写好代码 push 到云端调试,就这样。(公司是使用 svn 做版本控制和发布调试)
    billows
        36
    billows  
    OP
       2018-02-20 12:57:05 +08:00
    @httplife
    @yanyuechuixue
    @Enochyun

    公司资源不太够,自己购买的话,其实还原和快照也没那么方便呀。


    @mcfog
    @hujianxin
    @littlewey

    你们说的方法可能都是在 linux 终端用类似 vim 之类的编辑器写代码。。我问题里有说我还没那个水准。。。



    @zjsxwc
    装好了 vagrant,也在用,是比直接操作 virtualbox 方便,但是现在卡壳了。 用 sync_folder 功能时,提示不认识 vboxfs 文件类型,我知道是 virtualbox 的插件相关问题导致的。但是看文档,vagrant 提供的 box 都是要求安装好插件的呀,难道还得自己手动安装?我用的官方的 centos/7
    ospider
        37
    ospider  
       2018-02-20 16:34:45 +08:00 via Android
    别瞎折腾,linux 的代码就老老实实在开发机上写,非要在本地运行有个卵用,环境不一样都各种问题,更何况系统都不一样
    tairan2006
        38
    tairan2006  
       2018-02-20 18:25:39 +08:00
    不调用原生 API 就没啥问题啊…我好像没遇到过问题
    wizardforcel
        39
    wizardforcel  
       2018-02-20 21:10:22 +08:00
    golang 能有啥问题,又不是 C/C++。
    leslie000666
        40
    leslie000666  
       2018-02-21 10:07:09 +08:00 via Android
    是为了避免因为开发和生产系统,环境导致程序出现问题?
    adadada
        41
    adadada  
       2018-02-21 10:13:35 +08:00
    我是做 KVM 和 QEMU 开发的,也在用 mac,来说说我的经验。我不用 Libvirt,所以情况可能和题主有所不同。根据开发的内容对 KVM 的依赖程度,主要分为三种情况:

    1. 只依赖 QEMU 不依赖 KVM,例如大部分的设备模拟 (virtio ...) 和 QMP 接口。这种情况下基本就是在 mac 上编译和运行 QEMU。当然,因为 QEMU 主要是为 Linux 环境开发的,mac 上的编译环境经常会被 break 掉,所以可能需要开发者在 upstream 修复之前自己去定位和修复。此外,TCG 通常会比较慢,但是在 upstream 逐渐加入 Hypervisor Framework 支持后 (Paolo 的一部分 patch 已经合并到 upstream),可能会有所改观。

    2. 轻度依赖 KVM,例如涉及 MSR 处理和中断处理的地方。这个度不太好定义,还是需要开发者自己把握。这种情况基本上就是要上支持 nested virtualization 的虚拟机了。我目前用的是 VMware Fusion,这个也只能说是勉强能用 (Mac 上的虚拟机对 nested virtualization 的支持普遍不好,更不要提 VirtualBox 这种玩具级别的完全不支持 nested virtualization 的虚拟机了)。代码的话,可以通过 VMware Fusion 的 shared folder 和 VM 共享。

    3. 以上都不适用的情况,例如需要使用 nested virtualization 环境下没有的 KVM 特性,只有物理机上有的特性,或者对性能有需求的场景等。这种情况就只能上物理机了。代码的话可以通过 rsync 同步。
    mritd
        42
    mritd  
       2018-02-21 15:16:34 +08:00 via iPhone
    不行就物理机加 CI 吧
    Mirana
        43
    Mirana  
       2018-02-21 15:40:58 +08:00
    ssh 到虚拟机啊,不要用虚拟机原生的桌面
    gongzhang
        44
    gongzhang  
       2018-02-22 09:23:41 +08:00 via iPhone
    注意大小写 macOS
    billows
        45
    billows  
    OP
       2018-02-22 10:25:50 +08:00
    @gongzhang 谢谢提醒


    @adadada 非常感谢,我在这方面是新手,方便的话能否提供个联系方式,有问题需要请教。


    @Mirana 目前是这样,通过共享文件夹。ssh 到虚拟机去编译运行。
    zhangdawei
        46
    zhangdawei  
       2018-02-22 11:01:58 +08:00
    @hujianxin 能详细介绍下吗
    billows
        47
    billows  
    OP
       2018-02-26 12:36:32 +08:00
    @adadada 咨询下 libvirt 的问题,1、libvirt 可以监控指定 domain 的带宽信息吗?我需要统计一个 domain 指定时段内的流量。 2、libvirt 创建的 domain,可以移植吗?类似于虚拟机的 export 和 import
    adadada
        48
    adadada  
       2018-02-26 20:04:03 +08:00
    @billows #46 我只做到 QEMU 这一层,再往上的东西就不懂了
    billows
        49
    billows  
    OP
       2018-02-26 21:36:11 +08:00
    @adadada libvirt 是对 qemu 等虚拟化软件的封装库,QEMU 能不能监控带宽呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5558 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 03:10 · PVG 11:10 · LAX 19:10 · JFK 22:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.