public MemberVM startLocatorVM(int index, int port, VmConfiguration vmConfiguration,
      SerializableFunction<LocatorStarterRule> ruleOperator) {
    final String defaultName = "locator-" + index;
    VM locatorVM = getVM(index, vmConfiguration);
    LocatorStarterRule locatorStarter = new LocatorStarterRule();
    Locator server = locatorVM.invoke("start locator in vm" + index, () -> {
      memberStarter = locatorStarter;
      if (logFile) {
        locatorStarter.withLogFile();
      }
      ruleOperator.apply(locatorStarter);
      locatorStarter.withName(defaultName);
      locatorStarter.withAutoStart();
      if (port != 0) {
        locatorStarter.withPort(port);
      }
      locatorStarter.before();
      return locatorStarter;
    });

    MemberVM memberVM = new MemberVM(server, locatorVM);
    occupiedVMs.put(index, memberVM);
    return memberVM;
  }
In some weird situations you may not want to do local DS cleanup as that lifecyle is deferred
elsewhere - see {@code LocatorCleanupEventListener} and any test that uses {@code
PlainLocatorContextLoader} or {@code LocatorWithSecurityManagerContextLoader}

@param skipLocalDistributedSystemCleanup whether to do local DS cleanup
geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/ClusterStartupRule.java